ここから本文です

再 ThisWorkbook.Saveがうまくいかない?

pro********さん

2013/10/2515:04:24

再 ThisWorkbook.Saveがうまくいかない?

前回の質問
ThisWorkbook.Saveがうまくいかない?
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1011544544...
でほしい回答が得られないように感じたので、質問文を書き換えて改めて質問することにします。

Excelでリバーシを作りました。
もしゲームの途中でブックが閉じられようとした時、ブックは編集されているのでそのままだとExcelに「保存しますか?」と言われます。
その時閉じようとした人がそのままそのゲームを保存したければ「はい」を、保存したくなければ「いいえ」を選べばよいのですが、私は
3.10 ワークブックが保存されたかどうかを調べる - Savedプロパティ - Excel VBA Tips
http://www.happy2-island.com/excelsmile/smile03/capter00310.shtml
にある
【使用例2】保存確認ダイアログをカスタマイズする
のように自分でダイアログ(MsgBox)を作って保存するかしないかを選ばせ、保存するならそのまま保存し、保存しないなら初期化処理をして盤面を新規ゲーム開始時の状態にしてから保存するようにしています。
プレイする前にブックを閉じようとしたなら自分が作った「保存しますか?」が表示されることなく、Excelから「保存しますか?」と言われることもなく、そのままブックを閉じることができます。
1ターンでもプレイしてから閉じようとすると、自分が作った「保存しますか?」が表示され、「はい」を選んでそのままゲームを保存してもらうようにしたのですが、そのあとExcelからも「保存しますか?」と言われてしまいます。
そこで「いいえ」を選ぶと、保存ができていません。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If 4 < (Range("K5") + Range("K7")) And (Range("K5") + Range("K7")) < 64 Then 'ゲーム途中なら
Again:
If MsgBox("ゲームが途中です。" & Chr(13) & "保存しますか?", vbYesNo, "どうしますか?") = vbYes Then
MsgBox "わかりました。" & Chr(13) & "保存しておきます。"
Else
If MsgBox("保存しないで終わるのですか?", vbYesNo, "どうしますか?") = vbNo Then
GoTo Again
Else
Application.Run "初期化.初期化"
End If
End If
End If
MsgBox "さようなら。", vbOKOnly, "リバーシ"
ThisWorkbook.Save 'Me.Saveでもうまくいきませんでした。
End Sub

何が問題でしょうか?

補足>なぜなら、途中だったので終了中止といった場合にどうしようもありません。

今は保存がうまくいっていないのでExcelから「保存しますか?」と言われてしまいますが、それさえなければ終了キャンセルはできないようにしているつもりです。
一応シート上に[やめる]ボタンを作ってはいますが、システム上Excelの×印でもブックを閉じることができるので、Workbook_BeforeCloseであのような判定をさせようと思いました。

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
1,001
回答数:
2

違反報告

ベストアンサーに選ばれた回答

set********さん

編集あり2013/10/2722:58:42

一度補足質問をしておられるので、もう補足質問はできないので、確たることは言えませんが、

お示しの構文を私のエクセルに貼り付けて(Application.Run の部分は削除しました)いろいろと試してみましたが、変更内容は正常に保存され、Excelから「保存しますか?」と言われてくることはありませんでした。
ただ、

①エクセルを変更して終了する前に、「上書き保存」だけをして、それから終了してみて下さい。
再度、エクセルを開いて、データが変更されているか確認してみて下さい。

②マクロの中で、
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
・・・
Cancel = True
・・・
の構文は入っていないでしょうか?
もし入っていて、その中の構文が誤っていると、変更は保存されずExcelから「保存しますか?」と言われてきました。
おっしゃっておられるのと同じような症状?が出ました。

http://www.happy2-island.com/excelsmile/smile03/capter00310.shtml
に記載されている、
ThisWorkbook.Saved = True
の構文が上記②の中かどこかに入っていると、保存はされません。
上記の構文は、Excelの確認メッセージを表示されなくするためにあたかも保存したことにして、実際は保存できていません。

思いつくところをいくつかあげましたが、参考になるかどうか・・・

質問した人からのコメント

2013/11/1 12:09:16

Windows7に入っているExcel2007ではうまくいきませんでしたが、同じものをWindowsVistaに入っているExcel2010で試してみたところうまくいきました。
環境か何かが問題のような気がします。
とりあえず今回はそのVistaの2010で問題なく動けばいいので、7の2007の対処はまた五日にしてしまいます。
回答ありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

sio********さん

2013/10/2516:52:54

良くわかりませんが、確かに保存関係がおかしいようです。
が、まず、こういった処理をBeforeCloseイベントで行おうとすることがおかしいのではと思います。
ラベルやIF文の使い方もおかしいと思いますが。

BeforeCloseイベントということは、すでに終了は決定している状態です。なので、
If 4 < (Range("K5") + Range("K7")) And (Range("K5") + Range("K7")) < 64 Then 'ゲーム途中なら
といった処理は、イベントが始まる前に処理すべきです。コマンドボタンクリックなどで。なぜなら、途中だったので終了中止といった場合にどうしようもありません。

終了が決定した後は、状態を保存するか初期化するかのどちらかになります。保存の場合は、明確にThisworkbook.Saveで保存できます。また、初期化の場合もそのルーチン内で明確にSaveできます。

そういったことをきっちりと手順を追って処理すれば、ThisWorkbook.Save はうまくいくのでは、と思います。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる