テーブルを特定する3つの方法


VBAでテーブルを操作するには「このテーブルを○○する」などのように、テーブルを特定しなければなりません。テーブルを特定する考え方は3通りあります。

  1. セルからテーブルを特定する
  2. シート上のテーブルを特定する
  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」の順番でテーブルを作成すると、次のようになります。

  • 1つめに作ったテーブル→「テーブル1」→ListObjects(1)
  • 2つめに作ったテーブル→「テーブル2」→ListObjects(2)
  • 3つめに作ったテーブル→「テーブル3」→ListObjects(3)

ここで2番目に作った「テーブル2」を普通の範囲に変換して、テーブルではなくすと、番号は次のように繰り上がります。

  • 1つめに作ったテーブル→「テーブル1」→ListObjects(1)
  • 3つめに作ったテーブル→「テーブル3」→ListObjects(2)

ワークシート上に複数のテーブルを作り、それぞれをVBAから操作するようなときは、この方法が便利です。そのときはおそらく、番号ではなく名前で指定するのが安全でしょうね。

テーブルの名前を使って特定する

テーブルにはユニーク(重複しない)名前が必要です。この名前とRangeを使って、次のように指定できます。もし、テーブルの名前が「テーブル1」だったら

Range("テーブル1")

このとき「テーブル1」はアクティブシートでなくてもかまいません。テーブルに設定される名前はブックレベルの名前として定義されます。ブックレベルの名前は、どのワークシートからでも操作できます。

使い分けの指針

サーバーからエクスポートされたテーブルや、読み込んだCSVをテーブルに変換したときなどは、一般的にテーブルの左上がセルA1になります。そんなときは「Range("A1").ListObject」と書くのが簡単で早いでしょう。ワークシートに複数のテーブルを作成して、それぞれを個別に操作するようなときは「Sheets("Sheet1").ListObjects("テーブル1")」のように書くといいでしょう。「Range("テーブル1")」の書き方は、慣れているRangeを使って指定できますが、この書き方だとできない操作もあります。それぞれ一長一短ですから、ケースに応じて使い分けてください。

  1. セルからテーブルを特定する Range("A1").ListObject
  2. シート上のテーブルを特定する Sheets("Sheet1").ListObjects("テーブル1")
  3. テーブルの名前を使って特定する Range("テーブル1")

のうち、1.と2.は基本的に同じです。その後の書き方にも違いはありません。対して3.は、1.と2.とはまったく違う書き方をします。そこで、ここでは1.と3.の書き方を解説します。