テーブルで特定の列を処理する
昨日は、指定範囲をFor Each ~ Next のループで処理する際、その順序を列方向にする方法を紹介した。
infoment.hatenablog.com
ところがテーブルを使用すると、昨日の内容と少し様子が変わってくる。
今のところ私が把握しているのは、次の5通り(大別すると3通り)。
多分きっと、もっとあると思われ。
それでは、以下のサンプルで試してみよう。
【列方向:繰り返し処理サンプル】
Sub Test() Dim Tb As ListObject Set Tb = ActiveSheet.ListObjects(1) Dim r As Range ' 1.テーブル[ラベル名] で指定。 For Each r In Range(Tb & "[品名]") Debug.Print r.Value Next ' 2.ListColumnsで、ラベル名で指定。 For Each r In Tb.ListColumns("出荷日").DataBodyRange Debug.Print r.Value Next ' 3.ListColumnsで、インデックスで指定。 For Each r In Tb.ListColumns(3).DataBodyRange Debug.Print r.Value Next ' 4.データ範囲の「単価」列の各セル という指定。 For Each r In Tb.DataBodyRange.Columns(Tb.ListColumns("単価").Index).Cells Debug.Print r.Value Next ' 5.データ範囲の5列目の各セル という指定。 For Each r In Tb.DataBodyRange.Columns(5).Cells Debug.Print r.Value Next End Sub
- 各列の内容を表す「ラベル名」で、列を指定する。
Rangeオブジェクトで指定しているため、一番馴染みがあるかも。 - ListColumnsプロパティで、ラベル名で指定。
サンプルでは、『「出荷日」列のデータ範囲』という指定の仕方。 - 2.の方式をラベル名ではなく、テーブル内の列番号「3」で指定。
サンプルでは、3列目を指定。 - データ範囲のうち「単価」列データの各セル、という指定。
「単価」の列番号が変わっても追従するようにした場合、一行が最も長い記述となる。 - 4.の方式をラベル名ではなく、テーブル内の列番号「5」で指定。
昔は、末尾の「Cells」が要ると知らず、いつも「何で動かないんだろう?」と不思議に思っていた。
個人的にいつも使うのは、2.の書き方かな。
参考まで。