テーブルの列の指定方法を色々考えてみました。配列に入れてユーザ列挙型で設定

この記載は、以下の続きです。

タイトルのマクロは、以下です。

' 列挙型
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)  ' 一つ目のテーブルを設定
  • wbws は、それぞれ現在のブック (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 のインデックスを変更する必要があるため、列順が頻繁に変わる場合には注意が必要です。

他の例は、以下を参照

Follow me!