VBAでテーブルを操作するには「このテーブルを○○する」などのように、テーブルを特定しなければなりません。テーブルを特定する考え方は3通りあります。
順番に解説しますが、どれがいいではなく、ケースに応じて使い分けてください。それぞれ一長一短です。
これは、テーブル内に存在している任意のセルを使って
任意のセル.ListObject
と書きます。もし、テーブルの左上がセルA1だったら
Range("A1").ListObject
です。サーバーのデータをExcelにエクスポートしたときなどは、テーブルの左上はセルA1になります。そうしたテーブルでしたら、この書き方が簡単です。
ワークシートには、複数のテーブルを作成できます。
Sheet1に、上図のような2つのテーブルがあったとします。最初に作ったのは左のテーブルで名前は「テーブル1」です。2つめに作ったのが右のテーブルで名前を「テーブル2」とします。このとき、両者はそれぞれ、次のように特定できます。
Sheets("Sheet1").ListObjects(1) ''左 1つめに作ったテーブル Sheets("Sheet1").ListObjects(2) ''右 2つめに作ったテーブル
あるいは、テーブルの名前を使って
Sheets("Sheet1").ListObjects("テーブル1") ''左 1つめに作ったテーブル Sheets("Sheet1").ListObjects("テーブル2") ''右 2つめに作ったテーブル
のように指定することもできます。
何番目に作ったかを指定する数値は、現在存在しているテーブルによって変化します。たとえば「テーブル1」→「テーブル2」→「テーブル3」の順番でテーブルを作成すると、次のようになります。
ここで2番目に作った「テーブル2」を普通の範囲に変換して、テーブルではなくすと、番号は次のように繰り上がります。
ワークシート上に複数のテーブルを作り、それぞれをVBAから操作するようなときは、この方法が便利です。そのときはおそらく、番号ではなく名前で指定するのが安全でしょうね。
テーブルにはユニーク(重複しない)名前が必要です。この名前とRangeを使って、次のように指定できます。もし、テーブルの名前が「テーブル1」だったら
Range("テーブル1")
このとき「テーブル1」はアクティブシートでなくてもかまいません。テーブルに設定される名前はブックレベルの名前として定義されます。ブックレベルの名前は、どのワークシートからでも操作できます。
サーバーからエクスポートされたテーブルや、読み込んだCSVをテーブルに変換したときなどは、一般的にテーブルの左上がセルA1になります。そんなときは「Range("A1").ListObject」と書くのが簡単で早いでしょう。ワークシートに複数のテーブルを作成して、それぞれを個別に操作するようなときは「Sheets("Sheet1").ListObjects("テーブル1")」のように書くといいでしょう。「Range("テーブル1")」の書き方は、慣れているRangeを使って指定できますが、この書き方だとできない操作もあります。それぞれ一長一短ですから、ケースに応じて使い分けてください。
のうち、1.と2.は基本的に同じです。その後の書き方にも違いはありません。対して3.は、1.と2.とはまったく違う書き方をします。そこで、ここでは1.と3.の書き方を解説します。