図形の選択順に反映できるようにしました。
コネクタも無事、選択順に矢印が向くようになりました。
残すは、コネクタタイプを変更した時の
リスト名を書き換える処理を考えて行きます。
まず、使用してるコネクタタイプは二つ、
直線
カギ線
タイプをListBoxに取り込む際、コネクタ名が、長い&英語って事で、
直線・カギ線と省略した、タイプ名を表示するようにしています。
ただ、タイプ変更した場合、リストの表示はそのままになっていて、
変更後に分かりにくい状態になっています。
リストの書き換えについては、二通りの処理を思いついたので、
順に記事にまとめようと思います。
・リストから当該コネクタ名を検索して書き換える
・Dictionaryに当該コネクタを登録して書き換える
まず、コネクタタイプ変更のプロシージャをおさらいします。
ConnectorChangeモジュール(標準モジュール)
Sub ConnectorTypeChange(connector As String)
Dim con As Shape '選択図形取得'
Dim conName As String 'コネクタ名取得'
'開始・終了図形の判別子'
Const biginShape As Long = 1
Const endShape As Long = 2
On Error GoTo NotSelect
For Each con In Selection.ShapeRange
conName = con.Name
With con.ConnectorFormat
Select Case connector
Case "直線"
.Type = msoConnectorStraight
con.RerouteConnections
Case "カギ線"
'結合点フォーム呼び出し'
Call OpenForm
.Type = msoConnectorElbow
.BeginConnect .BeginConnectedShape, GetBtNumber(biginShape)
.EndConnect .EndConnectedShape, GetBtNumber(endShape)
End Select
End With
con.Name = conName
Next
Exit Sub
NotSelect:
MsgBox "選択されてないよ!"
End Sub
このプロシージャを、直線・カギ線のボタンから呼び出しています。
直線(ボタンモジュール)
Private Sub CommandButton9_Click()
Call ConnectorTypeChange("直線")
End Sub
カギ線(ボタンモジュール)
Private Sub CommandButton10_Click()
Call ConnectorTypeChange("カギ線")
End Sub
選択されてるコネクタを順番にタイプ変更していく、
そんな処理になっています。
タイプ変更処理後に、リストの表示名を書き換えるだけの単純処理ですが、
タイプ変更したコネクタとリスト項目を照合する必要があるので、
少し悩みました。( ´~`).。
・ListBoxから検索してタイプ名を書き換える
ConnectorTypeChangeプロシージャで、選択中のコネクタ名を取得してるので、
それを利用して、ListBoxから検索する方法です。
PanelManagerモジュール(標準モジュール)
Sub TypeReWriting(conName As String, typeName As String)
Dim listCnt As Long
With workPanel.ListBox2
For listCnt = 0 To .ListCount - 1
If .List(listCnt, 1) = conName Then
.List(listCnt, 0) = typeName
Exit Sub
End If
Next
End With
End Sub
引数にコネクタ名とタイプ名を設定します。
ListBox2の1列目にコネクタ名を格納しているので、
該当する名前を検索して、該当すれば0列目のタイプ名を
引数で設定したタイプ名に書き換えます。
書き換えが終われば、ループを回す必要がないので、
プロシージャから抜けます。
このプロシージャをConnectorTypeChangeプロシージャから呼び出せば
タイプ変更後にリストの書き換えができます。
ConnectorChangeモジュール(標準モジュール)
Sub ConnectorTypeChange(connector As String)
Dim con As Shape '選択図形取得'
Dim conName As String 'コネクタ名取得'
Dim listNum As Long 'Dictionaryからリスト行取得'
'開始・終了図形の判別子'
Const biginShape As Long = 1
Const endShape As Long = 2
On Error GoTo NotSelect
For Each con In Selection.ShapeRange
conName = con.Name
With con.ConnectorFormat
Select Case connector
Case "直線"
.Type = msoConnectorStraight
con.RerouteConnections
Case "カギ線"
'結合点フォーム呼び出し'
Call bindingPanelOpen
.Type = msoConnectorElbow
.BeginConnect .BeginConnectedShape, GetBtNumber(biginShape)
.EndConnect .EndConnectedShape, GetBtNumber(endShape)
End Select
End With
con.Name = conName
Call TypeReWriting(conName, connector)
Next
Exit Sub
NotSelect:
MsgBox "選択されてないよ!"
End Sub
タイプ変更ボタンから、変更後タイプ名を引っ張ってるので、
そのまま、コネクタ名とタイプ名を引数に設定して、TypeReWritingをコールすれば、
リストの書き換えを行ってくれます。
・Dictionaryに登録してタイプを書き換える
図形と同じように選択コネクタをDictionaryに登録して、リストを書き換えます。
DictionaryModule(標準モジュール)
Option Explicit
Dim shDic As New Dictionary
Dim conDic As New Dictionary
'コネクタDictionary'
'-----------------------------------------'
Sub ConnectorDictionary(conName As String, listNum As Long, listOn As Boolean)
If listOn And conDic.Exists(conName) = False Then
conDic.Add conName, listNum
ElseIf listOn = False And conDic.Exists(conName) Then
conDic.Remove conName
End If
End Sub
Function ListNumRetern(listName As String)
ListNumRetern = conDic(listName)
End Function
'コネクタDictionary'
'-----------------------------------------'
'Dictionaryのリセット'
Sub DictionaryReset()
shDic.RemoveAll
conDic.RemoveAll
End Sub
図形の時に説明したので、詳しくは前回記事を参照下さい。
今回は、コネクタ名を元にリスト番号が必要になるので、
Keyをコネクタ名、データをリスト番号で登録します。
Dictionaryから欲しいリスト番号は、Functionで取得します。
引数にコネクタ名を設定すれば、リスト番号が返ってくるようにします。
リストの選択時にDictionary登録できるように、ListBox2のMouseUpに追加します。
ListBox2(ListBox2モジュール)
Private Sub ListBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim listCnt As Long
Call ListBoxSelectRelease(1)
Application.ScreenUpdating = False
Range("A1").Select
With ListBox2
For listCnt = 0 To .ListCount - 1
If .Selected(listCnt) Then
ActiveSheet.Shapes(.List(listCnt, 1)).Select False
End If
'コネクタDictionaryにリスト番号を登録'
Call ConnectorDictionary(.List(listCnt, 1), listCnt, .Selected(listCnt))
Next
End With
Application.ScreenUpdating = True
End Sub
リストを上から順にみてDictionary登録する部分は、図形と同じ処理です。
ただ、図形は選択順が必要だったので、Dictionaryから図形選択をする形でしたが、
コネクタは選択順が必要ないので、ここで選択しておきます。
登録まで出来たら、リストの書き換えを作ります。
PanelManager(標準モジュール)
Sub ListReName(num As Long, listName As String)
workPanel.ListBox2.List(num, 0) = listName
End Sub
単純にリスト番号と書き換え用の名前を引数にして、
該当するリスト番号の0列目を、書き換えるだけです。
これで準備ができたので、ConnectorTypeChangeプロシージャの設定をします。
ConnectorChange(標準モジュール)
Sub ConnectorTypeChange(connector As String)
Dim con As Shape '選択図形取得'
Dim conName As String 'コネクタ名取得'
Dim listNum As Long 'Dictionaryからリスト行取得'
'開始・終了図形の判別子'
Const biginShape As Long = 1
Const endShape As Long = 2
On Error GoTo NotSelect
For Each con In Selection.ShapeRange
conName = con.Name
With con.ConnectorFormat
Select Case connector
Case "直線"
.Type = msoConnectorStraight
con.RerouteConnections
Case "カギ線"
'結合点フォーム呼び出し'
Call bindingPanelOpen
.Type = msoConnectorElbow
.BeginConnect .BeginConnectedShape, GetBtNumber(biginShape)
.EndConnect .EndConnectedShape, GetBtNumber(endShape)
End Select
End With
con.Name = conName
Call ListReName(ListNumRetern(conName), connector)
Next
Exit Sub
NotSelect:
MsgBox "選択されてないよ!"
End Sub
Dictionaryの処理は、複雑で分かりにくいです。
なぜ、こんな処理を作ったかと言えば、Dictionaryを使いたかった…
ではなくて、リスト番号とコネクタ名を合わせるには?
と悩んで、Dictionaryならできると単純に考えて作りました。
落ち着いて考えるとListBoxから検索して、書き換える方が楽に処理が作れる事に
後で気が付きました(T-T) グスッ
頭が働いてませんでした。( ´~`).。
Dictionaryの参考にでもなれば幸いでっす。
一応、処理が作れたので二つともテストします。
結果は同じですが…

まず、書類の図形を左へ移動させます。
リストから書類の上下に接続してるコネクタを選択状態にして、
カギ線に変更します。

カギ線ボタンを押すと、結合点のパネルが開くので、
それぞれの結合点を設定します。

二つのコネクタがカギタイプに変更され、
リストのタイプ名もカギ線に書き換えられました。( ˊ꒳ˋ )💭
なんか余計な処理を考えてしまったおかげで、
時間は掛かってしまいましたが、一応の処理は完成できました。
これでフローを活用できそうです。
まだまだ、エラー回避や追加したい機能なんかもあるのですが、
それは使いながらアップデートしていこうと思っています。
さて、VBA記事を半年以上書いてきましたが、
そろそろUnityに戻ろうと思います。
これからもExcelVBAは、触って行くことになると思うので、
なにかあれば記事にすると思いますが、おそらく少ないと思います。
少数でしたが、こんなVBAシロウトのブログを読んで下さった方がいたので、
うれしいかぎりでっす。(^ё^) ♪♪
次回からはUnityの記事を書けるように頑張っていこうと思います。
それでは(^^)/~~デハデハ
この記事へのトラックバック
この記事へのコメント