スピンボタンでコネクタの接続位置を変更する

昨日は、全選択などのボタンを設置して、ユーザーフォームの大体の体裁を整えました。

infoment.hatenablog.com

今日は、コネクタの接続位置変更に挑戦です。

今日やりたいこと

自動で描画したコネクタは、ある程度の法則で以って描画してはいるものの、最適な接続位置とは限りません。
そこで一旦描画したのち、簡単に接続位置を変更できる機能を設けることにしました。
※マウス操作で付け替えたら?という意見は、今回黙殺します。

必要なこと

  1. 専用のユーザーフォームを新規に作成
  2. リストボックスにコネクタ一覧を作成
  3. スピンボタンで、コネクタの位置を一つずつ変更
  4. スピンボタンの変更結果を、実際の接続位置に反映

1.専用のユーザーフォームを新規に作成

コネクタ編集用に、EditConnectorFormを作成します。同フォーム内には、(とりあえず)以下を配置します。

  1. リストボックス
  2. スピンボタン

f:id:Infoment:20180921065010p:plain

【ユーザーフォームのモジュール】

モジュール変数として、以下を準備します。これらは、コネクタの付け替えに用いるもので、昨日までに作成した変数と名前を共通にしてあります。

Dim SC As ShapeClass
Dim start_shape As Shape
Dim StartPosition As Long
Dim end_shape As Shape
Dim EndPosition As Long

2.リストボックスにコネクタ一覧を作成

ユーザーフォームの初期化時に、コネクタの一覧を以下の手順でリストボックスに作成します。

  1. コネクタの名前をコレクションに格納
  2. コレクションを配列に変換
  3. リストボックスのリストとして配列を充てる
【ユーザーフォームのモジュール】
Private Sub UserForm_Initialize()
    ' 一旦全てのオートシェイプ選択を解除
    Range("A1").Select

    Dim Shape As Shape
    Dim col As Collection
    Set col = New Collection
        For Each Shape In ActiveSheet.Shapes
            If Shape.Connector = msoTrue Then
                col.Add Shape.Name
            End If
        Next
    
    Dim SQC As SequenceClass
    Set SQC = New SequenceClass
        ListBox2.List = SQC.ToArray(col)
        
End Sub

コレクションの配列化用に、クラスモジュールを作成しました。

【クラスモジュール】(SequeneClass)
'[用 途]
'   コレクションを一次元配列に変換する
'[引 数]
'   col as Collection   元データ
'[戻り値]
'   一次元配列
Public Function ToArray(col As Collection) As Variant
    Dim seq As Variant
    ReDim seq(col.Count - 1)
    Dim i As Long
    For i = 1 To col.Count
        seq(i - 1) = col.Item(i)
    Next    
    ToArray = seq
End Function

スピンボタンで、コネクタの位置を一つずつ変更

リストボックスで選択したコネクタから、以下の情報を取得します。

  1. コネクタが接続されているオートシェイプ(始端と終端)
  2. 接続先の位置(始端と終端)

これらは全て、ConnectorFormatで取得可能です。

【ユーザーフォームのモジュール】
Private Sub ListBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim ConnectorName As String
        ConnectorName = ListBox2.List(ListBox2.ListIndex)    
    Set SC = New ShapeClass
    Set SC.myShape = ActiveSheet.Shapes(ConnectorName)
        SC.myShape.Select
    Set start_shape = SC.myShape.ConnectorFormat.BeginConnectedShape
        StartPosition = SC.myShape.ConnectorFormat.BeginConnectionSite
    Set end_shape = SC.myShape.ConnectorFormat.EndConnectedShape
        EndPosition = SC.myShape.ConnectorFormat.EndConnectionSite
End Sub

なお、選んだコネクタをシート上で選択させているのは、何が選択されたかを見える化するためです。

一旦取得した値、今回はStartPositionを、スピンボタンで一つずつ変化させます。
【上を押したとき】

Private Sub StartSpinButton_SpinUp()
    StartPosition = StartPosition Mod 4 + 1
End Sub

【下を押したとき】

Private Sub StartSpinButton_SpinDown()
    Select Case StartPosition
        Case 1
            StartPosition = 4
        Case Else
            StartPosition = StartPosition - 1
    End Select
End Sub

3.スピンボタンの変更結果を、実際の接続位置に反映

準備が整いました。スピンボタンの値が変わるたびに、接続位置を変更してみましょう。

Private Sub StartSpinButton_Change()
    SC.myShape.ConnectorFormat.BeginConnect start_shape, StartPosition
End Sub

結果

スピンボタンを押すたびに、接続位置が一つずつ変わるようになりました。
f:id:Infoment:20180921072627p:plain

次回に続きます。

参考まで。