ExcelでADOを使った接続とデータ取得の方法です。
メモ:xlsファイルをODBCへ登録する場合は、データの範囲を「名前の定義」で登録しておく。
'変数宣言の強制続きを読む
Option Explicit
'ODBC接続文字列(※ODBCは事前に登録しておくこと)
Const strConnectDB As String = "DSN=MYDB;UID=***;PWD=***;"
'データ貼り付け先頭セル
Const topCell As String = "A4"
'==================================================
'ADOを使ったデータベースへの接続とデータ取得
'[参照設定]ダイアログで「Microsoft ActiveX Data Objects x.x Library」をOnにする。
'
'引数
' (1)sourceTable 取得元テーブル名
' (2)targetSheet (参照渡し)データ挿入先シート
'==================================================
'呼び出し元記述例
'Private Sub CommandButton1_Click()
' Dim sheet As Worksheet
' Set sheet = ThisWorkbook.Sheets("AAAA出力先")
' sheet.Cells.NumberFormatLocal = "@"
' 'データの取得とシートへの貼り付け
' Call getTable("AAAA_TABLE", sheet)
'End Sub
'==================================================
Public Sub getTable(ByVal sourceTable As String, ByRef targetSheet As Worksheet)
On Error GoTo ErrorRoutine
'ADOオブジェクトを作成(参照設定:Microsoft ActiveX Data Object2.x Library)
Dim ADO As New ADODB.Connection
Dim RS As New ADODB.Recordset
'データベースへ接続
Call ADO.Open(strConnectDB, , , adConnectUnspecified)
'テーブルのレコードを取得
Call RS.Open(sourceTable, ADO, adOpenForwardOnly, adLockReadOnly, adCmdTable)
'レコード取得
If Not RS.EOF Then
'(1)一括で張り付ける方法
'targetSheet.Range(topCell).CopyFromRecordset RS
'(2) (1)でエラーとなる場合は一件ずつ挿入する方法を採用
Do Until RS.EOF
Dim row As Integer
Dim clm As Integer
For clm = 0 To RS.Fields.count - 1
Dim curCell As Range
Set curCell = targetSheet.Range(topCell).Offset(row, clm)
'日付型は書式を指定
If RS.Fields(clm).Type = adDBTimeStamp Then
curCell.Value = Format(RS.Fields(clm).Value, "yyyy/mm/dd hh:nn:ss")
ElseIf RS.Fields(clm).Type = adDate Or RS.Fields(clm).Type = adDBDate Then
curCell.Value = Format(RS.Fields(clm).Value, "yyyy/mm/dd")
ElseIf RS.Fields(clm).Type = adDBTime Then
curCell.Value = Format(RS.Fields(clm).Value, "hh:nn:ss")
Else
curCell.Value = RS.Fields(clm).Value
End If
Next clm
RS.MoveNext
row = row + 1
Loop
End If
'データベースから切断
ADO.Close
Set RS = Nothing
Set ADO = Nothing
'呼び出しも度へ戻る
Exit Sub
'例外処理
ErrorRoutine:
Dim msg As String
msg = "ADO接続でエラーが発生しました" & vbNewLine & vbNewLine
msg = msg & "エラーコード : " & Err.Number & vbNewLine
msg = msg & "エラーメッセージ : " & Err.Description
Call MsgBox(msg, vbOKOnly + vbExclamation, "エラー")
End
End Sub