0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VBAでExcelシートデータをSQLで取得する方法

Posted at

はじめに

 Excelのシート範囲を指定して、その中のデータをSQLを使って取得する方法を知ったので備忘録として載せます。

サンプルコード

下記はExcelシートでSQLを使用して値を取得し、別シートにデータを出力するサンプルコードです。

Sub GetExcelDataWithSQL_1()
    Dim cn As Object
    Dim rs As Object
    Dim strSQL As String
    Dim strConnection As String
    Dim ws As Worksheet

    ' ADO Connectionオブジェクトを作成
    Set cn = CreateObject("ADODB.Connection")
    
    ' 接続文字列を設定
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
    
    ' 接続を開く
    cn.Open strConnection
    
    ' SQLクエリの作成
    strSQL = "SELECT * FROM [取得$A1:C10]"  ' シート名と範囲を指定
    
    ' ADO Recordsetオブジェクトを作成してSQLクエリを実行
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open strSQL, cn, 1, 1 ' CursorTypeとLockTypeを指定(1=adOpenKeyset, 1=adLockReadOnly)

    ' 結果をシートに出力
    Set ws = ThisWorkbook.Sheets.Add
    ws.Name = "SQL Results1"
    ws.Cells(1, 1).CopyFromRecordset rs

    ' クリーンアップ
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
End Sub

解説

  • 接続文字列
     通常のSQLと同じで、下記の文字列を使い、接続したいExcelファイルを指定します。
' 接続文字列を設定
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
  • SQL文
    下記のSQL文で通常と違うのが、テーブル名が"[シート名$データ範囲]"となっており、この範囲がDBで言うテーブルの部分になります。
' SQLクエリの作成
    strSQL = "SELECT * FROM [取得$A1:C10]"  ' シート名と範囲を指定

あとは通常のDB操作と同じ要領でRecordsetオブジェクトに値を受け取り、出力などの操作後、接続を閉じるだけです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?