[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『BeforeCloseのメッセージでキャンセルを押した場合』(あや)
エクセル2003 ウィンドウズXP
Private Sub Workbook_BeforeClose(Cancel As Boolean)
’必要の無いシートの削除
End sub
を使っています。
終了するときに マクロ(必要のないシートの削除)が走ってから
変更を保存しますか? の
「はい」「いいえ」「キャンセル」の3つのボタンが出ます。
今の動きだと、
「はい」 マクロの作業を走らせて保存 → OK
「いいえ」 ファイルに変更なく終了 → OK
「キャンセル」 マクロの作業が走って、ファイルは開いたまま → ×
この「キャンセル」の動きが問題で、
キャンセルを押したなら、マクロは走らずにファイルは開いたままにしたいのですが
BeforeCloseだと、マクロが走ってから保存のメッセージが出ます。
うまく説明できているかわかりませんが >д<;
回避方法もしくは解決策はありませんでしょうか。
BeforeCloseでは「必要の無いシートの削除」ではなく「必要の無いシートを非表示」として BeforeSaveで「必要の無いシートの削除(非表示にしたシートを削除)」するのはどうでしょうか?
追記 「キャンセル」の時は、非表示にしたシートを再表示させる。
(てつろう)
こんにちわ。。 最初に、 MsgBox "Dataを全部消すよ!", vbYesNoCancel, "test!" みたいなMsgBoxで選択させて、それぞれの処理をしたらどうかしら?? (kei)
こんなことで良いかなぁー
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim myMSG As Integer
myMSG = MSGBOX("Dataを全部消すよ!", vbYesNoCancel + vbExclamation) If myMSG = vbYes Then 'マクロの作業を走らせて保存処理。 ElseIf myMSG = vbNo Then 'ファイルに変更なく終了 Else Exit Sub 'このイベントを終了 End If END SUB (kei)
>終了するときに マクロ(必要のないシートの削除)が走ってから >変更を保存しますか? の >「はい」「いいえ」「キャンセル」の3つのボタンが出ます。 Excelは BeforeCloseイベント発生後に保存の有無を聞いてきますからねえ!!
全体の仕様説明を聞かないとはっきりはしませんが、記述された内容からですと てつろうさんの
>BeforeSaveで「必要の無いシートの削除」
がよさそうですけどねえ・・・。
BeforeCloseで行うなら、このイベント内でExcelがやってくれる保存確認処理を自作しなければ なりません。
thisworkbookのモジュールに
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim ans As Long With Me If Not .Saved Then 'ブックが更新されていたら? ans = MsgBox("'" & Me.Name & "'を保存しますか?", vbExclamation + vbYesNoCancel) '↑保存確認メッセージの表示 If ans = vbYes Then 'はい 'シート削除処理 Me.Save ElseIf ans = vbNo Then 'いいえ Me.Saved = True Else 'キャンセル Cancel = True End If End If End With End Sub
ichinose
keiさんのMsgbox、良いアイデアですね^ー^
マクロも勉強になりました。
しかし今回はユーザーにメッセージを求めずに作業しますので
てつろうさんのBeforeSaveで非表示にし、BeforeCloseで削除で進めてみます。
組み合わせてうまく使うんだなぁ、と思いました。
ichinoseさん
Excelは BeforeCloseイベント発生後に保存の有無を聞いてきますからねえ!!
ご存知なら教えて頂きたいのですが、これはエクセル独特の動きなのでしょうか?
マクロは時々使っていたのですが、BeforeCloseの謎に昨日初めて気が付いたので…
使いこなしている人は、BeforeCloseのキャンセルの場合の動きは黙認のことで
このように BeforeSaveとうまく使い分けているのでしょうか…
(あや)
>てつろうさんのBeforeSaveで非表示にし、BeforeCloseで削除で進めてみます。 私の提案したのは逆ですよ・・・ BeforeCloseで非表示にし、BeforeSaveで削除です。
流れとしては BeforeCloseで非表示にして、ファイルが更新(未保存状態)になるので その後、BeforeSaveイベントが発生で、シート削除。 かな?(間違えていたらごめんなさい)
>ご存知なら教えて頂きたいのですが、これはエクセル独特の動きなのでしょうか? >マクロは時々使っていたのですが、BeforeCloseの謎に昨日初めて気が付いたので… >使いこなしている人は、BeforeCloseのキャンセルの場合の動きは黙認のことで >このように BeforeSaveとうまく使い分けているのでしょうか…
どなたか説明が上手な方お願いしますw
(てつろう)
逆ですね…
頭ではわかっていたのですが、
ここへの書き込みを間違えていましたm(_ _)m
(あや)
「キャンセル」の時は、非表示にしたシートを再表示させる。
この、キャンセルのときはという判断はどこですればよいのでしょうか?
キャンセルボタンを押したときは、
BeforeSaveに入らずに画面が戻っているようなのです。
(あや)
>キャンセルボタンを押したときは、 BeforeSaveに入らずに画面が戻っているようなのです。 未確認でした。すみません。BeforeSaveには入らないですね。
ichinoseさんのマクロをお借りして。(てつろう追記)が追記した部分になります。
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim ans As Long With Me 'シート非表示処理(てつろう追記)
If Not .Saved Then 'ブックが更新されていたら? ←ここのif文はいらないかもです。(てつろう追記) ans = MsgBox("'" & Me.Name & "'を保存しますか?", vbExclamation + vbYesNoCancel) '↑保存確認メッセージの表示 If ans = vbYes Then 'はい 'シート削除処理 Me.Save ElseIf ans = vbNo Then 'いいえ Me.Saved = True Else 'キャンセル 'シート再表示処理(てつろう追記) Cancel = True End If End If End With End Sub
これでどうでしょうか? (てつろう)
また作業をしてみますm(_ _)m
(あや)
>ご存知なら教えて頂きたいのですが、これはエクセル独特の動きなのでしょうか? WordにしてもExcelにしても、既製ブックを開いた場合、 更新が一切なく対象ブックを閉じる時には、保存確認メッセージは表示されませんよね? 反対に更新が行われて対象ブックを閉じる時には、保存確認メッセージは表示されます。 これは、ユーザーが保存し忘れて泣かないようにというExcelの親切心ですよね?
>マクロは時々使っていたのですが、BeforeCloseの謎に昨日初めて気が付いたので…
BeforeCloseイベントがこの保存確認メッセージの前に発生するのは、「独特」ではなく、 「妥当」な動き だと私は思います。 イベントがメッセージの前に発生することで、コードの工夫により、後に表示する保存確認メッセージを 表示するか否かをコントロールできます。 イベントが保存確認メッセージより、後に発生したら、保存確認メッセージをコントロールするためには オプションで保存確認メッセージを出すか出さないか なんて選択肢を設けなければなりません。 または、BeforeSaveに何らかの引数の追加が必要かなあ・・・。
今回の場合は、詳細仕様がわかっていないのではっきりは言えませんでしたが、 BeforeSaveで処理すれば、アルゴリズムが簡単かなあ とは思っていました。
ichinose
やりたい事は終了するときに(BeforeCloseイベント)必要のないシートの削除をする事なので、 削除したら、保存しないとファイルは更新されません。 と言う事で単に保存すればいいのでは... そうすると、変更を保存しますか?のダイアログは出ません。
Private Sub Workbook_BeforeClose(Cancel As Boolean) '必要の無いシートの削除 Save End sub (saka)
やろうとしていることが未だ見えてこないんだけど、 取り合えずはっときます。 http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=65880;id=excel http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=65898;id=excel (Jaka)
sakaさんへ ちょっと気になったので・・・。
> Private Sub Workbook_BeforeClose(Cancel As Boolean) > '必要の無いシートの削除 > Save >End sub 私も仕様がはっきりわかっているわけではありませんが、 ブックを閉じたら、必ず保存する という仕様ではないように思います。 保存しないで、閉じることが出来ないでは困る場合が多々あると思いますしね!!
ichinose
ichinoseさんとてつろうさんが書いてくれた
BeforeCloseのタイミングで、メッセージボックスを出して
処理をするかしないかキャンセルで抜けるか
で、希望の動きが出来ました。
ありがとうございました。
ichinoseさん
コードの工夫により、後に表示する保存確認メッセージを
表示するか否かをコントロールできます。
なるほど、今回は このコントロールによってMsgboxで対応できたのですね。
sakaさん
ichinoseさんが言われるように、
閉じるタイミングで必ず保存して閉じられる動きも困るのです。
考えている流れとしては、
基本は1〜10のシートを表示しているのですが、
閉じるタイミングで、必要の無いシート(1しか入力していない場合、2〜10)を削除。
開くタイミングで、シートを10まで(2〜10)増やすようにしています。
圧縮が人に頼めない環境なので、
閉じるタイミングと開くタイミングで、容量を減らすようにしています。
ここで教えて頂きながらなんとか出来てきましたm(_ _)m
またお世話になるかと思いますが…勉強になりました。
(あや)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.