人生のプチ美学を教えてください!!

お世話になります。
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

何とか解決する方法はないでしょうか?
よろしくお願いします。

A 回答 (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つです。(そんなことは言われなくてもご存知ですよね。すみません)
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/16 16:56

こんばんは。



しばらく、こちらで実際に試行錯誤してみました。

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
    • good
    • 0
この回答へのお礼

お忙しい中、色々と試していただきありがとうございます。
早速コードのほうを修正し友人の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

としていたので、保存してからユーザフォームを閉じたほうがよいのでしょうか?

色々とお世話になりますがよろしくお願いします。

お礼日時:2006/02/09 21:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!