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