AccessVBAから、「開いているExcelブック/シートを1つにまとめて保存」という処理を行いたいです。
「AccessVBAでExcelを操作する」を参考にしつつ以下のようなコードを書いてみたのですが、「実行時エラー9:インデックスが有効範囲にありません」のエラーが出てしまいます。エラー箇所は、「For i = 2 to ExApp.Workbooks(ExApp.Workbooks.Count)」です。
以下のコードをどのように改善すれば、エラーを解消し想定通りの動きをすることが出来るのでしょうか?
Sub AccessVBAでExcelブックを1つにまとめて保存() Dim ExApp As Object Set ExApp = CreateObject("Excel.Application") ExApp.Visible = True 'Excelの可視化 Dim DesktopPath As String, FilePath As String, WSH As Variant Set WSH = CreateObject("Wscript.Shell") DesktopPath = WSH.SpecialFolders("Desktop") FilePath = DesktopPath & "\保存名.xlsx" 'メイン処理 Dim i As Integer '開いているExcelブック数を数えて、2個目以降のブックのSheets(1)を1個目のブックに追加して閉じていく For i = 2 to ExApp.Workbooks(ExApp.Workbooks.Count) ExApp.Workbooks(i).Worksheets(1).copy _ Before:=ExApp.Workbooks(1).Sheets(1) 'ワークブック1にシートを追加してコピー ExApp.Workbooks(i).Close next i ExApp.Workbooks(1).SaveAs FileName:=FilePath ExApp.Workbooks(1).Close ExApp.Quit Set ExApp = Nothing Set WSH = Nothing MsgBox "完了しました。" End Sub
追記:2021/01/11 15:30
事前にエクセルを開いているコードはこちらです。
標準モジュールに書いた以下のコードを、フォームのクリック時イベントで複数回よびだしてExcelブックを開いています。
Function ExcelData(frm As Form) On Error GoTo Err_cmdExcel_Click 'DAOで抽出結果のクローンを作成 Dim xlsx As Object 'Excel.Applicationを代入するオブジェクト変数 Dim wkb As Object 'Excel.Wookbookを代入するオブジェクト変数 Dim rst As DAO.Recordset '現在のレコードセットを入れる変数 Dim idx As Long 'フィールド数変数 Dim j As Long ' 最終行取得用 Const xlUp As Integer = -4162 Set rst = Nothing 'データリストの初期化 Set rst = frm.RecordsetClone 'フォームのレコードセットのクローンを代入 'レコードが存在しない場合、処理を中止 If rst.BOF = True And rst.EOF = True Then MsgBox "出力出来るデータがありません。", vbOKOnly + vbExclamation, "出力不可" 'レコードセットを閉じる rst.Close: Set rst = Nothing Exit Function End If 'レコードが存在する場合、Excelに出力 'レコードセットの最初のデータにカーソルを移動 rst.MoveFirst 'Excelファイルを内部的に作成 Set xlsx = CreateObject("Excel.Application") '作成されたExcelファイルにワークブックを追加 Set wkb = xlsx.Workbooks.Add() '追加されたワークブックに、レコードセットのデータをコピー With wkb.Worksheets(1) For idx = 1 To rst.Fields.Count .cells(1, idx).Value = rst.Fields(idx - 1).Name Next .Range("A2").CopyFromRecordset Data:=rst 'レコードセットを閉じる rst.Close: Set rst = Nothing 'Excelデータを表示 xlsx.Visible = True xlsx.UserControl = True 'メモリに展開されたExcel用オブジェクト変数を開放 Set wkb = Nothing Set xlsx = Nothing Exit_cmdExcel_Click: Exit Function Err_cmdExcel_Click: MsgBox "エラーのため、Excelへ出力できません。" & vbCrLf & "一旦フォームを閉じ、再度トライしてください。" & vbCrLf & Err.Number & Err.Description, _ vbOKOnly + vbCritical, "Excel出力不可!" Resume Exit_cmdExcel_Click End Function