前回はExcel VBAエキスパートスタンダードのTable取得について勉強しました。
前回までの記事はこちら
今回は7章のTableの操作の続きについてレポートしていきます。今回で2回目です。
なお理解が間違っているところもあるかもしれませんがわからない人と同じ視点に立てるのは今しかないので細かいところはご容赦ください。
間違えに気づいたら修正していきます(笑)。
<今回の目的>
Tableの行と列データ取得について理解する
-
8章を精読する
-
Tableのテーブル内の行と列データ取得の仕方をわかりやすく説明する
結論
いきなりですが結論です。
テーブル内の行と列から情報を取得するにはListColumnsコレクションとListRowsコレクションを用いる
次から詳しく説明します。
前回と今回で分けた理由
分けた理由はRangeプロパティとDataBodyRangeプロパティの存在です。
前回学んだこの2つはテーブル全体のデータと見出し行を除くデータ全体を取得するものでした。
ただこのプロパティはListRowsコレクションにもListColumnsコレクションにも存在します。
以下のオブジェクト構造は正しいです。
ただ最初は以下のように4つのRangeオブジェクトの配下にListColumnsとListRowsが存在していると考えていました。
その為以下のような書き方をしてエラーになっていました。
Range(“A1”).ListObject.DataBodyRange.ListRows(3)
DataBodyRangeの下にListRowsがいるわけではないんですよね。
オブジェクトの構造って大事だなと思いました。
それではそれぞれの取得方法について説明します。
テーブル内の列データの取得
Range(“A1”).ListObject.ListColumns(インデックス番号 or 列名).Rangeで見出し行を含む列のRangeオブジェクトを取得します。
Range(“A1”).ListObject.ListColumns(インデックス番号 or 列名).DataBodyRangeで見出し行を含まない列のRangeオブジェクトを取得します。
以下は全体のアドレスと特定セルのアドレスの取得方法です。For Eachステートメントも使用しています。
Sub Sample5()
'テーブル内の特定列のアドレスの取得(見出し行含む)
Dim adr1 As String
adr1 = Range("A1").ListObject.ListColumns(3).Range.Address
MsgBox adr1
'特定セルのアドレスの取得(見出し行含む)
Dim adr2 As String
adr2 = Range("A1").ListObject.ListColumns(3).Range(3).Address
MsgBox adr2
'テーブル内の特定列のアドレスの取得(見出し行含まない)
Dim adr3 As String
adr1 = Range("A1").ListObject.ListColumns(3).Range.Address
MsgBox adr1
'特定セルのアドレスの取得(見出し行含まない)
Dim adr4 As String
adr2 = Range("A1").ListObject.ListColumns(3).Range(3).Address
MsgBox adr2
'For Each~Nextでループを回す
Dim rng As Range
For Each rng In Range("A1").ListObject.ListColumns(3).Range
MsgBox rng.Address
Next
End Su
Addressプロパティでセルのアドレスを取得します。
Range(“A1”).ListObject.ListColumns(インデックス番号).Range(インデックス番号)で特定のセルの取得が可能です。
テーブル内の行データの取得
Range(“A1”).ListObject.ListRows(インデックス番号).RangeでRangeオブジェクトとして取得します。
以下は全体のアドレスと特定セルのアドレスの取得方法です。
Sub Sample6()
'テーブル内の特定行のアドレスの取得
Dim adr1 As String
adr1 = Range("A1").ListObject.ListRows(3).Range.Address
MsgBox adr1
'特定セルのアドレスの取得
Dim adr2 As String
adr2 = Range("A1").ListObject.ListRows(3).Range(3).Address
MsgBox adr2
'For Each~Nextでループを回す
Dim rng As Range
For Each rng In Range("A1").ListObject.ListRows(3).Range
MsgBox rng.Address
Next
End Sub
Range(“A1”).ListObject.ListRows(インデックス番号).Range(インデックス番号)で特定のセルの取得が可能です。
ここでのまとめ
テーブル内の行と列から情報を取得するにはListColumnsコレクションとListRowsコレクションを用いる
今回までで6つのオブジェクトから特定のセルを取得する方法を学びました。
データをテーブルとして取り扱うことでVBAの操作も変わります。表とテーブルどちらの方法でもスムーズに扱えるようになればいいなと思います。
コメント