Microsoft Access 掲示板

エクセルへの出力

4 コメント
views
4 フォロー

いつもお世話になっております。

Set xls = CreateObject("Excel.application")
With xls
(中略)
   strsavebookpath = strSaveBookDir & strFileName & ".xlsx"
    .activeworkbook.saveas strsavebookpath
End With

Exit_here:
   xls.Quit
   Set xls = Nothing
   Exit Sub

Err_Handler:
   MsgBox Err.Number & vbtab & Err.Description, vbExclamation
   Resume Exit_here

このような感じでエクセルにデータを入れて、saveasで保存しようと思います。
エラーがないときは正しく動きます。
保存先のパス(strsavebookpath)に同一ファイル名が存在する場合のダイアログに、
「いいえ」あるいは「キャンセル」を入力した場合、
あるいは、同一ファイル名が存在する上に、それが開かれている場合などに、
エラー1004が吐き出され、xls.quitのところで、vbaで作ったエクセルを保存するか問われてしまいます。

エラー1004が出るような問題が起こったとき、vbaで作ったエクセルが自動的に破棄されるようにする方法はありますか?
あるいは、もっと良い(あるいは自然な)保存の方法がありますか?

nokonoko
作成: 2023/07/13 (木) 16:05:28
通報 ...
1
hiroton 2023/07/14 (金) 08:57:45 5534d@f966d

保存しようと思ってたもの破棄しちゃっていいんですか?
https://www.google.com/search?q=VBA Excelを保存しないで終了する方法

名前変えるのがNGなら適当にメッセージボックスだして待機させた後保存処理やり直したらいいんじゃない?

2
nokonoko 2023/07/14 (金) 11:04:08 3e2e6@54883 >> 1

回答ありがとうございます。

     On Error GoTo Err_Handler2
    .activeworkbook.saveas strsavebookpath

Err_Handler2:
MsgBox "適当なメッセージ"
xls.close SaveChanges:=False

Resume Exit_Here

としてみたのですが、xls.closeが間違っているということで、うまくいきませんでした。
初歩的な質問で申し訳ございませんが、どうすればよかったのでしょう。

3
hiroton 2023/07/14 (金) 12:06:31 5534d@f966d

やり直す≒繰り返す動きをさせるのでループ処理を組みます

    Dim 成功 As Boolean
    
    On Error Resume Next
    Do Until 成功
        .activeworkbook.SaveAs strsavebookpath
        
        If Err <> 0 Then
            On Error GoTo -1
            MsgBox "ファイルが保存できませんでした。現在使用中でないか確認してください"
        Else
            成功 = ture
        End If
    Loop
    On Error GoTo 0

※これだけだと「保存できない」限り無限ループになることには注意が必要です

4
nokonoko 2023/07/14 (金) 13:19:49 3e2e6@54883 >> 3

回答ありがとうございました。
頂いたコードを参考にして勉強します。