スピンボタンでコネクタの接続位置を変更する
昨日は、全選択などのボタンを設置して、ユーザーフォームの大体の体裁を整えました。
今日は、コネクタの接続位置変更に挑戦です。
今日やりたいこと
自動で描画したコネクタは、ある程度の法則で以って描画してはいるものの、最適な接続位置とは限りません。
そこで一旦描画したのち、簡単に接続位置を変更できる機能を設けることにしました。
※マウス操作で付け替えたら?という意見は、今回黙殺します。
必要なこと
- 専用のユーザーフォームを新規に作成
- リストボックスにコネクタ一覧を作成
- スピンボタンで、コネクタの位置を一つずつ変更
- スピンボタンの変更結果を、実際の接続位置に反映
1.専用のユーザーフォームを新規に作成
コネクタ編集用に、EditConnectorFormを作成します。同フォーム内には、(とりあえず)以下を配置します。
- リストボックス
- スピンボタン
【ユーザーフォームのモジュール】
モジュール変数として、以下を準備します。これらは、コネクタの付け替えに用いるもので、昨日までに作成した変数と名前を共通にしてあります。
Dim SC As ShapeClass Dim start_shape As Shape Dim StartPosition As Long Dim end_shape As Shape Dim EndPosition As Long
2.リストボックスにコネクタ一覧を作成
ユーザーフォームの初期化時に、コネクタの一覧を以下の手順でリストボックスに作成します。
- コネクタの名前をコレクションに格納
- コレクションを配列に変換
- リストボックスのリストとして配列を充てる
【ユーザーフォームのモジュール】
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
スピンボタンで、コネクタの位置を一つずつ変更
リストボックスで選択したコネクタから、以下の情報を取得します。
- コネクタが接続されているオートシェイプ(始端と終端)
- 接続先の位置(始端と終端)
これらは全て、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
結果
スピンボタンを押すたびに、接続位置が一つずつ変わるようになりました。
次回に続きます。
参考まで。