ヘッダー行から変数作成 ④ 宣言子や変数の型を変更

前回は、表などのヘッダー行をリストボックスに表示し、それらを変数名として
変数宣言する形に編集してみた。
infoment.hatenablog.com
今日も、前回の続きから。
f:id:Infoment:20201104232758p:plain

前回は取り敢えず、変数を一律

Dim 変数名 As String

の形にした。

今回は「Dim」の部分と「String」の部分を、選択式で変更してみる。

ユーザーフォーム

取り敢えず ↓ この形になったものについて、
f:id:Infoment:20201104233027p:plain
どれを変更するか選択する必要がある。

そこで選択の補助として、「全選択」「全解除」ボタンを設けてみた。
名前はそれぞれ、AllSelectButton , AllUnselectButton とした。
f:id:Infoment:20201104233147p:plain

' 全選択ボタン。
Private Sub AllSelectButton_Click()
    Dim i As Long
        For i = 0 To ItemListBox.ListCount - 1
            ItemListBox.Selected(i) = True
        Next
End Sub

' 全非選択ボタン。
Private Sub AllUnselectButton_Click()
    ' 複数選択の可否を切り替えると、選択が解除されることを利用。
    ItemListBox.MultiSelect = fmMultiSelectSingle
    ItemListBox.MultiSelect = fmMultiSelectMulti
End Sub

よく使用する宣言子および変数の型を、コンボボックスから選択する。
f:id:Infoment:20201104233321p:plain

コンボボックスにセットする値は、Propertyとして予め準備しておこう。

' 宣言子の選択肢。
Private Property Get DeclarationArray() As Variant
    DeclarationArray = Array("Dim", _
                             "Private", _
                             "Public", _
                             "Static")
End Property

' 変数の型の選択肢。
Private Property Get TypeArray() As Variant
    TypeArray = Array("Variant", _
                      "String", _
                      "Long", _
                      "Double", _
                      "Date", _
                      "Currency")
End Property

これらは、ユーザーフォーム起動時にセットする必要がある。
Initializeに追加しよう。

Private Sub UserForm_Initialize()

    ' 選択範囲が1列の場合、このツールを使用する条件不成立とする。
    If UBound(HeaderList) = -1 Then Exit Sub
    
    ' 選択範囲のヘッダー部をリスト表示。
    ItemListBox.List = HeaderList
    
    ' 宣言変更用コンボボックス。
    DeclarationComboBox.List = DeclarationArray

    ' 変数の型変更用コンボボックス。
    TypeComboBox.List = TypeArray
    
End Sub

最後に、リストボックスで選択されたすべての行に対し、それぞれの選択肢を反映させよう。ただし、変数宣言ボタンを押す前だと意図しない文字を変更することになる。以下の場合は、動作しないようにしておこう。

  1. 変数宣言ボタンを押す前。
  2. コンボボックスが空白の場合。
' 宣言子を選択したときの処理。
Private Sub DeclarationComboBox_Change()
    ' 空欄なら処理不要。
        If DeclarationComboBox = vbNullString Then Exit Sub
    ' リストボックスが1列なら、つまり変数宣言ボタンを押す前なら処理不要。
        If ItemListBox.ColumnCount = 1 Then Exit Sub

    Dim i As Long
        For i = 0 To ItemListBox.ListCount - 1
            If ItemListBox.Selected(i) Then
                ItemListBox.List(i, 0) = DeclarationComboBox.Value
            End If
        Next
End Sub

' 変数の型を選択したときの処理。
Private Sub TypeComboBox_Change()
    ' 空欄なら処理不要。
        If TypeComboBox = vbNullString Then Exit Sub
    ' リストボックスが1列なら、つまり変数宣言ボタンを押す前なら処理不要。
        If ItemListBox.ColumnCount = 1 Then Exit Sub

    Dim i As Long
        For i = 0 To ItemListBox.ListCount - 1
            If ItemListBox.Selected(i) Then
                ItemListBox.List(i, 3) = TypeComboBox.Value
            End If
        Next
End Sub
結果確認

それでは、実際に確認してみよう。
確認する動作は、以下の4つ。

  1. 全選択ボタンで、リストボックス内が全て選択されるか。
  2. 全解除ボタンで、リストボックス内が全て非選択となるか。
  3. 宣言子をコンボボックスから選択したとき、宣言子が変更されるか。
  4. 変数の型について、同上。

上記の確認結果がこちら。
f:id:Infoment:20201104234311g:plain

今回も、想定通りの結果を得ることが出来た。

次回は、選択行の変数名を変更することに挑戦です。

参考まで。