いろいろとやる事があって、暫く触れなかったので、
記事を書く事もできませんでした。
7月中は、なにかと忙しいので更新頻度は低いですが、
ぼちぼちと処理を作っていこうと思うので、温かい目で見守って頂けると助かります。
さて、フローチャート作りも、いよいよ大詰めになりました。
最後は、コネクタのタイプを変更するです。
コネクタのタイプを変更できるようにする意味なんですが、
接続した図形を移動させた場合、位置によって線タイプを変更する必要があります。
例えば、

こんな感じで図形を移動させると直線タイプでは表示が分かりにくくなります。
当然、カギ線に変更したいのですが、削除して引き直すってのは面倒です。
なので、コネクタを選択しておいて、タイプを切り替える処理を考えてみます。
単純に切り替えるだけでは、面白くないので、
カギ線の時は、結合点も変更できるようにしてみたいと思います。
はたして上手く作れるのか… ( ー̀ωー́ ).。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の中身を表示してみると、

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で取得した開始図形と終了図形を設定して、
リルートしてやれば最短距離に直線を繋いでくれます。
一応、処理ができたので、テストしてみます。

カギ線は問題なく変更できました。

直線も最短にリルートされるので問題なさそうです。
これでタイプの変更ができるようになりましたが、
一本づつしか処理ができないので、複数選択・処理を作っていきます。
標準モジュール
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を使うと、
エラーが発生します。
なので、図形が選択されていたらループを飛ばせるように設定しました。
あとは、タイプ別の処理を行えば問題ないかと。
処理が作れたので、テストします。
オブジェクトの選択に切り替えて、図形を範囲選択します。

範囲選択で図形ごとコネクタを選択します。
続いて、コネクタTypeを変更します。

無事にコネクタTypeが変更できました。
この状態から再度変更処理を行うと元に戻せるはずなので、

範囲選択して変更処理します。

無事に戻す事ができました。ヽ(´▽`)/~♪
これで処理としては問題ないのですが、
少し面倒な部分も…
範囲選択したコネクタの中にTypeを変更したくない物があった場合、
対応ができないんですよね。
かと言って、Ctrlキーで一つづつ選択するってもの面倒なんで、
少し工夫したい部分があります。
この辺りを修正できれば、いよいよフローの完成かと思っています。
処理が思いついたら、記事にまとめてみようと思います。
それでは今回はこの辺で、
( ^ 0 ^ )/~~~~see you again
この記事へのトラックバック
この記事へのコメント