コネクタのタイプを直線 ⇔ カギに変更する

昨日は、ユーザーフォームのリストボックスから、ワークシート上のコネクタを選択してみました。

infoment.hatenablog.com

今日は、選択したコネクタのタイプ変更に挑戦です。

今日やりたいこと

コネクタがオートシェイプに接続されている始端・終端を変更したとき、直線からカギ形に(或いはその逆に)変更したい場合があります。そこで今回は、選択した任意のコネクタを変更する機能を追加します。
f:id:Infoment:20181002215511p:plain

必要なこと

  1. 置き換える「操作」の検討
  2. 置き換える「方法」の検討

1.置き換える「操作」の検討

直線なのかカギなのか、直感的に操作できた方が分かり易い。そこで、オプションボタンを設置して切り替えることにしました。
f:id:Infoment:20181002220040p:plain

ついでにコネクタを選択した際、オプションボタンの値も自動で追従してくれると分かり易いかも。ということでクラスモジュールに、コネクタのタイプを引数としてオプションボタンを変更させるサブプロシージャを追加しました。

【クラスモジュール】(EditConnectorClass)
Public Sub ChooseOptionButtonAboutConnectorType(type_index As Long)
    Select Case type_index
        Case msoConnectorStraight
            EditConnectorForm.OptionButtonStraight.Value = True
        Case msoConnectorElbow
            EditConnectorForm.OptionButtonElbow.Value = True
    End Select
End Sub

標準モジュールの、OnActionプロパティでコネクタに登録したマクロも修正です。

【標準モジュール】
Public Sub SelectConnector()
    On Error GoTo er:
    Dim ECoC As EditConnectorClass
    Set ECoC = New EditConnectorClass    
    ECoC.ConnectorName = Application.Caller
    ECoC.ClickedConnector.Select
    ECoC.UpdateConnectorList
    
    ' ↓↓今回の追加個所↓↓
    Dim TypeIndex As Long
        TypeIndex = ECoC.ClickedConnector.ConnectorFormat.Type    
    Call ECoC.ChooseOptionButtonAboutConnectorType(TypeIndex)
    ' ↑↑今回の追加個所↑↑    
    Exit Sub
    
er:
    Debug.Print Err.Number
End Sub

コネクタのタイプは、ConnectorFormat.Typeで取得可能で、今回用いるのは以下の二つです。

msoConnectorStraight 直線
msoConnectorElbow カギ

【ユーザーフォームのモジュール】(EditConnectorForm)

併せて、リストボックスで選択した際にも、オプションボタンを切り替えます。

Private Sub ListBox2_Change()
    On Error Resume Next
    Dim ConnectorName As String
        ConnectorName = ListBox2.List(ListBox2.ListIndex)
        If Err.Number = 381 Then
            Exit Sub
        End If
    
    Set SC = New ShapeClass
    Set SC.myShape = ActiveSheet.Shapes(ConnectorName)
        SC.myShape.Select
    
    Set ECoC = New EditConnectorClass
        
    With ECoC
        .ConnectorName = ConnectorName
        Set start_shape = .start_shape
            StartPosition = .StartPosition
        Set end_shape = .end_shape
            EndPosition = .EndPosition
        Call .ControlAddChartButton
    End With
    '↓↓今回追加した箇所↓↓
    Dim TypeIndex As Long
        TypeIndex = SC.myShape.ConnectorFormat.Type
    Call ECoC.ChooseOptionButtonAboutConnectorType(TypeIndex)
    '↑↑今回追加した箇所↑↑
End Sub

これで、現状に追従して情報を表示するオプションボタンが準備できました。
f:id:Infoment:20181002222055g:plain

2. 置き換える「方法」の検討

ConnectorFormat.Type でコネクタの形状がわかるなら、逆にこれを変更すれば形が変わるのでは?そう考えて試したところ、その通りでした。呆気ないぐらい。
そこで、オプションボタンのクリックイベントで、コネクタの形状を変更することにしました。

【ユーザーフォームのモジュール】(EditConnectorForm)

オプションボタンの値と、選択中のコネクタの情報で、形状を変更すべきか否かを判断します。例えば直線のオプションボタンが選択されていて、且つ選択中のコネクタがカギであれば、それは直線に変更せよという操作と見なすわけです。

' 直線用オプションボタン
Private Sub OptionButtonStraight_Click()
    If OptionButtonStraight.Value = True And _
       SC.myShape.ConnectorFormat.Type = msoConnectorStraight Then
        Exit Sub
    End If
    Call ReConnect
End Sub
' カギ用オプションボタン
Private Sub OptionButtonElbow_Click()
    If OptionButtonElbow.Value = True And _
       SC.myShape.ConnectorFormat.Type = msoConnectorElbow Then
        Exit Sub
    End If
    Call ReConnect
End Sub
' コネクタの形状変更
Private Sub ReConnect()
    Dim ConnectorType As Long
        Select Case OptionButtonStraight.Value
            Case True
                ConnectorType = msoConnectorStraight
            Case Else
                ConnectorType = msoConnectorElbow
        End Select
        SC.myShape.ConnectorFormat.Type = ConnectorType
End Sub

結果

選択したコネクタの形状について、直線またはカギへ任意に変更できるようになりました。
f:id:Infoment:20181002223436g:plain

次回に続きます。

参考まで。