AccseeVBA Excelエクスポート 決まったファイル名で上書き保存する
スポンサーリンク
AccessからエクスポートしたEXCELファイルが何のファイルだったか分からなくなってしまうのを避けるため、毎回決まったファイル名(一定のルールのもとで作成されたファイル名)をエクスポートする仕様を作ってみました。
繰返し同じ処理を行う可能性を考慮して、既に同じファイル名のEXCELファイルを作成している場合には上書き保存し、ない場合には新規で作成します。
既に同じファイル名のEXCELファイルを作成している場合、ファイルを開いていると上書き保存できないので、EXCELファイルを開いているかどうかのチェックを含めています。
※EXCELファイルが開いているかチェックするためのコード参考サイト
ACCESSからExcelファイルが開いているか調べる | SugiBlog
以下、VBAの記述。
'------------------------------------------------------------------------------------------
Function transferXlsData
Dim db As Database
Dim rst As Recordset
Dim strSQL As String
Dim filename As String 'エクスポートするフルパスのファイル名
Dim filename1 As String '抽出期間を定義するためのサブネーム
Dim rc As Integer
Set db = CurrentDb
strSQL = "SELECT MIN([テーブル名].[日付]) AS 開始日, MAX([テーブル名].[日付]) AS 終了日 FROM [テーブル名];"
Set rst = db.OpenRecordset(strSQL,dbOpenSnapshot)
If Dcount("*","テーブル名") = 0 then
MsgBox "エクスポートするデータがありません。"
Exit Sub
End If
'抽出データの日付開始&終了をファイル名の一部としている
filename1 = Format(rst!開始日,"yyyymmdd") & "_" & Format(rst!終了日,"mmdd")
’Accessファイルと同じフォルダへのエクスポート
filename = CurrentProject.Path & "¥エクセル出力データ_" & filename1 & ".xlsx"
If Dir(filename, vbDirectory) <> "" Then
Dim xlsApp As Object
Dim xlsbook As Object
Set xlsApp = CreateObject("Excel.Application")
Set xlsbook = xlsApp.Workbooks.Open(filename)
If xlsbook.readonly Then
MsgBox "エクセル出力データ_" & filename1 & "という名前のエクセルファイルが開いています。" & vbCrLf & _
"このファイルを上書きするので、一旦ファイルを閉じるか、開いているファイルを別の名前で保存して終了してください。"
xlsbook.Close
xlsApp.Application.Quit
Set xlsbook = Nothing
Set xlsApp = Nothing
Exit Sub
End If
xlsbook.Close
xlsApp.Application.Quit
Set xlsbook = Nothing
Set xlsApp = Nothing
'既に保存されているEXCELファイルを一旦削除する
Kill filename
End If
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12xml, "[テーブル名]",filname,"エクセル出力データ_" & filename1",1
rc = Dcount("*","テーブル名")
MsgBox rc & "レコードのデータをこのファイルと同じフォルダに出力しました。" & vbcrlf & _
"出力ファイル名:エクセル出力データ_" & filename1 & ".xlsx"
End Function
'---------------------------------------------------------------------------------------------------
以上、VBA記述終わり。
出力するフォルダ名を指定した方がいいかなと思いますが、フォルダ指定するのに1工程入ってしまうので、個人的にはAccessと同じフォルダへの自働出力を重宝しています。
※フォルダ名を指定する場合の参考サイト