• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ExcelVBAのコードで上書き保存)

ExcelVBAコードで上書き保存できないエラーの解決方法

このQ&Aのポイント
  • ExcelVBAのコードで上書き保存時に「実行時エラー1004 ファイルを保存できません」というエラーが発生してしまう状況です。
  • 自分のPCではエラーが発生せず保存できるのですが、友人のPCでは上記のエラーが発生します。
  • コードはExcelを非表示にしてフォームで処理を行い、上書き保存後にExcelを終了しています。解決方法をご教示いただけませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 はっきり言って、ひじょうに難しいです。失敗するとApplication エラーを出すというので、こういうのは、いくらVBAに自信のある人でも、コードのロジックとは違いますから、試行錯誤しかないと思います。 >友人のPC環境に問題があるのかもしれません。 今は、ブック自体の属性を調べるオプションしかつけてありませんが、Excelを保存してあるフォルダの属性を調べる方法がありますね。 ThisWorkbook_Openで CreateObject("Scripting.FileSystemObject").GetFolder(ThisWorkbook.Path).Attributes で、この出てきた値の Mod 16 で、0 なら、OK ですが、それ以外なら、ダメとか? >保存してからユーザフォームを閉じたほうがよいのでしょうか? そうですね。一応、私の考えのでは、保存してから、Userformを閉じるのだと思います。というか、UserForm のMe は、UserForm自身ではなく、そのモジュール全体を指しているような気がします。 しかし、今、保存の前にUnload Me を試してみましたが、ExcelのApplication を残さずに終わりましたね。(これは、予想外というのか、難しいです) 終了の場合は、どうやら、Applicationが常駐している間はコードが実行しているようですね。ただ、それは私の感覚ですと、コード的には不自然のような気がします。せいぜい、Application 全体の指示(DisplayAlertなど)だけに限るような気がしますね。 ちなみに、お書きになったコードを元にして、オプションをつけてみました。 Private Sub CommandButton2_Click() If MsgBox("システムを終了します。" & Chr(13) & "よろしいですか?", vbOKCancel, "確認") = vbCancel Then Exit Sub On Error GoTo ErrHandler If ThisWorkbook.Saved = False Then  ThisWorkbook.Save '上書き保存 End If Unload Me Application.Quit 'Excel終了 Exit Sub ErrHandler:  MsgBox Err.Number & " : " & Err.Description  Resume Next End Sub 最後に、今回は、つぎはぎだらけにしてしまったけれども、こういうExcelの不明なトラブルに巻き込まれるような雰囲気の時には、私は、全面的にコードを換え、考え方自体も換えることにしています。 それと、大事なことなんですが、相手の人のOS とExcelのVersion は、こちらが供給するものと同じであることがエラーを回避する条件の1つです。(そんなことは言われなくてもご存知ですよね。すみません)

noname#30686
質問者

お礼

教えていただいたコードを元に、再度作成してみました。 やはりUnloadMeの前に保存しないとエラーが発生することがあるみたいです。 先に保存してからUnloadMeを行うことでエラーを回避することができました。 色々とありがとうございました。 また何かありましたらよろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 しばらく、こちらで実際に試行錯誤してみました。 Excelを起動させて、UserFormのみにさせているわけですね。直接の原因はわかりません。実行時エラーの場合、その環境が原因になっていますから、保存できない環境になっている可能性がつよいです。 それから、終了時に不明なApplication エラーが発生します。おそらく、UserForm自体が残るような気がします。また、複数のブックを立ち上げているときも良くないような気がします。非表示でユーザーフォームだけを出す場合には、やはり単独のブックに限るのかもしれません。また、UserForm自体をユーザーが終了してしまうと、Excelがオブジェクトとして残ってしまいます。 >ExcelVBAのコードで上書き保存時 >「実行時エラー1004 ファイルを保存できません」 これ自体は、はっきりしませんが、当面は、その部分は、ActiveWorkbook.Save のみを修正してみることにしました。はっきりしたわけではありません。 私の思いつく範囲で、直せる部分は直してみました。 Private Sub CommandButton2_Click() On Error GoTo ErrHandler If ThisWorkbook.Saved = False Then  ThisWorkbook.Save '上書き保存 End If Unload Me Application.Quit 'Excel終了 Exit Sub ErrHandler:  MsgBox Err.Number & " : " & Err.Description  Resume Next End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)  If CloseMode = 0 Then  Cancel = 1  MsgBox "[閉じる]は使えません、[ボタン]で終了してください。", 64  End If End Sub の二つが必要ですね。 以下のようにして、ブックのチェックが必要かもしれません。例えば、CD-ROMから供給された場合などが原因で、属性が変ってしまっていることがあります。ユーザーが保存していない他のブックを開けている場合も、UserFormの立ち上げをストップさせます。 Private Sub Workbook_Open() Dim i As Integer Dim w As Workbook i = CreateObject("Scripting.FileSystemObject").GetFile(ThisWorkbook.FullName).Attributes  If i Mod 16 = 1 Then   MsgBox "このブックは書き込みできませんので、ユーザーフォームの立ち上げを中止します。", 64   Exit Sub End If For Each w In Application.Workbooks  If w.Windows(1).Visible = True And w.Name <> ThisWorkbook.Name Then   If w.Saved = True Then    w.Close   Else    MsgBox "他のブックも開いていますから、ユーザーフォームの立ち上げは中止します。", 64: Exit Sub   End If  End If Next w Application.Visible = False 'Excel非表示 UserForm1.Show End Sub

noname#30686
質問者

お礼

お忙しい中、色々と試していただきありがとうございます。 早速コードのほうを修正し友人のPCで試して見たいと思います。 システム自体、余計な操作をできないようにUserFormのみで動かしています。 以前UserFormを使用しないで同様のコードを使用したときも同なじエラーが発生しました。 もしかしたら友人のPC環境に問題があるのかもしれません。(原因はわかりませんが・・・) 補足ですが、今までのコードは Private Sub CommandButton2_Click() Dim msg As Integer msg = MsgBox("システムを終了します。" & Chr(13) & "よろしいですか?", vbOKCancel, "確認") If msg = vbOK Then Unload Me Else Exit Sub End If ActiveWorkbook.Save Application.Quit End Sub としていたので、保存してからユーザフォームを閉じたほうがよいのでしょうか? 色々とお世話になりますがよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ExcelVBAによる 上書き保存時の処理について

    ExcelVBAによる 上書き保存時の処理について 先日、作業で使用するエクセルにて下記のようにSheet1というシートを保存するVBAを作成しました。 しかし、格納したいパスに同名のファイルが存在した場合、上書き確認メッセージ上で上書き保存をするか否かを確認するのですが この時、「いいえ」を押下してしまうとそのまま、保存せず処理を終了してしまいます。 私としては、上書き保存を確認する際に「いいえ」を選択するともう一度「ファイルの新規保存」ダイアログを表示し、ファイル名の変更等を行えるようにしたいのですが、どの様にすれば良いのでしょうか? 一応、その時のコードを下記に掲載します。 Sheets("Sheet1").Copy Sheets("Sheet1").Cells.Select SaveName = Application.GetSaveAsFilename(filefilter:="Microsoft Office Excelブック,*.xls") If SaveName <> "False" Then 'キャンセルが押下されたならば、一時保存用のExcelファイルを閉じる If Dir(SaveName) <> "" Then If MsgBox("同名ファイルがあります。上書きしますか?", vbYesNo) = vbNo Then ActiveWorkbook.Close End If End If End If ActiveWorkbook.SaveAs Filename:=SaveName, FileFormat:=xlNormal End

  • ExcelVBAで、クローズボタンの処理

    お世話になります。 通常、アプリ側ではApplication.DisplayAlerts = Falseにして、 ブックの終了などを制御しているのですが、 Excelのクローズボタンを押して終了するときは、この DisplayAlertsが有効にならないらしく、必ず上書き確認の ダイアログが表示されてしまいます。 これを… 1.上書き保存ダイアログを表示させない(上書き自体させない) 2.Excel本体のクローズボタンを無効にする 3.Excel本体のクローズボタンを非表示にする …などのどれかの方法を教えてください。 尚、現在はブックを閉じる直前で、下記のようなコードで 試みていますが、うまくいきません。 Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.DisplayAlerts = False End Sub 以上、宜しくお願い致します。

  • ユーザーフォームの切り替えについて・・・

    UserForm1とUserForm2の2つのユーザーフォームがあります。 UserForm1の中にあるcommandButton1をクリックすると、UserForm2が表示される仕組みになっています。 (ちなみに、UserForm2にもコマンドボタンがあり、クリックするとUserForm1に戻るようになっています) UserForm1の方に、 Private Sub CommandButton1_Click() UserForm2.Show 0 Unload UserForm1 End Sub UserForm2の方に、 Private Sub CommandButton1_Click() UserForm1.Show 0 Unload UserForm2 End Sub と記述してあります。 ところが、それぞれのユーザーフォームには、閉じると同時にブックが閉じるように Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) ActiveWorkbook.Save 'ブックを保存 ActiveWorkbook.Close 'ブックを閉じる Application.Quit 'excelを終了 End If End Sub というコードを記述しているため、UserForm1からUserForm2へ移るときにブックが閉じてしまいます。 右上の「×」を押したときだけブックを閉じるようにしたいのですが、どういうコードを書いたらいいのですか? 宜しくお願いします。(*´Д`人)

  • ExcelVBAで指定時間に自動で終了ボタンを押す

    Excel2003を使用しております。 とあるExcelファイルを開くと、フォームを開く設定にして有ります。 朝の8時にフォームの終了ボタンの処理を自動で行いたいので、コードを追加しました Private Sub Workbook_Open() Worksheets("シート1").Activate Range("A1").Select frmテスト.Show vbModeless Application.OnTime TimeValue("08:00:00"), "cmd終了" '←追加したコード End Sub frmテストのフォームにあるコードはこんな感じです Private Sub cmd終了_Click() コードたくさん~ End Sub 朝の8時にfrmテストのフォームにある、終了ボタンのコードを実行させたいのですが、8時になるとエラーが出ます。 マクロ "C\Documents and Setting\ユーザー名\デスクトップ\ファイル名.xls'!cmd終了'が見付かりません。 と、表示されます。 宣言の仕方が悪いのでしょうか?

  • ワークシートを上書き保存したい

    Excel2003でマクロ初心者です。 以下のコードでシートを上書き保存したいのですが 次々と複写され、上書きされません。どうコードをかえたらよろしいでしょうか。 Private Sub CommandButton10_Click() Dim wb As Workbook On Error Resume Next '開いて作業中の場合。 Set wb = Workbooks("最新表.xls") On Error GoTo 0 If wb Is Nothing Then Set wb = Workbooks.Open(ThisWorkbook.Path & "\表の保存箱\最新表.xls") End If Worksheets("確定").Copy after:=Workbooks("21年計算01.xls").Sheets("総括表") 'Workbooks("最新表.xls").Close End Sub 最新表.xlsは文字通り、最新ですので常に上書きしたいのです。

  • ExcelVBA:フォームの閉じるボタン「×」を消す方法

    ExcelVBAで、ユーザーフォームの閉じるボタン「×」を使用できなくなる方法は以下のコードで教わったのですが「×」自体消す方法ってあるでしょうか? Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then Cancel = 1 End Sub 回答よろしくお願いします。

  • 読み取り専用ファイルを上書き保存するには?

    作業中は常に読み取り専用状態にしておき、保存の時にだけ読み取り専用の属性を解除して 上書き保存し、上書き保存が終了次第、即座に読み取り専用状態に戻す運用を考えております。 (1)ThisWorkbookのOpenプロシージャでファイルを読み取り専用状態に設定 (2)ThisWorkbookのBeforeSaveプロシージャで    読み取り専用を解除→上書き保存→読み取り専用状態に再設定    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)      '上書き保存モードを解除      Cancel = True      '上書きしますか?のコメントを非表示に設定      ActiveWorkbook.Saved = True      'ファイルが読み取り専用であった場合は以下の処理を実行      If ActiveWorkbook.ReadOnly Then        'ブックの読み取り専用設定を解除        ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite, Notify:=True        '上書き保存を実行        Application.DisplayAlerts = False        Application.EnableEvents = False        ActiveWorkbook.Save        Application.EnableEvents = True        Application.DisplayAlerts = True        'ブックを読み取り専用に設定        ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly      'ファイルが読み取り専用でなかった場合は以下の処理を実行      Else        '上書き保存を実行        Application.DisplayAlerts = False        Application.EnableEvents = False        ActiveWorkbook.Save        Application.EnableEvents = True        Application.DisplayAlerts = True      End If    End Sub 上記のマクロで上手くいきそうなのですが、下記2点が解決できずに困っております。 (1)上書き保存ボタンをクリックすると下記のメッセージが毎回表示されてしまいます。   『読み取り専用です。コピーを保存するには名前を付けて保存して下さい。』   OKボタンをクリックしたりEscやEnterキーを押下さえすればこの警告メッセージを回避でき   以後は思った通りの処理を行えるのですが、できればこのメッセージを表示したくない。 (2)上書き保存のために読み取り専用を解除した際、他のオペレーターがエクセル起動中、   または上書き保存中であった場合、エラーが発生してしまうことと思われます。   この問題の解決策をご存知の方、是非教えて下さいますよう宜しくお願いします。 当初は共有ブックとしての運用の方向で進めていたのですが、既に2人のオペレーターが ファイルにアクセスしている状態で、3人目のオペレーターがファイルを開くと読み取り専用と なってしまったり、保存時に時間がかかり過ぎたり、保存時のエラーが頻繁に発生したりといった 状況でしたので共有ブックとしての運用は諦めました。(シート50枚、ファイルサイズ3.5MB程度) 使用PCはXPでExcel2003です。以上、宜しくお願いします。

  • VBA ユーザーフォームのコードについて

    下記の2つのコードの意味について教えて下さい。 Private Sub CommandButton1_Click() If ComboBox1 = "" Then ComboBox1.SetFocus・・・・・1 Exit Sub End If Application.Run (ComboBox1.List(ComboBox1.ListIndex))・・・2 End Sub 1と2がわかりません。 Private Sub UserForm_Initialize() TB = Array("マクロ1", "マクロ2", "マクロ3") Me.ComboBox1.List = TB End Sub 「Private Sub UserForm_Initialize()」と「Array」がわかりません。 よろしくお願いします。

  • Excel VBA ブックが閉じれない

    Excel2016を使用してVBAを使用しています。 VBA初心者ですが、よろしくお願いします。 質問内容は以下になります。 EXCEL起動と同時にUserFormを表示させ、UserForm上のコマンドボタンから ダイアログボックスを表示し、他ブックを開く処理なのですが、 他ブックを開くまでは問題ないのですが、他ブックが閉じれない状態になります。 Private Sub Workbook_Open() UserForm1.Show End Sub Private Sub UserForm_Initialize()  各種処理 End Sub Private Sub CommandButton1_Click() Dim OpenFileName As String SetCurrentDirectory (Worksheets(1).Cells(11, 3)) OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") Workbooks.Open OpenFileName End Sub UserFormを閉じると開いたブックも閉じることが可能です。 タスクマネージャーから強制的に終了しようとすると、以下メッセージが出ます。 ”開いているダイアログボックスがあるため、Microsoft Excel を終了できません。[OK]をクリックしてから、Microsoft Excelに切り替えてダイアログを閉じて下さい。" UserFormを閉じないで他ブックを閉じるには、どうすれば宜しいでしょうか。 申し訳ございませんがご教授下さい、よろしくお願いいたします。

  • Excelでのエラー

    こんにちわ。 今、以下のようなコードを実行した際に、エラーがでてしまい困っています。 ************************************************** Private Sub CommandButton3_Click() '再計算を自動に設定 With Application .Calculation = xlCalculationAutomatic .MaxChange = 0.001 End With ActiveWorkbook.PrecisionAsDisplayed = False UserForm4.Hide UserForm3.Show End Sub ************************************************* (この処理の前には、手動計算に設定しています。) このコードでExcel2000では、問題なく処理がされるのですが、 Excel97では、 「Calculationメソッドは失敗しました。"_Application"オブジェクト」 というようなエラーが出ます。 コード的にはExcel2000で問題なく動いているので、 大丈夫だと思うのですが、Excel97でオブジェクトの指定の仕方や、自動計算のメソッドに上記コードだと問題があるのでしょうか? どなたかわかる方、回答をお願い致します。

このQ&Aのポイント
  • 中学生のビオラ演奏者が、肩当てが合わずに辛い思いをしています。演奏会で左手が燃えるように痛み、肩こりもひどくなるため困っています。肩当てが外れたり傷だらけになることもあり、演奏ができずに困っています。早急に肩当てを合わせる方法を教えてほしいとのことです。
  • ビオラを演奏している中学生が肩当ての問題で困っています。演奏会で左手が痛み、肩こりがひどいため日常生活にも影響があります。また、演奏会のたびに肩当てが外れたり傷だらけになるため、状況が改善したいと考えています。肩当てを早急に合わせる方法を教えていただきたいとのことです。
  • 中学生のビオラ演奏者が肩当ての問題で困っています。演奏中に左手が痛み、肩こりもひどくなります。肩当てが合わずに外れたり傷だらけになることもあり、演奏の妨げになっています。演奏会が迫っており、早急に肩当てを合わせる方法を知りたいとのことです。
回答を見る

専門家に質問してみよう