【ExcelVBA】コネクタの種類を変更する

長らくブログ更新をサボって申し訳ないです(ToT)>゛スンマセン

いろいろとやる事があって、暫く触れなかったので、
記事を書く事もできませんでした。

7月中は、なにかと忙しいので更新頻度は低いですが、
ぼちぼちと処理を作っていこうと思うので、温かい目で見守って頂けると助かります。


さて、フローチャート作りも、いよいよ大詰めになりました。
最後は、コネクタのタイプを変更するです。

コネクタのタイプを変更できるようにする意味なんですが、
接続した図形を移動させた場合、位置によって線タイプを変更する必要があります。

例えば、
コネクタ変更①.jpg
こんな感じで図形を移動させると直線タイプでは表示が分かりにくくなります。
当然、カギ線に変更したいのですが、削除して引き直すってのは面倒です。

なので、コネクタを選択しておいて、タイプを切り替える処理を考えてみます。

単純に切り替えるだけでは、面白くないので、
カギ線の時は、結合点も変更できるようにしてみたいと思います。

はたして上手く作れるのか… ( ー̀ωー́ ).。oஇ


選択中のコネクタのタイプを切り替えるには、
現状のタイプを判別できないと切り替える事もできないので、
コネクタタイプを取得して、判別できるようにします。

コネクタのタイプを取得するには、ConnectorFormatプロパティを使います。
標準モジュール

Option Explicit

Sub TypeChange()

Dim sh As ShapeRange '選択中のコネクタ'
Dim connType As Long 'コネクタのタイプ'


Set sh = Selection.ShapeRange '選択中のコネクタ取得'
connType = sh.ConnectorFormat.Type '取得したコネクタのタイプ取得'

'コネクタのタイプ切り替え'
Select Case connType

Case msoConnectorStraight
sh.ConnectorFormat.Type = msoConnectorElbow

Case msoConnectorElbow
sh.ConnectorFormat.Type = msoConnectorStraight

End Select

End Sub

選択したコネクタからタイプを取得して、判別・切り替えを行っています。

注意点は、ShapeRange 型の変数が必要になるって所でしょうか。

For Eachで選択中の図形を取得する場合は、Shape型で取得できるのですが、
単発で取得する場合は、ShapeRange型の変数でないと”型が一致しません”とデバッグされます。
Variant型で宣言しておいて、取得させるのもありでっす。

コネクタが取得できれば、タイプを判別して、それぞれのタイプに切り替えるだけでOKです。

ちなみに、コネクタのタイプ取得をLong型で取っていますが、

Dim sh As ShapeRange '選択中のコネクタ'
Dim connType As Long 'コネクタのタイプ'


Set sh = Selection.ShapeRange '選択中のコネクタ取得'
connType = sh.ConnectorFormat.Type '取得したコネクタのタイプ取得'

MsgBox connType

connTypeの中身を表示してみると、
コネクタ変更②.jpg
Indexナンバーとして取得しているようです。

なので、判別は数値で行う事も、タイプでも判断できるので、
覚えておくといいかと思います。

これでコネクタのタイプを切り替える事はできるのですが、
結合点の指定などは出来ません。

結合点の変更には、接続する”開始図形”と”終了図形”が必要になります。
選択したコネクタから図形を取得できれば処理できそうですが…

調べてみると、ConnectorFormatプロパティで、接続している図形を取得できるようです。

図形が分かれば、直線のリルート、カギ線の結合点が設定できるので、
処理を考えてみます。
標準モジュール

Sub TypeChange()

Dim sh As ShapeRange '選択中のコネクタ'
Dim startSh As Shape 'コネクタ開始図形'
Dim endSh As Shape 'コネクタ終了図形'

Const biginShape As Integer = 1 '開始図形識別'
Const endShape As Integer = 2 '終了図形識別'


Set sh = Selection.ShapeRange '選択中のコネクタ取得'

'コネクタのタイプ切り替え'
With sh.ConnectorFormat

Select Case .Type

Case msoConnectorStraight
Call OpenForm
.Type = msoConnectorElbow
.BeginConnect .BeginConnectedShape, GetBtNumber(biginShape)
.EndConnect .EndConnectedShape, GetBtNumber(endShape)

Case msoConnectorElbow
.Type = msoConnectorStraight
.BeginConnect .BeginConnectedShape, biginShape
.EndConnect .EndConnectedShape, endShape
sh.RerouteConnections

End Select

End With

End Sub

カギ線の処理を行うのに、以前作った結合点の設定フォームを再利用します。
詳しくは、【ExcelVBA】結合点を選択できるようにする
確認下さい。

結合点の設定は、Functionで取り出せるように設定しているので、
開始なら1、終了なら2を引数にして、GetBtNumberを呼び出せば、
設定した結合点が返り値で取得できます。

後は、接続コマンドに、それぞれの図形と結合点を設定してやれば問題ないかと。

直線については、ConnectorFormatで取得した開始図形と終了図形を設定して、
リルートしてやれば最短距離に直線を繋いでくれます。

一応、処理ができたので、テストしてみます。
コネクタ変更③.jpg
カギ線は問題なく変更できました。
コネクタ変更④.jpg
直線も最短にリルートされるので問題なさそうです。

これでタイプの変更ができるようになりましたが、
一本づつしか処理ができないので、複数選択・処理を作っていきます。
標準モジュール

Sub TypeChange()

Dim sh As Shape '選択中のコネクタ'
Dim startSh As Shape 'コネクタ開始図形'
Dim endSh As Shape 'コネクタ終了図形'

Const biginShape As Integer = 1 '開始図形識別'
Const endShape As Integer = 2 '終了図形識別'

On Error GoTo NotSelect

For Each sh In Selection.ShapeRange

If sh.Connector = False Then
GoTo Continue

End If


With sh.ConnectorFormat

Select Case .Type

Case msoConnectorElbow
.Type = msoConnectorStraight
.BeginConnect .BeginConnectedShape, biginShape
.EndConnect .EndConnectedShape, endShape
sh.RerouteConnections

Case msoConnectorStraight
Call OpenForm
.Type = msoConnectorElbow
.BeginConnect .BeginConnectedShape, GetBtNumber(biginShape)
.EndConnect .EndConnectedShape, GetBtNumber(endShape)


End Select

End With


Continue:
Next

Exit Sub

NotSelect:
MsgBox "選択されてないよ!"

Exit Sub

End Sub

For Eachで選択中のコネクタを取得するので、
変数宣言も、ShapeRange→Shapeに変更します。

未選択の場合、エラーが発生するので、For Each前にエラー回避のGoToを設定。

つづいて、For Eachの最初にIf sh.Connector = False Thenを設定しましたが、
間違って、図形を選択していた場合、ConnectorFormatを使うと、
エラーが発生します。

なので、図形が選択されていたらループを飛ばせるように設定しました。

あとは、タイプ別の処理を行えば問題ないかと。
処理が作れたので、テストします。

オブジェクトの選択に切り替えて、図形を範囲選択します。
コネクタ変更⑤.jpg
範囲選択で図形ごとコネクタを選択します。

続いて、コネクタTypeを変更します。
コネクタ変更⑥.jpg
無事にコネクタTypeが変更できました。

この状態から再度変更処理を行うと元に戻せるはずなので、
コネクタ変更⑦.jpg
範囲選択して変更処理します。
コネクタ変更⑧.jpg
無事に戻す事ができました。ヽ(´▽`)/~♪

これで処理としては問題ないのですが、
少し面倒な部分も…

範囲選択したコネクタの中にTypeを変更したくない物があった場合、
対応ができないんですよね。

かと言って、Ctrlキーで一つづつ選択するってもの面倒なんで、
少し工夫したい部分があります。

この辺りを修正できれば、いよいよフローの完成かと思っています。
処理が思いついたら、記事にまとめてみようと思います。

それでは今回はこの辺で、
( ^ 0 ^ )/~~~~see you again


この記事へのコメント

この記事へのトラックバック