テーブルの列の指定方法を色々考えてみました。配列に入れてユーザ列挙型で設定
この記載は、以下の続きです。
タイトルのマクロは、以下です。
' 列挙型
Private Enum c
氏名 = 1 ' 「氏名」列に1を割り当て
所属部署 ' 「所属部署」列に2を自動的に割り当て
担当地区 ' 「担当地区」列に3を自動的に割り当て
受注件数 ' 「受注件数」列に4を自動的に割り当て
受注額 ' 「受注額」列に5を自動的に割り当て
End Enum
' テーブルの列の指定方法。配列に入れて、列挙型で指定
' 利点:高速。インテリセンス使用可能。
' 欠点:列移動により変更必要。
Sub tableColumnArrayWithEnum()
Dim wb As Workbook
Set wb = ThisWorkbook ' 現在のブックを設定
Dim ws As Worksheet
Set ws = wb.Worksheets(1) ' 一つ目のシートを設定
Dim list As ListObject
Set list = ws.ListObjects(1) ' 一つ目のテーブルを設定
' 列挙型の各値をデバッグ出力
Debug.Print c.氏名, c.所属部署, c.担当地区, c.受注件数, c.受注額
' テーブルのデータのみを配列に入れる
Dim tbl As Variant
tbl = ws.Range("営業[#Data]") ' テーブルのデータ部分のみを配列に格納
' Rangeの前に、wsを入れているのは、別ブックがアクティブになっているとエラーになるため。
' これにより、特定のワークシートを明示的に指定して参照している。
Dim rw As Long
' 配列の行数分だけループを回す。UBound(tbl)は配列の最終行を取得。
For rw = 1 To UBound(tbl)
' 「氏名」列の各行の値をデバッグ出力
Debug.Print tbl(rw, c.氏名)
Next rw
End Sub
このVBAマクロは、列挙型 Enum
を使ってテーブル内の特定の列を効率的に操作する方法を示しています。列挙型は名前で各列のインデックスを管理でき、インテリセンス機能も活用できるため、コーディングやデバッグがしやすくなっています。
1. 列挙型 c
の定義
Private Enum c
氏名 = 1 ' 「氏名」列に1を割り当て
所属部署 ' 「所属部署」列に2を自動的に割り当て
担当地区 ' 「担当地区」列に3を自動的に割り当て
受注件数 ' 「受注件数」列に4を自動的に割り当て
受注額 ' 「受注額」列に5を自動的に割り当て
End Enum
Enum c
は、列のインデックスを列挙型で管理しています。氏名
列を 1 に設定し、以降は自動で 2, 3… とインデックスが割り当てられています。- 列挙型を使用することで、名前付きのインデックスを使って列を指定することができ、
c.氏名
やc.所属部署
のようにコード内で参照できます。
2. tableColumnArrayWithEnum
サブプロシージャの概要
Sub tableColumnArrayWithEnum()
Dim wb As Workbook
Set wb = ThisWorkbook ' 現在のブックを設定
Dim ws As Worksheet
Set ws = wb.Worksheets(1) ' 一つ目のシートを設定
Dim list As ListObject
Set list = ws.ListObjects(1) ' 一つ目のテーブルを設定
wb
とws
は、それぞれ現在のブック (ThisWorkbook
) と 1 番目のシートを参照しています。list
は、ワークシート上の 1 番目のテーブルをListObject
型で参照します。これにより、シート上の指定したテーブルの範囲を操作できます。
3. 列挙型 c
の各インデックス値をデバッグ出力
Debug.Print c.氏名, c.所属部署, c.担当地区, c.受注件数, c.受注額
- 列挙型
c
の各列名(氏名
、所属部署
など)に対応するインデックスをDebug.Print
で出力し、正しくインデックスが設定されているか確認します。
4. テーブルデータを配列 tbl
に格納
Dim tbl As Variant
tbl = ws.Range("営業[#Data]") ' テーブルのデータ部分のみを配列に格納
tbl
変数に、テーブル「営業」のデータ部分(見出しを除くデータ)を配列形式で格納します。- 配列に格納することで、データへのアクセスが高速になり、各列を直接参照するよりも効率的な処理が可能です。
5. 各行のデータをループ処理
Dim rw As Long
' 配列の行数分だけループを回す。UBound(tbl)は配列の最終行を取得。
For rw = 1 To UBound(tbl)
' 「氏名」列の各行の値をデバッグ出力
Debug.Print tbl(rw, c.氏名)
Next rw
For
ループを使用して配列tbl
の各行を処理しています。tbl(rw, c.氏名)
のように列挙型c
のフィールドを使って「氏名」列のデータを指定し、Debug.Print
に出力しています。これにより、列名の変更があってもインデックス番号を見直すだけでコードが機能します。
まとめ
- 利点:列挙型を使って列を指定するため、コードの可読性とメンテナンス性が向上し、インテリセンスが使えるので入力補完も可能です。また、配列を使用することで処理も高速化されています。
- 欠点:列順が変更されると
Enum
のインデックスを変更する必要があるため、列順が頻繁に変わる場合には注意が必要です。