スポンサーリンク
はじめに:ソースコード
今回は、Excel VBAでテーブル(のセル範囲)を選択する方法について、簡単に解説する。
私自身、あまり好んでVBAでテーブルを扱うことはしないけどね。
まず、サンプルのソースコードを書く。
これのコメントにおおよその解説も書いてあるけど、合わせて読んでもらえればと思う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Option Explicit Sub test() Dim ws As Worksheet Dim LST As ListObject 'まずシートをwsとする。 Set ws = ActiveSheet '*******************リストオブジェクトLSTをセットする方法3つ。******************* '方法(1)シート内のテーブル(リストオブジェクト)のうち1個めという指定の仕方。 Set LST = ws.ListObjects(1) '方法(2)テーブルの名前を具体的に指定する方法。 Set LST = ws.ListObjects("予算テーブル") '方法(3)テーブルが含まれるセルをどこか1箇所起点として指定する方法。 'ListObjectsではなく、sが付かないListObjectになることに注意。 Set LST = ws.Cells(1, 1).ListObject '******************************************************************************** 'タイトル部分も含むテーブル全体を選択 LST.Range.Select 'タイトル部分を除くテーブル全体を選択 LST.DataBodyRange.Select 'タイトル部分を選択 LST.HeaderRowRange.Select End Sub |
テーブル(ListObject)の指定方法
Excelのテーブルは、VBAではListObjectというものに属する。
実際のマクロ作成では、いちいちそれを変数にセットしなくても良いといえば良い場合もあるが、なるべく変数にセットして分かりやすくしよう。
今回の例では、テーブルを、LSTという変数にセットする方式で解説してるけど、セットの仕方は主に3種類といったところ。
方法(1)シート内のテーブルのうち1個めという指定。
Set LST = ws.ListObjects(1)
ということで、シート内に存在するListObjectsのうち1個めを適当に指定するという方法。
もちろん、シート内にテーブル(ListObjects)が複数あってそのうち3つ目を指定したい場合なら
1 |
Set LST = ws.ListObjects(3) |
とかなるが、そもそもシート内にテーブルを複数設置するなんて真似をすることはまず無いだろうし、すべきでもない。
だから、シート内のテーブルは必ず1個しか無いという前提のもと、この方法(1)をメインに使っても良いかとは思う。
方法(2)テーブルの名前を具体的に指定する方法。
Excelのテーブルには名前を設定することができるし、ぜひ付けるべきだ。
その名前を「予算テーブル」としたなら、
1 |
Set LST = ws.ListObjects("予算テーブル") |
といった形で名前を指定することでテーブルのオブジェクトを指定できる。
ただ私は、テーブルの名前は気分次第というかしっくり来なくて変えることが多いので、この方法はあまり使わない。
敢えてこの方法を使うなら、「テーブル名はシート名と同じ名前にする」という規則を設けた上で名前を固定して扱う時にやったりする。
方法(3)テーブルが含まれるセルをどこか1箇所起点として指定する方法
たとえば上図のテーブルなら
1 |
Set LST = ws.Cells(1, 1).ListObject |
とすれば指定できるし、Cells(5, 3)つまりC5セルなどもテーブル範囲に含まれるから
1 |
Set LST = ws.Cells(5, 3).ListObject |
みたいにも指定できる。
テーブル範囲に含まれているセルを、どこか指定すれば良いわけで、これも無難な方法の一つだろう。
そしてこの指定方法だけは、ListObjectの最後にsの文字が付かない。
前に示した方法(1)(2)は、
ws.ListObjects
ということで、wsというWorksheet=シートに対し付属していたから「s」が最後に付いた。
それに対し方法(3)は
ws.Cells(1, 1).ListObject
と、ws(Worksheet=シート)より小さな単位であるCells(=セル)に付属するから「s」が最後に付かない。
・・・と書いてみたけど、実際にソースコードを書いて、エラーを出したりしてみれば身に付くだろう。
テーブルのセル範囲の選択
ソースコードの後半に書いたように、テーブル(ListObject)を指定した後に、具体的にそのデータが入っているセル範囲などを選択するには、DataBodyRangeなど独特の指定方法がある。
1 2 3 4 5 6 7 8 9 |
'タイトル部分も含むテーブル全体を選択 LST.Range.Select 'タイトル部分を除くテーブル全体を選択 LST.DataBodyRange.Select 'タイトル部分を選択 LST.HeaderRowRange.Select |
単に
LST.Select
と書いてもエラーになるだけで、テーブルのセル範囲を選択することはできない。
「Range」「DataBodyRange」など何かしら付けなければならない。
ちなみに、テーブルには集計行というのを特別に設けることもあって、それは
LST.TotalsRowRange.Select
と指定する。使う機会は少ないのではと思うが。
スポンサーリンク