ヘッダー行からEnum作成 ① まずは一気に作成
前回までは、表などのヘッダー行から変数宣言用文字列を作成していた。
infoment.hatenablog.com
実は、Enumも作成したい。ということで、挑戦してみた。
変数宣言のときは、ちまちまと全ての部品を一つずつ配置していった。
しかし今回は、その多くを流用可能だ。そこで違う部分だけをマルチ
ページに選り分けてみた。Enumオリジナルメニューは、とりあえず
以下の3つだ。
- Enum作成ボタン:EnumButton
Enumとして貼り付け用に文字列を編集。
- Enum名称入力用テキストボックス:EnumNameTextBox
Enumの名前を入力するためのテキストボックス。
- 接頭文字入力用テキストボックス:PrefixEnumCharacterTextBox
各要素の先頭に付す文字列を入力するためのテキストボックス
※入力は任意。
Enumボタンを押した結果を、こんな風に貼り付けたい。
ユーザーフォーム
まず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
変数宣言のときと異なり、最後にクリップボードに格納する際、接頭文字と要素を半角スペースで結合すると都合が悪い。最初は、そこまで考えていなかった。
ということで、クリップボード格納用文字列を少し手直し。
まず、マルチページの各ページに名前をつけた。
- pg変数 ⇒ 変数宣言用ページ
- 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
結果確認
それでは、実際に動作させて確認してみよう。
今回確認する内容は、以下のとおり。
- 意図した内容で貼り付けられること。
- タブによる字下げが正しく反映されていること。
上記の結果がこちら。
加えて、列名をEnumにしているので、ここから更に1始まりにしたい。
※行と列は共に、1列目から始まるので。
ということで次回は、頻出パターンの簡単セットに挑戦です。
参考まで。