先日から、マクロによるテーブル機能の扱いを纏めている(備忘録)。
infoment.hatenablog.com
今日は、列の範囲指定についてのご紹介。
例えば下表で、「ふりがな」の列を繰り返し処理したいとする。
このとき、この列を指定する方法は、少なくとも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列目、という指定の仕方。以前わたしはこの方法を多用していたが、以下二つの問題があって今は使用していない。
- 表のレイアウトが変更された場合、マクロも都度変更しなければならない。
- 「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列目」という指定の仕方も可能だ。二つ目の問題も、この方法ならば不問となるうえ、テーブル特有の書き方であることから、テーブルを扱っていることも一目瞭然だ。ということで、個人的に最近は、この書き方が最も多いかも。
勿論、絶対の正解は無い。ご使用は各自、時と場合とお好みで。
次回に続きます。
参考まで。