none
グループ化した2つの図形をクリックして表示を切り替えたい RRS feed

  • 質問

  • EXCELでグループ化されたオブジェクトをクリックすると、オートシェイプの○→△→両方非表示→○とサイクリックに表示を切り替えたいと思っています。

    オートシェイプの○、△をグループ化して、そのグループにマクロを割り当てて、クリックされたグループの情報を取り出し、グループ内の各オートシェイプの線の表示をコントロールすればいいような気がしたのですが、グループ化したオブジェクトをクリックして要素情報を取り出すと、グループではなく、オートシェイプの情報しか取り出せません。どのようにしたら選択したグループの情報を取り出せるのかがわかりません。 

    具体的にはActiveSheet.Shapes.Range(Application.Caller).nameでグループ名を取得したいのですが、選択したオートシェイプ名しか取得できず、ActiveSheet.Shapes.Range(Application.Caller).parent.nameでグループ名が取得できるかと思いきや、シート名しか取得できません。

    またシート内に複数のグループを配置し、それぞれの表示を切り替えたいので、VBAは固定のオブジェクトではなく、汎用的にできればと思います。

    よろしくお願いいたします。

    • 編集済み hnJD 2014年4月11日 4:56
    2014年4月11日 0:46

回答

  • こんな?

    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
    2014年4月11日 3:54

すべての返信

  • こんな?

    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
    2014年4月11日 3:54
  • 早速のご回答ありがとうございました。
    おかげさまで思い通りの動きをさせることができました。

    parentGroupで取り出すことができたのですね。
    勉強になりました。

    次の機会がありましたら、またよろしくお願いいたします。

    2014年4月11日 5:17
  • 解決したと思っていたのですが、以下の問題が発生しました。
    (環境:Windows7SP1 Office2010SP2)

    教えていただいたマクロをグループオブジェクトに登録し、
    うまく動作していたのですが、そのオブジェクトを複写し、
    実行すると、「実行エラー1004 指定された値は境界を超えています。」
    とのメッセージが出てきて動きませんでした。

    shpClicked.parentGroupの値をウォッチ式で確認した所、
    「指定された値は境界を超えています。」と書かれています。

    度々で申し訳ありませんが、ご助言いただけると助かります。
    よろしくお願いいたします。

    2014年4月14日 8:02
  • EXCEL2007,2013で試しましたが、同様のエラーが出ました。
    EXCELのバグっぽいですね。

    とりあえずの回避策としては、複写した後で一度ファイルを閉じて開きなおすか、一度グループを解除して再度グループ化しなおすことで治りました。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2014年4月14日 9:32
  • 回避策のご提示ありがとうございました。

    おかげさまで思い通りに動作させることができました。

    次の機会がありましたら、またよろしくお願いいたします。

    2014年4月15日 8:04