テーブルで特定の列を処理する

昨日は、指定範囲をFor Each ~ Next のループで処理する際、その順序を列方向にする方法を紹介した。
infoment.hatenablog.com

ところがテーブルを使用すると、昨日の内容と少し様子が変わってくる。
f:id:Infoment:20190820194902p:plain

今のところ私が把握しているのは、次の5通り(大別すると3通り)。
多分きっと、もっとあると思われ。
それでは、以下のサンプルで試してみよう。
f:id:Infoment:20190820195321p:plain

【列方向:繰り返し処理サンプル】

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
  1. 各列の内容を表す「ラベル名」で、列を指定する。
    Rangeオブジェクトで指定しているため、一番馴染みがあるかも。
  2. ListColumnsプロパティで、ラベル名で指定。
    サンプルでは、『「出荷日」列のデータ範囲』という指定の仕方。
  3. 2.の方式をラベル名ではなく、テーブル内の列番号「3」で指定。
    サンプルでは、3列目を指定。
  4. データ範囲のうち「単価」列データの各セル、という指定。
    「単価」の列番号が変わっても追従するようにした場合、一行が最も長い記述となる。
  5. 4.の方式をラベル名ではなく、テーブル内の列番号「5」で指定。
    昔は、末尾の「Cells」が要ると知らず、いつも「何で動かないんだろう?」と不思議に思っていた。


個人的にいつも使うのは、2.の書き方かな。

参考まで。