[[20100705164746]] 『BeforeCloseのメッセージでキャンセルを押した場香x(あや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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.