Elbow Connector だけ選択

当ブログを訪れた方の検索キーワードに、以下が含まれていた。

Elbow Connector だけ選択

折角なので、挑戦してみる。
f:id:Infoment:20190205205022p:plain
まず、コネクタのエルボを、どのように指定するか調べてみる。
取り敢えず、VBEのオブジェクトブラウザで検索する。

f:id:Infoment:20190205205319p:plain


すると、1個だけヒットした。
f:id:Infoment:20190205205356p:plain


1個だけというのが、ありがたい。迷わなくて済む。
こちらを見ると、

Const msoConnectorElbow=2

と書いてある。

f:id:Infoment:20190205205531p:plain

半年前の私なら「2」だから、引数の型をLongで受けとるマクロを作成していたに違いない。しかし最近は少し知恵がついた。こんな感じで受け取ることにしよう。

Sub SelectConnecter(connector_type As Office.MsoConnectorType)

End Sub


さて、Elbow Connector だけ選択したい訳なので、こんな場合はループを用いる。総数が分からないので、For Each を使うことにしよう。こんな感じだ。

Sub SelectConnecter(connector_type As Office.MsoConnectorType)
    Dim Shape As Shape
        For Each Shape In ActiveSheet.Shapes
            ' Elbow Connector だったら選択
        Next
End Sub


「Elbow Connectorだったら」ということで、If文で条件分岐。この時点ではまだ、「引数で受け取ったタイプと同じコネクタだったら」になっている。

Sub SelectConnecter(connector_type As Office.MsoConnectorType)
    Dim Shape As Shape
        For Each Shape In ActiveSheet.Shapes
            If Shape.ConnectorFormat.Type = connector_type Then
                ' Elbow Connector を選択
            End If
        Next
End Sub


選択する際は、直前に選択したコネクタの「選択状況を保持しつつ」、次のコネクタを選ぶ必要がある。方法は簡単で、Select の後ろに False を付せばよい。

Sub SelectConnecter(connector_type As Office.MsoConnectorType)
    Dim Shape As Shape
        For Each Shape In ActiveSheet.Shapes
            If Shape.ConnectorFormat.Type = connector_type Then
                Shape.Select False
            End If
        Next
End Sub


試しに、Elbow Connector を指定して選択させてみる。
引数の型をOffice.MsoConnectorType にしてあるので、指定は直感的に行うことができる。
f:id:Infoment:20190205210657p:plain


↓ こう書くと、さらに親切かもしれない。

Sub test()
    Call SelectConnecter(connector_type:=msoConnectorElbow)
End Sub


結果、Elbow Connector だけ選択することが出来た。
f:id:Infoment:20190205210945p:plain


ちなみにコネクタ以外のオートシェイプが混在する状態では、エラーが発生する。
f:id:Infoment:20190205211037p:plain


この場合は、
「オートシェイプがコネクタの場合に限り」
という条件分岐で対応する。

Sub SelectConnecter(connector_type As Office.MsoConnectorType)
    Dim Shape As Shape
        For Each Shape In ActiveSheet.Shapes
            If Shape.Connector = msoTrue Then
                If Shape.ConnectorFormat.Type = connector_type Then
                    Shape.Select False
                End If
            End If
        Next
End Sub


検索された方が、既に無事解決していますように。

参考まで。