わーぷろおじさん

WordやOffice関連の小細工の備忘録。

【excel vba】Listobjectをテーブル名で掴み、SQLを投げる

概要

Listobjectの取得にはworksheetの指定から行わなければならず面倒なので、テーブル名だけで取得できるように関数を用意する。

テーブルに対してSQLを投げる際のSQL文をListobjectを起点として作成する方法を説明する。

コード

New_モジュール

Public Function Listobject(LstName_ As String) As Listobject
    Dim L As Listobject
    Dim S As Worksheet
    For Each S In ThisWorkbook.Worksheets
        For Each L In S.ListObjects
            If L.Name = LstName_ Then
                Set Listobject = L
                Exit Function
            End If
        Next
    Next
    MsgBox "リストオブジェクト" & LstName_ & "は存在しません"
End Function

※当方推奨のNew_モジュールについては下記記事参照。

word-ozisan.hatenablog.com

実行(標準モジュール)

Public Sub test()
'リストオブジェクトの取得
    Dim Lst As Listobject
    Set Lst = New_.Listobject("hoge")

'SQL文の作成
    Dim Tbl As String
  Tbl = "[" & Lst.Parent.Name & "$" & Lst.Range.Address(False, False) & "] "
    
    Dim s As String
    s = "SELECT * FROM @Tbl "
    s = Replace(s, "@Tbl", Tbl)
    Debug.Print s
End Sub

補足

SQL文の作成は関数を用意してもよいと思われる。もしくはListobjectをラッパークラスで包んでもいいかも。

発展

置換を入れ子にすれば、サブクエリ的な記述もごちゃごちゃせずに書ける。