Excel VBAエキスパート体験記20(Table取得2)

VBAエキスパート

前回はExcel VBAエキスパートスタンダードのTable取得について勉強しました。
前回までの記事はこちら

今回は7章のTableの操作の続きについてレポートしていきます。今回で2回目です。
 
なお理解が間違っているところもあるかもしれませんがわからない人と同じ視点に立てるのは今しかないので細かいところはご容赦ください。
間違えに気づいたら修正していきます(笑)。
 

<今回の目的>

Tableの行と列データ取得について理解する

今回の勉強方法
  1. 8章を精読する

  2. 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の操作も変わります。表とテーブルどちらの方法でもスムーズに扱えるようになればいいなと思います。

コメント

タイトルとURLをコピーしました