和風スパゲティのレシピ

日本語でコーディングするExcelVBA

一回だけ曲がるL字矢印コネクタを挿入するマクロ

フローチャートやマニュアルを作っている際、
折れ線矢印(正式名称:カギ線矢印コネクタ)をよく使うのですが、
なぜかこの矢印は2回曲がるやつしか用意されていません。

一回だけ曲がるL字矢印図形


頂点の編集で作れるは作れるんですが、
再度位置調整をすると再び2回折れ曲がりやがります(#^ω^)
どうしても二回折れ曲がりたい矢印


残念ながらこの根本的な解決策はないようなのですが、
以下のようにガイド図形を作って対応することが可能です。
ガイド図形を利用したL字コネクタ


今回はこの「矢印コネクタ+ガイド」3点セットを自動挿入するマクロを紹介します。


実行型の便利マクロですので、
Excel起動時に裏で開かれる「個人用マクロブック」などに搭載して使ってください。

ツールバーやリボンにボタン配置すると便利です。

マクロの仕様

このマクロは「2つのセルを選択して実行」する仕様のマクロです。

第1選択セルを始点、第2選択セルを終点(矢印部分)として、
ガイド図形2つと、その間を接続したコネクタ図形を挿入します。

マクロの実行仕様


挿入されたガイド図形はデフォルトで「オブジェクトを印刷」がOFFなので、
このまま使用しても印刷時には表示されません。


加えて画面上で消したい場合にも備え、
ガイド図形表示をON/OFFするマクロもセットで作成しています。

ガイド図形のON/OFFマクロ


あとはついでに「ガイド図形を一括削除するマクロ」も付けました。
(これはコネクタがもう編集できなくなるのであまり使用しない方がよさそうですが)


3つセットでリボンやツールバーにセットして使っていただければと思います。


余談ですが、自作マクロを登録した際の初期アイコン↓
初期アイコン
これがこんなにマッチするマクロも他にないんじゃないでしょうか笑

ソースコード

' コネクタ図形セット■→■の挿入
Sub 矢印コネクタとコネクタガイド図形のセットを挿入する()

    If Selection.Areas.Count <> 2 Then
        MsgBox "2つのセルをCtrlキーで選択して実行してください。"
        Exit Sub
    End If
    
    Dim Begin基準セル As Range: Set Begin基準セル = Selection.Areas(1).Cells(1)
    Dim End基準セル As Range: Set End基準セル = Selection.Areas(2).Cells(1)
    
    Dim Begin図形 As Shape
    Set Begin図形 = ActiveSheet.Shapes.AddShape _
        (msoShapeRectangle, Begin基準セル.Left, Begin基準セル.Top, 15, 15)
    Begin図形.ShapeStyle = msoShapeStylePreset28
    Begin図形.Name = "コネクタ始点ガイド"
    Begin図形.ControlFormat.PrintObject = False ' ガイドは印刷しない

    Dim End図形 As Shape
    Set End図形 = ActiveSheet.Shapes.AddShape _
        (msoShapeRectangle, End基準セル.Left, End基準セル.Top, 15, 15)
    End図形.ShapeStyle = msoShapeStylePreset28
    End図形.Name = "コネクタ終点ガイド"
    End図形.ControlFormat.PrintObject = False ' ガイドは印刷しない
    
    Dim →図形 As Shape
    Set →図形 = ActiveSheet.Shapes.AddConnector _
        (msoConnectorElbow, 10, 10, 10, 10) ' 数値意味なし
    →図形.Line.EndArrowheadStyle = msoArrowheadTriangle
    
    ' 右下→↓方向への接続
    If Begin基準セル.Row <= End基準セル.Row _
    And Begin基準セル.Column <= End基準セル.Column Then
        →図形.ConnectorFormat.BeginConnect Begin図形, 4
        →図形.ConnectorFormat.EndConnect End図形, 1
    End If

    ' 右上→↑方向への接続
    If Begin基準セル.Row >= End基準セル.Row _
    And Begin基準セル.Column <= End基準セル.Column Then
        →図形.ConnectorFormat.BeginConnect Begin図形, 4
        →図形.ConnectorFormat.EndConnect End図形, 3
    End If

    ' 左下↓←方向への接続
    If Begin基準セル.Row <= End基準セル.Row _
    And Begin基準セル.Column >= End基準セル.Column Then
        →図形.ConnectorFormat.BeginConnect Begin図形, 2
        →図形.ConnectorFormat.EndConnect End図形, 1
    End If

    ' 左上↑←方向への接続
    If Begin基準セル.Row >= End基準セル.Row _
    And Begin基準セル.Column >= End基準セル.Column Then
        →図形.ConnectorFormat.BeginConnect Begin図形, 2
        →図形.ConnectorFormat.EndConnect End図形, 3
    End If

End Sub
' ガイド図形の表示切替
Sub コネクタガイド図形の表示を切り替える()

    ' 現在のON/OFFを取得
    Dim is対象図形が存在 As Boolean
    Dim is現在の表示 As Boolean
    Dim シェイプ As Shape
    For Each シェイプ In ActiveSheet.Shapes
    
        If InStr(シェイプ.Name, "コネクタ始点ガイド") <> 0 _
        Or InStr(シェイプ.Name, "コネクタ終点ガイド") <> 0 Then

            is現在の表示 = シェイプ.Visible
            is対象図形が存在 = True
            Exit For
            
        End If
    
    Next
    
    If is対象図形が存在 = False Then Exit Sub
    
    ' 表示状態を変更
    For Each シェイプ In ActiveSheet.Shapes
    
        If InStr(シェイプ.Name, "コネクタ始点ガイド") <> 0 _
        Or InStr(シェイプ.Name, "コネクタ終点ガイド") <> 0 Then

            シェイプ.Visible = Not is現在の表示
            
        End If
    
    Next

End Sub
' ガイド図形の一括削除
Sub コネクタガイド図形を一括削除する()

    If MsgBox("この機能を実行した場合はガイド図形の復元は出来ません。実行してよろしいですか?", vbYesNo) = vbYes Then
    
        Dim シェイプ As Shape
        For Each シェイプ In ActiveSheet.Shapes
            If InStr(シェイプ.Name, "コネクタ始点ガイド") <> 0 _
            Or InStr(シェイプ.Name, "コネクタ終点ガイド") <> 0 Then
    
                シェイプ.Delete
                
            End If
        Next
        
    End If

End Sub

コードの解説

以下の手順をシンプルに実行しているコードです。

  1. 選択セルから始点と終点を取得
  2. 始点と終点に印刷をOFFにした四角形(ガイド図形)を挿入
  3. 矢印コネクタを挿入
  4. ガイド図形からガイド図形へコネクタを接続

 
割とストレートな処理しかしていませんので、
それぞれのコードのプロパティやメソッドの仕様は割愛します。


ガイド図形の名称を「コネクタ始点/終点ガイド」に統一することで、
もう2つのマクロ「ガイドの表示切替と一括削除」を動かしています。
※ Shapeは同一名称を許します。


ちなみにShapeオブジェクトのコネクタに関するメソッドには、
図形間を最短パスで結ぶRerouteConnectionsという便利なものがあります。


なので一見、コネクタを結ぶコードは

→図形.ConnectorFormat.BeginConnect Begin図形, 1 ' ← 一旦この数字は適当でOK
→図形.ConnectorFormat.EndConnect End図形, 1
→図形.RerouteConnections ' ここで最短経路で再接続

これで一発で済むように見えますが、、、


残念ながらこのメソッドは
二回曲がるコネクタ
今回問題となった現象を見事に再現してきます(#^ω^)


このため実際のコードは4方向で分岐させるしかありませんでした。


本当は8種類ある(例えば右上なら→↑と↑→が2つある)のですが、
個人的によく使う4方向で実装をしました。

別方向を使いたいときは手でつなぎ直すか、
行と列どちらの距離が大きいかで分岐させるなどマクロをカスタムしてください。


おまけですが、矢印コネクタのShape変数名で遊んでみました。

Dim →図形 As Shape

わかりやすいっちゃあわかりやすいですが、
普通に入力しづらいですのでご利用は計画的に。