久しぶりに EXCEL VBA のお話です。
EXCEL にはテーブルという非常に便利な機能があります。
このテーブルに VBA でアクセスしたい場合には ListObject として取得して触っていくこととなります。
最初はちょっととっつきにくいと感じることもあるでしょうけれど、こういうもんだと慣れるしかないかな…と。
この ListObject を触っている過程で、テーブルが空っぽであるかどうかの判定をする必要に迫られました。
通常であれば、ListObject.DataBodyRange Is Nothing の判定で問題ないのですが、テーブルに数式が設定されているとこの判定をすり抜けてしまうのです
フォローさせてもらっているブログで、こんな記事を見掛けまして…
以前に苦労したのを思い出したのです![]()
そんなわけで、私が苦肉の策として考えたのが、下記の方法です。
テーブルが空っぽかどうかを判定する
Public Function IsTableEmpty(ByRef tbl As ListObject) As Boolean ' DataBodyRange が Nothing の場合は Empty と判断する If tbl.DataBodyRange Is Nothing Then IsTableEmpty = True Exit Function End If ' 行数が1より多い場合は Empty ではないと判断する If tbl.DataBodyRange.Rows.Count > 1 Then IsTableEmpty = False Exit Function End If ' ヘッダの1つ下の行(データの1行目)を取得する Dim fst As Range Set fst = tbl.HeaderRowRange.Offset(1, 0) ' 1行分の全セルを順次チェックしていく Dim rng As Range For Each rng In fst ' 数式が設定されていないセルであり、なおかつ… ' セルの値が Empty ではないセルが見つかったら… ' テーブルは Empty ではないと判断する If Not rng.HasFormula And Not IsEmpty(rng) Then IsTableEmpty = False Exit Function End If Next IsTableEmpty = True End Function
こんな感じで、テーブルが空っぽであることを判定しております。
数式の存在を無視できるのであれば、ここまでやる必要はありませんが、そうでない場合は案外面倒臭いのです


