【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_モジュールについては下記記事参照。
実行(標準モジュール)
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をラッパークラスで包んでもいいかも。
発展
置換を入れ子にすれば、サブクエリ的な記述もごちゃごちゃせずに書ける。