Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12262 / 13644 ツリー ←次へ | 前へ→

【11432】テキストボックスをグループ化 カド 04/3/9(火) 10:45 質問
【11434】Re:テキストボックスをグループ化 IROC 04/3/9(火) 11:06 回答
【11435】Re:テキストボックスをグループ化 カド 04/3/9(火) 11:16 質問
【11436】Re:テキストボックスをグループ化 Jカーター 04/3/9(火) 11:19 回答
【11438】Re:テキストボックスをグループ化 カド 04/3/9(火) 11:44 質問
【11439】Re:テキストボックスをグループ化 ichinose 04/3/9(火) 11:54 発言
【11440】Re:テキストボックスをグループ化 カド 04/3/9(火) 12:15 お礼
【11460】Re:テキストボックスをグループ化 ichinose 04/3/9(火) 15:37 発言

【11432】テキストボックスをグループ化
質問  カド E-MAIL  - 04/3/9(火) 10:45 -

引用なし
パスワード
   エクセル VBAにてテキストボックスをグループ化したいのです。

マクロを記録すると、

ActiveSheet.Shapes.Range(Array("Oval 82", "Text Box 83")).Select
Selection.ShapeRange.Group.Select

となります。

"Text Box 83"のように常に名前が固定されているわけではないので、セルのA1からC10にある図形を選択してグループ化するようにしたいのです。

ご存知の方、アドバイス願います。

【11434】Re:テキストボックスをグループ化
回答  IROC  - 04/3/9(火) 11:06 -

引用なし
パスワード
   for each 〜 next で全図形をループで参照させて、
各図形の TopLeftCell プロパティでセル位置を判定させて
処理すれば出来るかもしれません。

【11435】Re:テキストボックスをグループ化
質問  カド E-MAIL  - 04/3/9(火) 11:16 -

引用なし
パスワード
   ▼IROC さん回答ありがとう御座います。

テキストボックス系は不得手なので教えてくさい。

例えば下記のようにすると、"Picture"は消えるのですが、
"テキスト"に変えてもテキストボックスは消えません。

どうすればテキストボックスを消すように(選択出来るように)
出来るのでしょうか?

For Each Obj In ActiveSheet.DrawingObjects
    If InStr(Obj.Name, "Picture") > 0 Then
    
    Obj.Delete
    
    End If
  Next

【11436】Re:テキストボックスをグループ化
回答  Jカーター  - 04/3/9(火) 11:19 -

引用なし
パスワード
   こんにちは。
>テキストボックスをグループ化
の部分だけを見ると
TextBoxesコレクションが使えそうなのですが

>セルのA1からC10にある図形
だとちょっと違った意味になりそうですね。

この位置にある図形がすべてテキストボックスで
他にもテキストボックスがあるなら
TextBoxesコレクションをループして位置(topleftCell)で分岐

他の位置にテキストボックスがないなら
TextBoxesコレクションそのものです。

この位置にある図形がテキストボックスだけとは限らないなら
DrawingObjectsコレクションをループして位置(topleftCell)で分岐

という感じで
いろいろなパターンが考えられますが
真相はどうなんでしょう?

【11438】Re:テキストボックスをグループ化
質問  カド E-MAIL  - 04/3/9(火) 11:44 -

引用なし
パスワード
   ▼Jカーター さん 回答ありがとう御座います。

>この位置にある図形がテキストボックスだけとは限らないなら
>DrawingObjectsコレクションをループして位置(topleftCell)で分岐

>真相はどうなんでしょう?

実際はテキストボックスと楕円です。

ループして位置で分岐は大変そうですね。(今の私には)

テキストボックス等もマクロで作るため、自分で名前を命名して
その名前をキーにして選択してはどうかと思うのですが。

命名の方法を知りません。
このようなことが出来るのであれば、教えてください。

【11439】Re:テキストボックスをグループ化
発言  ichinose  - 04/3/9(火) 11:54 -

引用なし
パスワード
   カド さん、皆さん、こんにちは。

>命名の方法を知りません。
>このようなことが出来るのであれば、教えてください。
皆さんのご意見をコードにしてみました。
Excel2000で確認しました。
'=======================================================
Sub main()
  Dim shpnm()
  shpnm = get_shp_name(Range("a1:c10"))
  If VarType(shpnm) <> vbBoolean Then
   If UBound(shpnm) > 1 Then ActiveSheet.Shapes.Range(shpnm).Group
   End If
End Sub
'=======================================================
Function get_shp_name(rng As Range)
  Dim shp As Shape
  Dim shpnm()
  Dim sht As Worksheet
  Set sht = rng.Parent
  idx = 1
  With rng
   For Each shp In sht.Shapes
    If shp.Top >= .Top And shp.Top + shp.Height <= .Top + .Height _
       And shp.Left >= .Left And shp.Left + shp.Width <= .Left + .Width Then
     ReDim Preserve shpnm(1 To idx)
     shpnm(idx) = shp.Name
     idx = idx + 1
     End If
    Next
   End With
  If idx > 1 Then
   get_shp_name = shpnm()
  Else
   get_shp_name = False
   End If
End Function

上記は、A1:C10の範囲内のShapeオブジォクトをグループ化するコードです。
後は、Typeを調べて特定のShapeオブジェクトのみグループ化するということも
考えられますね!!それは、上記のコードに追加して下さい。

【11440】Re:テキストボックスをグループ化
お礼  カド E-MAIL  - 04/3/9(火) 12:15 -

引用なし
パスワード
   ▼ichinose さん 回答ありがとう御座います。

目的どおりの作動が確認できました。

本件の中でした質問でまだ分からないことが有りますが、
グループ化とは直接関係無いので改めて質問しなおします。

【11460】Re:テキストボックスをグループ化
発言  ichinose  - 04/3/9(火) 15:37 -

引用なし
パスワード
   ▼カド さん:
こんにちは。
>
>目的どおりの作動が確認できました。
>
>本件の中でした質問でまだ分からないことが有りますが、
>グループ化とは直接関係無いので改めて質問しなおします。
解決されたみたいですが、バグがありました。
インターフェースをちょっと変えました。

'==========================================================
Sub main()
  Dim shpnm()
  If get_shp_name(Range("a1:c10"), shpnm()) = True Then
   If UBound(shpnm) > 1 Then ActiveSheet.Shapes.Range(shpnm).Group
   End If
End Sub
'=================================================================
Function get_shp_name(rng As Range, shpnm()) As Boolean
  Dim shp As Shape
  Dim sht As Worksheet
  Set sht = rng.Parent
  idx = 1
  With rng
   For Each shp In sht.Shapes
    If shp.Top >= .Top And shp.Top + shp.Height <= .Top + .Height _
       And shp.Left >= .Left And shp.Left + shp.Width <= .Left + .Width Then
     ReDim Preserve shpnm(1 To idx)
     shpnm(idx) = shp.Name
     idx = idx + 1
     End If
    Next
   End With
  If idx > 1 Then
   get_shp_name = True
  Else
   get_shp_name = False
   End If
End Function

こうして置かないと、セル範囲にShapeがひとつもなかったときにエラーになってしまいました。

12262 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free