vba:EXCELSQL

内容

  • シートのテーブル(テーブル化は不要みたい)に対して、SQLで処理を行う。
' Excelシートのデータに対して、SQLで対象を取得する
Sub ExeSql()

    ' 処理対象ファイルのフルパス
    Dim fileFullName As String
    fileFullName = ThisWorkbook.FullName

    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
    
    cn.PROVIDER = "MSDASQL"
    cn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}; " & "DBQ=" & fileFullName & "; ReadOnly=False;"
    cn.Open

    Dim rs As ADODB.recordset
    Set rs = New ADODB.recordset

    Dim lineLimit As String: lineLimit = 4000
    Dim sqlStr As String
    sqlStr = ""
    
    ' シンプルSQL
    sqlStr = sqlStr & " select"
    sqlStr = sqlStr & "     *"
    sqlStr = sqlStr & " from"
    sqlStr = sqlStr & "     [Sheet1$]"
    sqlStr = sqlStr & " where"
    sqlStr = sqlStr & "         LINE_LIMIT > " & lineLimit

' joinしてみる
'    sqlStr = sqlStr & " select a.* from [Sheet1$] a left join [Sheet5$] b on a.ITEM_CD = b.ITEM_CD"
'    sqlStr = sqlStr & " where b.LINE_NO = 2"
    
' case(IIF)してみる・・・IIFを使ったときは、どうやらカラムを個別で指定する必要がある。・・・*とかを使った場合は、先頭にIIFの検索結果が出力されるみたいです
'    sqlStr = sqlStr & " select LINE_CD, LINE_LIMIT, ITEM_CD, IIF(LINE_LIMIT = 500,1,IIF(LINE_LIMIT = 1000,2,3)) as ll  from [Sheet1$] "
    
    Debug.Print sqlStr
    
    ' adOpenStatic・・・よくわからないが、静的カーソル(他ユーザーによる追加・更新・削除は反映されない)と説明があり、テーブルロックしている?ってこと?
    rs.Open sqlStr, cn, adOpenStatic
   
    ' 抽出結果を出力・・・縦
'    Sheet1.Range("G2").CopyFromRecordset rs

    ' 抽出結果を出力・・・横
    Dim fieldCnt As Integer: fieldCnt = rs.Fields.Count
    Dim recordCnt As Long: recordCnt = rs.RecordCount
    ' これで、横に格納してるみたいです
    ReDim recordArray(fieldCnt, recordCnt) As Variant: recordArray = rs.GetRows
    
    'シートに出力
    ' 横に出力する場合は、起点のセルだけ指定だとうまくいかないみたいなので、出力するRangeを指定する。
    Sheet1.Range(Cells(1, 7), Cells(fieldCnt, recordCnt + 6)) = recordArray
    
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing

End Sub