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

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

Wendy02の回答

  • ベストアンサー
  • 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を行うことでエラーを回避することができました。 色々とありがとうございました。 また何かありましたらよろしくお願いいたします。

関連する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でオブジェクトの指定の仕方や、自動計算のメソッドに上記コードだと問題があるのでしょうか? どなたかわかる方、回答をお願い致します。