VBA

【VBA】テーブルの存在をチェックする方法(既にテーブル化されているかどうかを判断する)

このページでわかること

表がテーブル化しているかどうかをチェックすることができます。
これを利用してプログラムを止めずにテーブル化をさせることができます。

覚えること
  1. 既にテーブル化しているところを再度テーブル化するとエラーでプログラムが止まる。

  2. テーブル化しているかどうかは
    If テーブルオブジェクト Is Nothing Then
    の条件式で判断させる。

こんにちは、hokkyokunです。

テーブルは便利なんですが、テーブルじゃない方が都合がいい場合もあるかと思います。
そんなときはテーブル化したり、解除したりして使い分けることもあると思いますが、
注意が必要です。

テーブルは既にテーブル化しているところは再度テーブル化するとエラーが起こります。
そのため、今どういう状態なのかを事前にチェックすることが重要となってきます。

チェック方法をご紹介します。
やってみましょう!

既にテーブル化しているところを再度テーブル化すると・・・

下記の表で既にテーブル化しているところをテーブル化してみます。

Sub テーブル化している場所を再度テーブル化()

ActiveSheet.ListObjects.Add , ActiveSheet.Range("A1").CurrentRegion, , xlYes

End Sub

エラーが生じます。
既にテーブル化しているので、再度テーブル化を命令すると止まってしまいました。

テーブル化しているかどうかチェックする方法

結論いいますと、

テーブルがNothingかどうかをチェックする

です。

具体的にどうことかを説明すると、

  1. 既にテーブル化されている場合
  2. テーブル化されていない場合

に分けて下記のプログラムを動かしてみます。
どのような状態になるか見ていきたいと思います。

Sub テーブル化されているかどうかチェック()

Dim table As ListObject
Set table = ActiveSheet.Range("A1").ListObject

If table Is Nothing Then
    MsgBox ("テーブル化されていません")
Else
    MsgBox ("テーブル化されています。" & vbCrLf & _
            "テーブル名は " & table.Name & " です。")
End If

End Sub

①既にテーブル化されている場合

プログラムを動かすと
既にテーブル化されているので、IF文はElseの方を動かし、
止まらずに処理できました。

②テーブル化を解除してやってみると

テーブル化していないので、IF文のTrueのほうを処理しました。

テーブル化していないところを変数に入れるとNothingが返ってくる

どうしてこんなことになるのかというと

  1. テーブルオブジェクトをセルの位置で指定し、
  2. そこをオブジェクト変数に代入すると
  3. (テーブル化していない場合、)Nothingが返ってくる

からです。

つまり

テーブル化していない=オブジェクト変数がNothingになる

という構図が成り立ち、

Nothingかどうかをif文で判断させている
というわけです。

テーブル化していようがしていまいが、止まらずにオブジェクト変数に格納する方法

上記の方法を応用すれば、テーブル化していようがしていまいが、
処理をとめずにオブジェクト変数に入れて、処理をすることが可能となります。

上記と同様に

  1. テーブル化されている場合
  2. テーブル化していない場合

で処理を見ていきましょう。
プログラムは以下のようになります。

Sub テーブル化して処理()

Dim table As ListObject

If ActiveSheet.Range("A1").ListObject Is Nothing Then
    ActiveSheet.ListObjects.Add(, ActiveSheet.Range("A1").CurrentRegion, , xlYes).Name = "果物お買い物リスト"
End If

Set table = ActiveSheet.Range("A1").ListObject

MsgBox ("オブジェクト変数tableのテーブル名は: " & table.Name & vbCrLf & _
        "オブジェクト変数tableの範囲は: " & table.Range.Address)

End Sub

※上記はコード数を減らすためにオブジェクト変数に入れる前にIF文でNothingかどうかを判断しています。

気持ち悪ければ下記のプログラムを使用してください。

Sub テーブル化して処理()

Dim table As ListObject
Set table = ActiveSheet.Range("A1").ListObject

If table Is Nothing Then
    ActiveSheet.ListObjects.Add(, ActiveSheet.Range("A1").CurrentRegion, , xlYes).Name = "果物お買い物リスト"
    Set table = ActiveSheet.Range("A1").ListObject
End If

MsgBox ("オブジェクト変数tableのテーブル名は: " & table.Name & vbCrLf & _
        "オブジェクト変数tableの範囲は: " & table.Range.Address)

End Sub

①テーブル化されている場合

下記のように既にテーブル化されています。

このような状態でプログラムを動かしてみます。

エラーが生じず、テーブルもしっかり維持されています。

②テーブル化していない場合

こんな感じでただの表があります。
これをテーブル化してみましょう。

プログラムを動かすと、
こんな感じでテーブル化できました。

まとめ

テーブル化しているところをさらにテーブル化するとエラーになる。

エラーを回避するためには
テーブルオブジェクトをオブジェクト変数に格納して
Nothingになるかどうか判断する。

構文は:



If テーブルオブジェクト Is Nothing Then
    ActiveSheet.ListObjects.Add , ActiveSheet.Range("A1").CurrentRegion, , xlYes
End If

テーブルを使う際、
特にテーブル化したり、解除したりスイッチングをする場合なんかは重宝すると思います。

テーブルは面倒な処理も増えますが、
それを補ってあまりあるくらいメリットを含んでいるので、是非使ってください。

ではでは。