お世話になります。
ExcelVBAのコードで上書き保存時
「実行時エラー1004 ファイルを保存できません」
となり止ってしまいます。
(自分のPCではエラーも発生せず保存できるのですが
友人のPCでは上記のエラーが発生する状況です)
コードはExcel起動時にExcel自体を非表示にし
フォームで入力等の処理を行い、上書き保存→Excel終了としています。
Private Sub Workbook_Open()
Application.Visible = False 'Excel非表示
userform1.Show
End Sub
Private Sub CommandButton2_Click() 'userform1
ActiveWorkbook.Save '上書き保存
Application.Quit 'Excel終了
End Sub
何とか解決する方法はないでしょうか?
よろしくお願いします。
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つです。(そんなことは言われなくてもご存知ですよね。すみません)
教えていただいたコードを元に、再度作成してみました。
やはりUnloadMeの前に保存しないとエラーが発生することがあるみたいです。
先に保存してからUnloadMeを行うことでエラーを回避することができました。
色々とありがとうございました。
また何かありましたらよろしくお願いいたします。
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
お忙しい中、色々と試していただきありがとうございます。
早速コードのほうを修正し友人の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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フランスの生年月日(jj/mm/aaaa)
-
VBAのリストボックスで、横スク...
-
筆王画面が終了できない
-
OpenOffice Basicで簡単な関数...
-
UserForm1.Showでエラーになり...
-
文字列内で括弧を使うには
-
ある1人の友達のLINEで、少しの...
-
シングルクォーテーションを含...
-
Excel vbaについての質問
-
LaTeXのエラーについて(コンパ...
-
ADO 「認証に失敗しました」
-
python-devがインストールでき...
-
オブジェクト型の変数にフォー...
-
ASPでこんなエラーが出たんです...
-
バッチファイルからVBA実行でエ...
-
「実行時エラー 9 インデックス...
-
ACCESSで値を代入できないとは?
-
期待する文字列
-
UWSCでエラー発生時の対処法に...
-
excel vba のエラー原因が分か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
文字列内で括弧を使うには
-
Pythonでの文字列からfloatへの...
-
String""から型'Double'への変...
-
On ErrorでエラーNoが0
-
お助けください!VBAのファイル...
-
2つほどお聞きしたいことがあり...
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
【VBAエラー】Nextに対するFor...
-
実行時エラー 438 の解決策をお...
-
実行時エラー'-2147467259(8000...
-
ACCESSで値を代入できないとは?
-
VBA データ(特定値)のある最...
-
「実行時エラー '3167' レコー...
-
【VB.NET】 パワポ操作を非表示で
-
マクロの「SaveAs」でエラーが...
-
ApplicationとWorksheetFunctio...
おすすめ情報