Excelシートをテーブルとして、SQLで抽出

Const adOpenKeyset = 1
Const adLockReadOnly = 1

Private Sub getData()

    Dim dbCon As Object
    Dim dbRes As Object
    Dim dbCols As Object
    Dim strSQL As String

    ' 接続を確立する
    Set dbCon = CreateObject("ADODB.Connection")
    dbCon.Provider = "Microsoft.Jet.OLEDB.4.0"
    dbCon.Properties("Extended Properties") = "Excel 8.0"
    dbCon.Open ThisWorkbook.FullName
    
    ' テーブル名,条件を指定してレコードセットを取得する
    strSQL = ""
    strSQL = strSQL & " select"
    strSQL = strSQL & "     *"
    strSQL = strSQL & " from"
    strSQL = strSQL & "     [TBL1$]"
    strSQL = strSQL & " where"
    strSQL = strSQL & "         pk = 001"
    Set dbRes = CreateObject("ADODB.Recordset")
    
    dbRes.Open strSQL, dbCon, adOpenKeyset, adLockReadOnly
    
    wSheet1.Range("G2").CopyFromRecordset dbRes
    
    dbRes.Close
    Set dbRes = Nothing
    dbCon.Close
    Set dbCon = Nothing

End Sub

テーブル名は [シート名$] だそうで。
参照設定はしたくなかったので、CreateObjectしてます。


ただ、今回unionしたり、not exist したり、ネストしたSQLを組んだらメモリ喰いきった。
多分組んだSQLがヘボかったからだと思うけど、パフォーマンスってどうなんだろ。
TODO行き。


あと、普段oracleどっぷりのSQLだったので、ちとめんどかった。
minusとかintersectってないのね。