ExcelVBAでSQL

Option Explicit

Private Const adOpenDynamic As Long = 2
Private Const adLockOptimistic As Long = 3
Private Const adStateClosed As Long = 0

Sub ボタン1_Click()

Call DataGetSample

End Sub


'==========================================================
'コネクションを返す
'==========================================================
Public Function GetXLSConnection(DataSource As String) As Object

Dim objCN As Object
Dim strCNString As String


Set objCN = CreateObject("ADODB.Connection")


strCNString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=" & DataSource & ";" _
& "Extended Properties=""Excel 8.0;" _
& "HDR=Yes"";"


objCN.Open strCNString


Set GetXLSConnection = objCN

End Function


'==========================================================
'レコードセットを返す
'==========================================================
Public Function GetRecordSet(strSQL As String, objCN As Object) As Object

Dim objRS As Object


Set objRS = CreateObject("ADODB.Recordset")


objRS.Open strSQL, objCN, adOpenDynamic, adLockOptimistic


Set GetRecordSet = objRS


End Function


'==========================================================
'コネクション破棄
'==========================================================
Public Sub CloseConnection(objCN As Object)


If objCN.State <> adStateClosed Then

objCN.Close

End If


Set objCN = Nothing

End Sub


'==========================================================
'レコードセット破棄
'==========================================================
Public Sub CloseRecordSet(objRS As Object)


If objRS.State <> adStateClosed Then

objRS.Close

End If


Set objRS = Nothing


End Sub


'==========================================================
'データ取得サンプル
'==========================================================
Public Sub DataGetSample()

Dim objCN As Object
Dim objRS As Object
Dim strSQL As String
Dim lngF As Long


'コネクションを確立
Set objCN = GetXLSConnection(ThisWorkbook.FullName)


'抽出条件を作成
strSQL = "SELECT" '抽出フィールド(項目)を指定
strSQL = strSQL & " [header1]"
strSQL = strSQL & ", [header2]"
strSQL = strSQL & ", [header3]"
strSQL = strSQL & " FROM [Sheet1$]" 'データテーブルを指定
strSQL = strSQL & " WHERE 1 = 1" '抽出条件
'strSQL = strSQL & " AND [header2] >= 20"
strSQL = strSQL & " AND [header3] = '東海'"


'抽出実行
Set objRS = GetRecordSet(strSQL, objCN)


'抽出結果を出力
With wsXLSDataBase

With .Range("rngXDB_DataTop")


'出力エリアにある既存データを消去
.CurrentRegion.ClearContents


'フィールド(項目)名を出力
For lngF = 0 To objRS.Fields.Count - 1

.Offset(, lngF).Value = objRS.Fields(lngF).Name

Next lngF


'データを出力
.Offset(1).CopyFromRecordset objRS


End With

End With


END_PROC:

'レコードセットを閉じる
Call CloseRecordSet(objRS)

'コネクションを閉じる
Call CloseConnection(objCN)


End Sub