ヘッダー行からEnum作成 ① まずは一気に作成

前回までは、表などのヘッダー行から変数宣言用文字列を作成していた。
infoment.hatenablog.com
実は、Enumも作成したい。ということで、挑戦してみた。
f:id:Infoment:20201109225857p:plain

変数宣言のときは、ちまちまと全ての部品を一つずつ配置していった。
しかし今回は、その多くを流用可能だ。そこで違う部分だけをマルチ
ページに選り分けてみた。Enumオリジナルメニューは、とりあえず
以下の3つだ。

  1. Enum作成ボタン:EnumButton
    Enumとして貼り付け用に文字列を編集。
     
  2. Enum名称入力用テキストボックス:EnumNameTextBox
    Enumの名前を入力するためのテキストボックス。
     
  3. 接頭文字入力用テキストボックス:PrefixEnumCharacterTextBox
    各要素の先頭に付す文字列を入力するためのテキストボックス
    ※入力は任意。

f:id:Infoment:20201109230117p:plain

Enumボタンを押した結果を、こんな風に貼り付けたい。
f:id:Infoment:20201109230631p:plain

ユーザーフォーム

まずEnumの名称が入力されないうちは、Enum作成ボタンは無効にしておきたい。

' 「Enum名称」入力用テキストボックス。
' 未入力の場合、Enum作成ボタンを無効化する。
Private Sub EnumNameTextBox_Change()
    If EnumNameTextBox = vbNullString Then
        EnumButton.Enabled = False
    Else
        EnumButton.Enabled = True
    End If
End Sub
Private Sub UserForm_Initialize()

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

    ' 変数の型変更用コンボボックス。
    TypeComboBox.List = TypeArray
    
    ' 文字修正ボタンを無効化。
    ' ※現時点でListBox未選択のため。
    RenameButton.Enabled = False
    
    ' クリップボードへのコピーボタン無効化
    ' ※リストボックスが4列の場合に特化しているため。
    '  (ユーザーフォーム起動時は複数行1列)。
    CopyButton.Enabled = False
    
    ' Enum作成ボタンを無効化。
    ' ※現時点でEnum名称など未記入のため。
    EnumButton.Enabled = False
    
End Sub

変数宣言のときと異なり、最後にクリップボードに格納する際、接頭文字と要素を半角スペースで結合すると都合が悪い。最初は、そこまで考えていなかった。

ということで、クリップボード格納用文字列を少し手直し。
まず、マルチページの各ページに名前をつけた。

  1. pg変数 ⇒ 変数宣言用ページ
  2. pgEnum ⇒ Enum作成用ページ

そのうえで、pg変数が選択されているときだけ、itemListbox内の文字を結合するための文字を「半角スペース」とした。

Private Property Get CopyText() As String
    Dim SourceArray As Variant
        SourceArray = ItemListBox.List
    Dim arr() As Variant
    ReDim arr(0 To ItemListBox.ListCount - 1)
    Dim temp As Variant
    Dim myDelimiter As String
        If MultiPage.SelectedItem.Name = "pg変数" Then
            myDelimiter = " "
        End If
    Dim i As Long
        For i = 0 To ItemListBox.ListCount - 1
            ' index関数による配列のスライスは、配列のindexではなく
            ' 「i番目」の切り出しであることに注意。
            ' (0行目を指定すると配列の全てが返ってくる)。
            temp = WorksheetFunction.Index(SourceArray, i + 1, 0)
            ' 空白行があっても半角スペースで結合してしまうが、
            ' VBEに貼り付けた時点で消してくれる。
            ' なお、Enumの場合は半角を挟まず、そのまま結合する。
            ' ※字下げなどレイアウトの都合による。
            arr(i) = Join(temp, myDelimiter)
        Next
        
        CopyText = Join(arr, vbNewLine)
End Property

最後に、Enum作成ボタンの中身を作成。

' Enum作成ボタンクリック。
Private Sub EnumButton_Click()
    
    ' Enum ~ End Enumまでの全行を格納する配列。
    Dim arr() As Variant
        ItemListBox.ColumnCount = 4
    
    ' (1)Enum (2) [_eLast] (3) End Enum を追加するため、
    ' Redim時の要素数を+3としている。
    ' (2)は、Enum内の要素数を得るためなどに使用する。
    ' 例. [_eLast] = 10 の場合、Enumは直前まで 0 ~ 9 で
    '   10個の要素を持つことになる。
    ' ※変数宣言と揃えるために、列方向の要素は0~3とする。
    ReDim arr(0 To ItemListBox.ListCount - 1 + 3, 3)
        arr(0, 0) = "Public "
        arr(0, 1) = "Enum "
        arr(0, 2) = EnumNameTextBox
    Dim i As Long
        For i = 1 To UBound(arr) - 2
            arr(i, 0) = Chr(9) & PrefixEnumCharacterTextBox.Value
            arr(i, 1) = ItemListBox.List(i - 1, 0)
        Next
        
        arr(i, 0) = Chr(9)
        arr(i, 1) = "[_eLast]"
        
        i = i + 1
        arr(i, 0) = "End "
        arr(i, 1) = "Enum"
               
        ItemListBox.List = arr
        CopyButton.Enabled = True
End Sub
結果確認

それでは、実際に動作させて確認してみよう。
今回確認する内容は、以下のとおり。

  1. 意図した内容で貼り付けられること。
  2. タブによる字下げが正しく反映されていること。

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

加えて、列名をEnumにしているので、ここから更に1始まりにしたい。
※行と列は共に、1列目から始まるので。

ということで次回は、頻出パターンの簡単セットに挑戦です。

参考まで。