VBA/DB(Access)よりエクセルに抽出
参照(Access):https://ateitexe.com/access-database1//
参照(Access設定時の参考):http://www.serpress.co.jp/access/vba018.html
参照(Excel):http://www.sanryu.net/acc/tips/tips252.htm
参照(Excel出力):http://d.hatena.ne.jp/ogohnohito/20111123/p1
参照(PASS):https://kozy-twt.hatenadiary.org/entry/20101013/1286958157
参照(パラメーター):https://selifelog.com/blog-entry-159.html
実験対象バージョン:Excel2007、Access2007
参照(Access設定時の参考):http://www.serpress.co.jp/access/vba018.html
参照(Excel):http://www.sanryu.net/acc/tips/tips252.htm
参照(Excel出力):http://d.hatena.ne.jp/ogohnohito/20111123/p1
参照(PASS):https://kozy-twt.hatenadiary.org/entry/20101013/1286958157
参照(パラメーター):https://selifelog.com/blog-entry-159.html
実験対象バージョン:Excel2007、Access2007
サンプル
Excel(VBA)よりAcessファイルを選び、データを抽出し、Sheetに貼り付けるものです。
Accessには、パスワード無と有で少し違います。
Accessには、パスワード無と有で少し違います。
Accessパスワード無
DB_Access_Exc
※メニューバーの[ツール(T)]→[参照設定(R)...]→「Microsoft ActiveX Data Objects ×× Library」にチェックを入れて[OK]が必要です。
'*******************************************************
' クエリ実行後、エクセル書き出し
'
' sSQL : SQL文
' sDBname : DB名
' iGyo : Excel書き始め行数
' iRetu : Excel書き始め列数
'*******************************************************
Sub DB_Access_Exc(sSQL As String, sDBname As String, iGyo As Integer, iRetu As Integer)
'-----------------
' エクセル用
'-----------------
Dim xlsApp As Variant
Dim xlsWorkbook As Variant
Dim xlsSheet As Variant
Dim vExcelName As Variant
'-------------
' DB用
'-------------
Dim adoReco As ADODB.Recordset
Dim adoCn As New ADODB.Connection
Dim cmd As ADODB.Command
'================
' 初期化
'================
'DB設定--------------------------------------
'ADOコネクションオブジェクトを作成
Set adoCn = CreateObject("ADODB.Connection")
'ADOレコードセットオブジェクトを作成
Set adoReco = CreateObject("ADODB.Recordset")
'Access2007以降
adoCn.Provider = "Microsoft.ACE.OLEDB.12.0"
'データベースの場所
adoCn.ConnectionString = "Data Source=" & sDBname
adoCn.Open
Set cmd = New ADODB.Command
'データセット
With cmd
.ActiveConnection = adoCn
.CommandText = sSQL
.Parameters.Refresh
End With
'エクセル設定-------------------------------
'インスタンスの生成
Set xlsApp = CreateObject("excel.application")
'ブックを新規で開く
Set xlsWorkbook = xlsApp.Workbooks.Add
'シートを変数に設定
Set xlsSheet = xlsWorkbook.Worksheets(1)
'=====================================================
' レコード読み込み
'=====================================================
adoReco.Open cmd, , adOpenKeyset, adLockOptimistic
'=======================================================
' レコードセットの内容をワークシートに出力
'=======================================================
xlsSheet.Cells(iGyo, iRetu).CopyFromRecordset adoReco
'EXCELを表示
xlsApp.Visible = True
'保存場所を指定
vExcelName = xlsApp.Application.GetSaveAsFilename(Title:="DB抽出完了", InitialFileName:="×××.xlsx", FileFilter:="Excel ブック (*.xlsx), *.xlsx")
'保存
If vExcelName <> False Then
xlsWorkbook.SaveAs FileName:=vExcelName, FileFormat:=xlOpenXMLWorkbook
End If
'ブックを閉じる
xlsWorkbook.Close
'初期化
adoReco.Close
adoCn.Close
Set adoReco = Nothing
Set xlsSheet = Nothing
Set xlsWorkbook = Nothing
Set xlsApp = Nothing
End Sub
呼び出す用
sSQL:sql文を記載して下さい。1:Excel開始行、開始列の順番で記載して下さい。
Accessは、2003のmdbでも確認しています。
Sub Main_Kaiseki()
Dim sSQL As String 'SQL文
Dim sDBname As String 'DBファイル名
Dim sBook As String '新規ブックのファイル名
'=====================
' ファイル指定
'=====================
With Application.FileDialog(msoFileDialogOpen)
.Title = "ファイルの選択"
'ファイルの種類を設定
.Filters.Clear
.Filters.Add "Microsoft Access (*.mdb,*.accdb)", "*.mdb,*.accdb"
'複数ファイル選択を許可しない
.AllowMultiSelect = False
'ダイアログを表示
If .Show = -1 Then
'ファイルが選択されたとき
'そのフルバスを返り値に設定
sDBname = Trim(.SelectedItems.Item(1))
Else
'ファイルが選択されなければ長さゼロの文字列を返す
sDBname = ""
End If
End With
'SQL文
sSQL = "select * from aa"
'エクセル貼り付け
Call DB_Access_Exc(sSQL, sDBname, 1, 1)
End Sub
VBA/DB(Access)よりエクセルに抽出 in PASS編
DB_Access_Exc_Pass
Accessにパスワードがある場合
'*******************************************************
' クエリ実行後、エクセル書き出し
'
' sSQL : SQL文
' sDBname : DB名
' sDBPass : DBパスワード
' iGyo : Excel書き始め行数
' iRetu : Excel書き始め列数
'*******************************************************
Sub DB_Access_Exc_Pass(sSQL As String, sDBname As String, sDBPass As String, iGyo As Integer, iRetu As Integer)
'-----------------
' エクセル用
'-----------------
Dim xlsApp As Variant
Dim xlsWorkbook As Variant
Dim xlsSheet As Variant
Dim vExcelName As Variant
'-------------
' DB用
'-------------
Dim adoReco As ADODB.Recordset
Dim adoCn As New ADODB.Connection
Dim cmd As ADODB.Command
'================
' 初期化
'================
'DB設定--------------------------------------
'ADOコネクションオブジェクトを作成
Set adoCn = CreateObject("ADODB.Connection")
'ADOレコードセットオブジェクトを作成
Set adoReco = CreateObject("ADODB.Recordset")
'Access2007以降
adoCn.Provider = "Microsoft.ACE.OLEDB.12.0"
'データベースの場所
adoCn.ConnectionString = "Data Source=" & sDBname
& ";Jet OLEDB:Database Password=" _
& sDBPass
adoCn.Open
Set cmd = New ADODB.Command
'データセット
With cmd
.ActiveConnection = adoCn
.CommandText = sSQL
.Parameters.Refresh
End With
'エクセル設定-------------------------------
'インスタンスの生成
Set xlsApp = CreateObject("excel.application")
'ブックを新規で開く
Set xlsWorkbook = xlsApp.Workbooks.Add
'シートを変数に設定
Set xlsSheet = xlsWorkbook.Worksheets(1)
'=====================================================
' レコード読み込み
'=====================================================
adoReco.Open cmd, , adOpenKeyset, adLockOptimistic
'=======================================================
' レコードセットの内容をワークシートに出力
'=======================================================
xlsSheet.Cells(iGyo, iRetu).CopyFromRecordset adoReco
'EXCELを表示
xlsApp.Visible = True
'保存場所を指定
vExcelName = xlsApp.Application.GetSaveAsFilename(Title:="DB抽出完了", InitialFileName:="×××.xlsx", FileFilter:="Excel ブック (*.xlsx), *.xlsx")
'保存
If vExcelName <> False Then
xlsWorkbook.SaveAs FileName:=vExcelName, FileFormat:=xlOpenXMLWorkbook
End If
'ブックを閉じる
xlsWorkbook.Close
'初期化
adoReco.Close
adoCn.Close
Set adoReco = Nothing
Set xlsSheet = Nothing
Set xlsWorkbook = Nothing
Set xlsApp = Nothing
End Sub
そのため、37~39行目の引数にsDBPassが増えます。
呼び出す用
最初の呼び出し用を上記に変えて下さい。
Sub Main_Kaiseki()
Dim sSQL As String 'SQL文
Dim sDBname As String 'DBファイル名
Dim sBook As String '新規ブックのファイル名
'=====================
' ファイル指定
'=====================
With Application.FileDialog(msoFileDialogOpen)
.Title = "ファイルの選択"
'ファイルの種類を設定
.Filters.Clear
.Filters.Add "Microsoft Access (*.mdb,*.accdb)", "*.mdb,*.accdb"
'複数ファイル選択を許可しない
.AllowMultiSelect = False
'ダイアログを表示
If .Show = -1 Then
'ファイルが選択されたとき
'そのフルバスを返り値に設定
sDBname = Trim(.SelectedItems.Item(1))
Else
'ファイルが選択されなければ長さゼロの文字列を返す
sDBname = ""
End If
End With
'SQL文
sSQL = "select * from aa"
'エクセル貼り付け
Call DB_Access_Exc_Pass(sSQL, sDBname,sDBPass, 1, 1)
End Sub
VBA/DB(Access)よりエクセルに抽出 in パラメータ編
DB_Access_Exc_Para
パラメータ数に応じて「.Parameters(×)」を増やして下さい。そのため、引数にsPara×が増えます。
'*******************************************************
' クエリ実行後、エクセル書き出し
'
' sSQL : SQL文
' sDBname : DB名
' sPara1 : パラメータ1
' sPara2 : パラメータ2
' iGyo : Excel書き始め行数
' iRetu : Excel書き始め列数
'*******************************************************
Sub DB_Access_Exc_Para(sSQL As String, sDBname As String, sPara1 As String, sPara2 As String, iGyo As Integer, iRetu As Integer)
'-----------------
' エクセル用
'-----------------
Dim xlsApp As Variant
Dim xlsWorkbook As Variant
Dim xlsSheet As Variant
Dim vExcelName As Variant
'-------------
' DB用
'-------------
Dim adoReco As ADODB.Recordset
Dim adoCn As New ADODB.Connection
Dim cmd As ADODB.Command
'================
' 初期化
'================
'DB設定--------------------------------------
'ADOコネクションオブジェクトを作成
Set adoCn = CreateObject("ADODB.Connection")
'ADOレコードセットオブジェクトを作成
Set adoReco = CreateObject("ADODB.Recordset")
'Access2007以降
adoCn.Provider = "Microsoft.ACE.OLEDB.12.0"
'データベースの場所
adoCn.ConnectionString = "Data Source=" & sDBname
adoCn.Open
Set cmd = New ADODB.Command
'データセット
With cmd
.ActiveConnection = adoCn
.CommandText = sSQL
.Parameters.Refresh
.Parameters(0) = sPara1
.Parameters(1) = sPara2
End With
'エクセル設定-------------------------------
'インスタンスの生成
Set xlsApp = CreateObject("excel.application")
'ブックを新規で開く
Set xlsWorkbook = xlsApp.Workbooks.Add
'シートを変数に設定
Set xlsSheet = xlsWorkbook.Worksheets(1)
'=====================================================
' レコード読み込み
'=====================================================
adoReco.Open cmd, , adOpenKeyset, adLockOptimistic
'=======================================================
' レコードセットの内容をワークシートに出力
'=======================================================
xlsSheet.Cells(iGyo, iRetu).CopyFromRecordset adoReco
'EXCELを表示
xlsApp.Visible = True
'保存場所を指定
vExcelName = xlsApp.Application.GetSaveAsFilename(Title:="DB抽出完了", InitialFileName:="×××.xlsx", FileFilter:="Excel ブック (*.xlsx), *.xlsx")
'保存
If vExcelName <> False Then
xlsWorkbook.SaveAs FileName:=vExcelName, FileFormat:=xlOpenXMLWorkbook
End If
'ブックを閉じる
xlsWorkbook.Close
'初期化
adoReco.Close
adoCn.Close
Set adoReco = Nothing
Set xlsSheet = Nothing
Set xlsWorkbook = Nothing
Set xlsApp = Nothing
End Sub
呼び出す用
引数にsPara×が増えます。
Sub Main_Kaiseki()
Dim sSQL As String 'SQL文
Dim sDBname As String 'DBファイル名
Dim sBook As String '新規ブックのファイル名
'=====================
' ファイル指定
'=====================
With Application.FileDialog(msoFileDialogOpen)
.Title = "ファイルの選択"
'ファイルの種類を設定
.Filters.Clear
.Filters.Add "Microsoft Access (*.mdb,*.accdb)", "*.mdb,*.accdb"
'複数ファイル選択を許可しない
.AllowMultiSelect = False
'ダイアログを表示
If .Show = -1 Then
'ファイルが選択されたとき
'そのフルバスを返り値に設定
sDBname = Trim(.SelectedItems.Item(1))
Else
'ファイルが選択されなければ長さゼロの文字列を返す
sDBname = ""
End If
End With
'SQL文
sSQL = "select * from aa"
'エクセル貼り付け
DB_Access_Exc_Para(sSQL, sDBname,sPara1,sPara2, 1, 1)
End Sub