初めての犬飼い日記 -86ページ目

初めての犬飼い日記

シゲという名前の保護犬を飼うことになったアラフォーオッサンの記録です

 
久しぶりに 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
 
こんな感じで、テーブルが空っぽであることを判定しております。
数式の存在を無視できるのであれば、ここまでやる必要はありませんが、そうでない場合は案外面倒臭いのです滝汗