いろいろと修正部分があるので、順次作っていこうと思います。
その前に、今回テストを繰り返す内に、標準モジュールが増えてしまいました。
コードを記載する際、標準モジュールとしていたのですが、
一つのモジュールに、何個もプロシージャを書いてるわけではないので、
分かりにくくなると思います。
どのモジュールに組んでるか分かり易くする為に、モジュール名を変更する事にしました。
モジュール名の変更は、
モジュールを選択するとオブジェクト名が表示されるので、
この部分(赤枠)を書き換える事で好きな名前にする事ができます。
少し逸れたので話を戻して、
今回は、カギ線繋ぎについて修正していきます。
カギ線繋ぎで問題なのが、
結合点が4に固定されてるのは、使い勝手が悪い。
図形を選択してないとエラーが出る。
図形の選択数が、1個の時、3個以上の時、機能しなくなる。
この辺りを修正する必要があります。
修正案として、
・図形選択を2つに限定する
・結合点を選択できるようにする
・エラー対応
この3つを組み込んでみようと思います。
まずは、エラー対応と図形を2つ選択した時だけ機能する処理を作ります。
標準モジュール(LineConnect)
Sub ElbowConnect()
Dim arrow As Shape '矢印線取得'
Dim selectSh(2) As Shape '選択中の図形取得'
Dim sh As Shape '図形検索変数'
Dim i As Long '配列カウント変数'
i = 0
On Error GoTo Notselect
If Selection.ShapeRange.Count = 2 Then
'選択中の図形を検索して取得'
For Each sh In Selection.ShapeRange
Set selectSh(i) = sh
i = i + 1
Next
'仮線を作成'
Set arrow = ActiveSheet.Shapes.AddConnector _
(msoConnectorElbow, 1, 1, 1, 1)
'仮線を図形に繋ぐ'
With arrow
.ConnectorFormat.BeginConnect selectSh(0), 4
.ConnectorFormat.EndConnect selectSh(1), 4
'線の書式設定'
With .Line
.EndArrowheadStyle = msoArrowheadTriangle
.Visible = msoTrue
.Weight = 1.75
End With
End With
Else
MsgBox "選択は二つにしてね!"
End If
Exit Sub
Notselect:
MsgBox "選択できてないよ!"
End Sub
これで、エラー回避と2つ選択以外、処理が行われないようにできます。
残すは、結合点の設定方法なのですが、
さてどうしたものか… (。-`ω-) .。oO
やはり、見た目で設定できた方がいいので、ユーザーフォームを作ります。
挿入→UserFoamで新しくフォームを用意して、
開始図形と終了図形の結合点を選択できるようにします。
結合点の選択部分は、オプションボタンを使います。
オプションボタンは、ユーザーフォーム上に設定すると
クリックしたボタンが選択状態になる便利なボタンで、
複数用意すれば、その内の一つだけ選択できるようになっています。
ただ、開始・終了の2つの図形を設定する必要があるので、
計8個のボタンが必要になります。
また、同系列でオプションボタンを並べると1/8しか選択できなくなるので、
フレームを使って、開始・終了を分けておきます。
フレーム内にオプションボタンを設置すると、
フレーム内だけのボタンに反応するようになるので、
各フレーム毎に選択が可能になります。
見た目を整えて、
こんな感じにしてみました。
これを呼び出せるようにするのですが、
ユーザーフォームを呼び出す際、暗黙のインスタンスを生成しない事と
ネットで書かれているのを見かけたので、ユーザーフォームをインスタンス化して、
呼び出せるようにプロシージャを組んでおきます。
標準モジュール(UserFormCall)
Option Explicit
Sub OpenForm()
Dim bindBoard As UserForm3
Set bindBoard = UserForm3
bindBoard.Show
End Sub
ユーザーフォームが3になってますが気にしないで下さい (;^_^A
これで多分、インスタンス化はOKだと思います。
続いて、カギ線処理からユーザーフォームを開くようにします。
ElbowConnectプロシージャ
If Selection.ShapeRange.Count = 2 Then
Call OpenForm
'選択中の図形を検索して取得'
For Each sh In Selection.ShapeRange
Set selectSh(i) = sh
i = i + 1
Next
選択図形カウントが2つなら処理開始なので、
冒頭で呼び出せるように設定しておきます。
ユーザーフォームを呼び出して、結合点を設定するのですが、
この設定を図形接続に反映させる必要があります。
まず、設定をキープできるようにしないといけないのですが、
どういった感じにしようかと(っ˘ω˘c ).oO
Functionを使って、数値の出し入れを可能にするのが楽かなって事で、
標準モジュールを追加して、変数用のFunctionを作ります。
標準モジュール(BindManager)
Option Explicit
Dim bindPoint As Variant '結合点のナンバー取得'
'配列初期化'
Sub ArraySet()
ReDim bindPoint(1 To 2)
End Sub
'変数を受け取る'
Function SetBtNumber(shNum As Integer, num As Integer)
bindPoint(shNum) = num
End Function
'格納中の変数を返す'
Function GetBtNumber(shNum As Integer) As Integer
GetBtNumber = bindPoint(shNum)
End Function
このモジュールは、変数bindPointを管理するだけのモジュールになります。
bindPointをFunctionプロパティを使って、変数にアクセスできるようにしています。
こう言った変数は、クラスで定義する方が、後々のトラブルを避けられるのでしょうが、
個人で使うってのもあって、面倒な部分を省きました。
(;^o^) \(ToT )あんたほんとにそれでいいの
ArraySetプロシージャなんですが、配列に再宣言しています。
通常の配列でも良かったのですが、最初の配列が0からスタートするので、
コーディングする際によく間違えるので、1からスタートできるように設定しました。
まず、変数を配列初期化する必要があるので、
UserFoamモジュール
Private Sub UserForm_Initialize()
Call ArraySet
End Sub
配列初期化は、ユーザーフォームを開いた時に行えばいいので、
UserForm_Initializeを使って、Callします。
初期化ができたら、SetBtNumberファンクションで図形と結合点の登録、
GetBtNumberファンクションで登録中のデータ確認ができるようになります。
続いて、図形と結合点の登録を作っていきます。
OptionButtonモジュール
Option Explicit
Private Sub OptionButton1_Click()
'図形識別と結合点を登録'
Const sh As Integer = 1
Const pos As Integer = 1
Call SetBtNumber(sh, pos)
End Sub
オプションボタンモジュールに図形・結合点のデータを設定して、
クリックすればSetBtNumberにデータを送るようにします。
shが図形の識別番号、1=開始図形・2=終了図形
posが結合点になります。
オプション5個目以降は、終了図形になるので、
こんな設定になります。
これで選択した結合点が登録できるようになったのですが…
オプションボタンを設定せずにUserFoamを閉じると、
結合点のデータがないので、エラーが発生します。
なので、UserFoamを閉じる時にオプションボタンが設定されてなければ、
閉じる事が出来ないように処理を追加します。
UserFoamモジュール
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Dim i As Integer
For i = 1 To 2
If GetBtNumber(i) = 0 Then
MsgBox "結合点を指定してね!"
Cancel = True
Exit Sub
End If
Next
End Sub
QueryCloseコマンドは、UserFoamを閉じる時に読み込むイベントになります。
オプションボタンが設定できてないと、
GetBtNumberファンクションから返ってくる値は0になるので、
その時は、閉じる操作をキャンセルしてプロシージャを終了します。
これで未設定のエラーを回避できるようになると思います。
いよいよ処理の中心部、図形の接合部分を修正していきます。
図形・結合点の二つのデータを取得する必要があるので、
取得配列を2次配列に変更します。
配列も0からだとバグるので、1から取得できるように設定します。
標準モジュール(LineConnect)
Sub ElbowConnect()
Dim arrow As Shape '矢印線取得'
Dim sh As Shape '図形検索変数'
Dim i As Integer '配列カウント変数'
Dim shProp As Variant '取得した図形の情報'
On Error GoTo Notselect
If Selection.ShapeRange.Count = 2 Then
ReDim shProp(1 To Selection.ShapeRange.Count, 1 To 2)
i = 1
Call OpenForm
'選択中の図形を検索して取得'
For Each sh In Selection.ShapeRange
Set shProp(i, 1) = sh
shProp(i, 2) = GetBtNumber(i)
i = i + 1
Next
'仮線を作成'
Set arrow = ActiveSheet.Shapes.AddConnector _
(msoConnectorElbow, 1, 1, 1, 1)
'仮線を図形に繋ぐ'
With arrow
.ConnectorFormat.BeginConnect shProp(1, 1), shProp(1, 2)
.ConnectorFormat.EndConnect shProp(2, 1), shProp(2, 2)
'線の書式設定'
With .Line
.EndArrowheadStyle = msoArrowheadTriangle
.Visible = msoTrue
.Weight = 1.75
End With
End With
Else
MsgBox "選択は二つにしてね!"
End If
Exit Sub
Notselect:
MsgBox "選択できてないよ!"
End Sub
ReDim shPropで2次配列に再宣言します。
ここでVariant型の変数について少し、
Variant型は、代入する値やオブジェクトに合わせて、
自動的に型を用意してくれる物になります。
一列目にオブジェクト型、2列目に整数型と指定しなくても
状況に合わせて、型を自動選択してくれるのが便利な所になります。
ただ、乱用すると何型が使われてるか分からなくなるので、
要所で使うと非常に便利な型なので、覚えておくといいかと思います。
このReDim shProp宣言で、
shProp(1,1)=開始図形(Shape型)
shProp(1,2)=開始結合点(整数型)
shProp(2,1)=終了図形(Shape型)
shProp(2,2)=終了結合点(整数型)
こんなヘンテコな変数が作成されております。(^.^; オホホホ
後は、
For Each sh In Selection.ShapeRangeのループ内で、
この変数にデータを取得して、ConnectorFormatの設定に反映すれば、
図形の接続が行われます。
これで修正が終了したので、テストしていきます。
まずは、無選択のエラー回避テスト
OK!
つづいて、個数テスト
OK!
いよいよ最後
本題の接続テストです。
ひし形→四角と選択して接続、結合点も矢印の向きもOKでっす。
もう一発
ひし形→端子と選択して接続、結合点・向き、共にOKでっす。
無事接続する事ができました~ヽ(´▽`)/~♪
これで結合点が設定できるようになったので、
カギ線の接続が使用できます。
いよいよ完成が見えてきました。
残る修正部分は、
・中央揃えに矢印線が反応してしまう
・複数一括接続
・接続した線の線種を変更する
この辺りは、アイディアが足りないので少し模索する必要があります。
作れたら記事にまとめようと思うので、それまでは
( ^ 0 ^ )/~~~~see you again
この記事へのコメント