Excel VBA テーブル内の範囲や特定位置を指定する方法

テーブル操作第4回目です。テーブル内の位置を指定する方法について解説します。

くるみこ
くるみこ

初回で少しだけテーブルの特定情報を取得するコードを紹介しましたが、その他にもたくさんあるので改めて解説したいと思います。

テーブルを操作する上で絶対に必要な部分ですよね!
ここをしっかり覚えないと先に進めないということですね。
よろしくお願いしますm(_ _)m

【この記事でわかること
・ListObject の各プロパティの種類や特徴がわかります

・テーブル内の色々な部分の範囲やセルの指定方法がわかります

前回記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ

くるみこ
くるみこ

前回記事は、テーブルスタイルの変換方法の記事でした。変更したい見本スタイルを選択して変更できる方法がわかります。覗いてみてね(^^)/

テーブル内の情報は全てListObjectにあります

・ListObjectオブジェクトがテーブル全体を表しています。
・テーブル内の情報は ListObject から全て取得できます。

ListObject のプロパティー別範囲やセルの指定方法

ListObject から情報を得るには各プロパティの特徴を知っておく必要があります。

ListObject.Range

ListObject.Range はテーブル内の(見出しを含めた)全体、全セルを表しています
・Range(“A1”).ListObject.Range.Select は、テーブルの全てを選択するということです。
・Range(“A1”).ListObject.Range(1) は、範囲内の一番目のセルを表しています。
・では、Range(“A1”).ListObject.Range(2) は、範囲内のどのセルを表しているでしょうか?

・答えは2番目なので1番目の右隣りのセル⓶でした。
行を右へ順番に移動して行き、最後までに行き着いたら次の行の一番左に移動します

ListObject.DataBodyRange

DataBodyRange は ListObject オブジェクトのプロパティで、読み取り専用です。
・Range(“A1”).ListObject.DataBodyRange はテーブル内の(見出しを含まない)データ全体を表しています
・ListObject.Range と同じくセルが何番目なのか、その順番は行を右へ順番に移動して行き、最後までに行き着いたら次の行の一番左に移動します。

・見出し行を含まない分「1行分」ずれる計算です。

ListObject.HeaderRowRange

ListObject.HeaderRowRange プロパティは、「リストのヘッダー行の範囲を表すRangeオブジェクトを返します。 取得のみ可能な Range 値です」となっています。
・列見出し(タイトル)行部分を表しています。範囲は1行だけです。
・順番を表す数字は左から右の順に増えていきます。
・Range(“A1”).ListObject.HeaderRowRange(2) は、2番目の見出しセルを表します。

ListObject.TotalsRowRange

・これは「集計行」の一行を表します。
テーブルに集計行が表示されている場合限定です
Rangeの範囲は集計行を含みますが、DataBodyRangeは集計行を含みません
・Range(“A1”).ListObject.TotalsRowRange(3) は、集計行3番目のセルを表します。

ListObject.ListColumns

ListObject の ListColumns プロパティは、「ListObjectオブジェクト内のすべての列を表す ListColumnsコレクションを返します。 読み取り専用です」
・ListColumnsコレクションとは、ListColumnオブジェクトの集合で、テーブル内のすべての列が含まれています。
・ListColumnオブジェクトは、ListColumnsコレクションのメンバーで、テーブル内にある 1 つの列を表します。
・Range(“A1”).ListObject.ListColumns(3) は、3番目の列を表します。番号を指定しない場合は全ての列ということになります。左から数えた順番の番号で特定の列を指定できます。
・Range(“A1”).ListObject.ListColumns(3).DataBodyRange とすると、見出し行を含まない3番目の列を表します。
・Range(“A1”).ListObject.ListColumns(3).Rangeとした場合、見出し行を含めた3番目の列を表していることになります。

ListObject.ListRows

ListObject の ListRows プロパティは、「指定されたListObject オブジェクト内のすべてのListRow オブジェクトのコレクションです」
・各 ListRow オブジェクトは、ListRowsコレクションのメンバーで、テーブル内の 1 つの行を表します。
ListRows の場合、ListColumns と違って見出し行の部分は含みませんので注意してください。
・Range(“A1”).ListObject.ListRows(3) は、3番目の行を表します。番号を指定しない場合は全ての行ということになります。上から数えた順番の番号で特定の行を指定できます。
・Range(“A1”).ListObject.ListRows(3).Select として実行するとエラーになります。
・ListRows のメソッドは「Add」だけしかありません。したがって、次のように書きます。
・Range(“A1”).ListObject.ListRows(3).Range.Select これで3行目をセレクトできました。
・Range(“A1”).ListObject.ListRows(3).Range(2).Select で3行目の二つ目のセルがセレクトできました。このように、ListRowオブジェクトには Range をつけます

最後に動作テストしてみます

使ったコード

・ステップ実行させるためにメッセージボックスを挟んだだけです。
・少し見づらいですが、イメージできるように実行GIF画像を貼っておきます。

Sub sample()
On Error Resume Next

Range("A1").ListObject.Range.Select
MsgBox "Range(""""A1"""").ListObject.Range.Select を実行しました!"

Range("A1").ListObject.Range(1).Select
MsgBox "Range(""""A1"""").ListObject.Range(1).Select を実行しました!"

Range("A1").ListObject.Range(5).Select
MsgBox "Range(""""A1"""").ListObject.Range(5).Select を実行しました!"

Range("A1").ListObject.DataBodyRange.Select
MsgBox "Range(""""A1"""").ListObject.DataBodyRange.Select を実行しました!"

Range("A1").ListObject.HeaderRowRange.Select
MsgBox "Range(""""A1"""").ListObject.HeaderRowRange.Select を実行しました!"

Range("A1").ListObject.HeaderRowRange(2).Select
MsgBox "Range(""""A1"""").ListObject.HeaderRowRange(2.Select を実行しました!"

Range("A1").ListObject.TotalsRowRange(3).Select
MsgBox "Range(""""A1"""").ListObject.TotalsRowRange(3).Select を実行しました!"

Range("A1").ListObject.ListRows(3).Range.Select
MsgBox "Range(""""A1"""").ListObject.ListRows(3).Range.Select を実行しました!"

Range("A1").ListObject.ListColumns(3).DataBodyRange.Select
MsgBox "Range(""""A1"""").ListObject.ListColumns(3).DataBodyRang.Select を実行しました!"

Range("A1").ListObject.ListColumns(3).Range.Select
MsgBox "Range(""""A1"""").ListObject.ListColumns(3).Range.Select を実行しました!"

On Error GoTo 0
End Sub

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
「いつも汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーを念頭に記事を書いています。
サンプルファイルを用意していますのでよろしければお使いください(^^)

まとめと感想など

くるみこ
くるみこ

ListObject の各プロパティの違いがわかったと思います。
普通のセル範囲の指定方法とは違っていますので「テーブル」を扱う場合は頭を切り替えて考える必要があります。

少し混乱しています。Range の使い方はしっかり覚えないといけませんね! なんだか少し不安になってきました(^^; よく復習しておきます。

くるみこ
くるみこ

それでは、次回以降は各プロパティについてもう少し具体的に説明していくように考えていきますね(^^)

【今回分かったことは】
・ListObject の各プロパティの種類や特徴がわかりました
・テーブル内の色々な部分の範囲やセルの指定選択方法がわかりました


ブログランキングに参加しています(^^) 応援よろしくお願いしますm(_ _)m

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください