トップ回答者
グループ化した2つの図形をクリックして表示を切り替えたい

質問
-
EXCELでグループ化されたオブジェクトをクリックすると、オートシェイプの○→△→両方非表示→○とサイクリックに表示を切り替えたいと思っています。
オートシェイプの○、△をグループ化して、そのグループにマクロを割り当てて、クリックされたグループの情報を取り出し、グループ内の各オートシェイプの線の表示をコントロールすればいいような気がしたのですが、グループ化したオブジェクトをクリックして要素情報を取り出すと、グループではなく、オートシェイプの情報しか取り出せません。どのようにしたら選択したグループの情報を取り出せるのかがわかりません。
具体的にはActiveSheet.Shapes.Range(Application.Caller).nameでグループ名を取得したいのですが、選択したオートシェイプ名しか取得できず、ActiveSheet.Shapes.Range(Application.Caller).parent.nameでグループ名が取得できるかと思いきや、シート名しか取得できません。
またシート内に複数のグループを配置し、それぞれの表示を切り替えたいので、VBAは固定のオブジェクトではなく、汎用的にできればと思います。
よろしくお願いいたします。
- 編集済み hnJD 2014年4月11日 4:56
回答
-
こんな?
Option Explicit Sub GroupClick()'グループに登録するマクロ Dim shpClicked As Shape 'クリックしたShape Dim shpNew As Shape '次に表示するShape Set shpClicked = ActiveSheet.Shapes(Application.Caller) 'クリックしたShapeを取得する If (Not shpClicked.parentGroup Is Nothing) Then 'Shapeがグループ化されているか Dim parentGroup As Shape Set parentGroup = shpClicked.parentGroup If (parentGroup.GroupItems.Count > 1) Then 'グループに2個以上のShapeがあるか Dim thisIndex As Integer Dim newIndex As Integer Dim i As Integer For i = 1 To parentGroup.GroupItems.Count If parentGroup.GroupItems(i).ID = shpClicked.ID Then thisIndex = i 'クリックしたのは何個目のShapeか End If Next If (thisIndex > 0) Then If (thisIndex = parentGroup.GroupItems.Count) Then newIndex = 1 Else newIndex = thisIndex + 1 End If Set shpNew = parentGroup.GroupItems(newIndex) shpNew.Visible = msoTrue '次のShapeを表示 shpClicked.Visible = msoFalse 'クリックしたShapeを非表示 End If End If End If End Sub
ただし、両方非表示にしてしまうとクリックするものがなくなってしまうので、背景色を同じにした四角を代わりに配置することで代用してください。個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク hnJD 2014年4月11日 5:17
すべての返信
-
こんな?
Option Explicit Sub GroupClick()'グループに登録するマクロ Dim shpClicked As Shape 'クリックしたShape Dim shpNew As Shape '次に表示するShape Set shpClicked = ActiveSheet.Shapes(Application.Caller) 'クリックしたShapeを取得する If (Not shpClicked.parentGroup Is Nothing) Then 'Shapeがグループ化されているか Dim parentGroup As Shape Set parentGroup = shpClicked.parentGroup If (parentGroup.GroupItems.Count > 1) Then 'グループに2個以上のShapeがあるか Dim thisIndex As Integer Dim newIndex As Integer Dim i As Integer For i = 1 To parentGroup.GroupItems.Count If parentGroup.GroupItems(i).ID = shpClicked.ID Then thisIndex = i 'クリックしたのは何個目のShapeか End If Next If (thisIndex > 0) Then If (thisIndex = parentGroup.GroupItems.Count) Then newIndex = 1 Else newIndex = thisIndex + 1 End If Set shpNew = parentGroup.GroupItems(newIndex) shpNew.Visible = msoTrue '次のShapeを表示 shpClicked.Visible = msoFalse 'クリックしたShapeを非表示 End If End If End If End Sub
ただし、両方非表示にしてしまうとクリックするものがなくなってしまうので、背景色を同じにした四角を代わりに配置することで代用してください。個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク hnJD 2014年4月11日 5:17
-
解決したと思っていたのですが、以下の問題が発生しました。
(環境:Windows7SP1 Office2010SP2)教えていただいたマクロをグループオブジェクトに登録し、
うまく動作していたのですが、そのオブジェクトを複写し、
実行すると、「実行エラー1004 指定された値は境界を超えています。」
とのメッセージが出てきて動きませんでした。shpClicked.parentGroupの値をウォッチ式で確認した所、
「指定された値は境界を超えています。」と書かれています。度々で申し訳ありませんが、ご助言いただけると助かります。
よろしくお願いいたします。