テーブル機能の備忘録 ⑤ ラベル名による列の範囲指定

先日から、マクロによるテーブル機能の扱いを纏めている(備忘録)。
infoment.hatenablog.com
今日は、列の範囲指定についてのご紹介。
f:id:Infoment:20170523152742j:plain
例えば下表で、「ふりがな」の列を繰り返し処理したいとする。
f:id:Infoment:20200301225830p:plain
このとき、この列を指定する方法は、少なくとも3通りある。

Sub Test()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        ' (1)
        Range(Tb & "[ふりがな]").Select
        ' (2)
        Tb.DataBodyRange.Columns(3).Select
        ' (3)
        Tb.ListColumns("ふりがな").DataBodyRange.Select
End Sub

一つ目は、最も一般的な指定方法かもしれない。なぜなら「マクロの記録」で記録されるのは、この書き方だからだ。

二つ目は、データ範囲の中の3列目、という指定の仕方。以前わたしはこの方法を多用していたが、以下二つの問題があって今は使用していない。

  1. 表のレイアウトが変更された場合、マクロも都度変更しなければならない。
  2. 「3列目」という指定方法では、直感的に理解しにくい。

この問題は、列挙体を用いれば解決できる。ただし、その分コードが長くなる。

Enum 列名
    enNo = 1
    en名前
    enふりがな
    enアドレス
    [_eLast]
End Enum

Sub Test()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
    
        Tb.DataBodyRange.Columns(列名.enふりがな).Select
End Sub

また他の二つと異なり、For Each でループする際は、最後に「.Cells」を付す必要がある点に注意が必要だ。

Sub Test()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
    
    Dim r As Range
        For Each r In Tb.DataBodyRange.Columns(列名.enふりがな).Cells
            Debug.Print r.Value
        Next
End Sub


三つ目は、「ふりがな列のデータ」という指定の仕方。

Tb.ListColumns(3).DataBodyRange

のように、「3列目」という指定の仕方も可能だ。二つ目の問題も、この方法ならば不問となるうえ、テーブル特有の書き方であることから、テーブルを扱っていることも一目瞭然だ。ということで、個人的に最近は、この書き方が最も多いかも。

勿論、絶対の正解は無い。ご使用は各自、時と場合とお好みで。

次回に続きます。

参考まで。