BeforePrintイベントプロシージャでエクセルが落ちてしまうが?

Question 103.2 Previous Next
会社で紙で提出される申請書を作成しまして、入力漏れがある場合、印刷できないようにVBAを作りました。
白紙を印刷したい人もいるだろうと思いコードを盛り込んだのですが、以下の1~6の動きをさせるとエクセルが落ちてしまいます。
1.印刷プレビューを押す           2.メッセージボックスで『はい』を選ぶ
3.印刷プレビュー内の印刷ボタンを押す 4.印刷は『キャンセル』を押す
5.再度印刷プレビューを押す        6.メッセージボックスで『いいえ』を選ぶ
『問題が発生したため、・・・』とのメッセージが表示されエクセルが落ちてしまいます。
また、1~4をした後に実際申請書に入力し、印刷しようとした場合、入力漏れにより印刷をさせない(cancel=true)と同様にエクセルが落ちてしまいました。 これは回避出来ないのでしょうか?
以下のコードは実際に作ったのを、テスト用に簡略化したものです。ご意見宜しくお願いします。
(Excel 2003 & Windows XP)
Excel動作停止
Sub Workbook_BeforePrint(Cancel As Boolean)
    Select Case Range("A1")
        Case 1
            If vbYes = MsgBox("1?", vbYesNo) Then
                Range("A1") = 2
                Cancel = False
            Else
                Cancel = True
            End If
        Case 2
            If Application.Count(Range("A3:A5")) <> 3 Then
                MsgBox "印刷ダメ"
                Cancel = True
                Exit Sub
            End If
            Range("A1") = 1
    End Select
End Sub
Answer   Copyright (C) 2010.10.26 永井善王
下図の状態でご説明に沿って操作すると、仰るとおり上図のエラーが発生しました。 ワークシート 上図は Excel 2003 & Windows 7 で実行したときのものですから、そちらの環境のものとは若干違うかもしれません。

こうなる原因は、マクロの上から8行目にある
Cancel = True のようですが、1.を実行して、2.のメッセージボックスで『いいえ』を選んだ場合には正常に動作します。
ご呈示のコードでは、メッセージボックスに表示されるはずのメッセージが伏字 (1?) になっています。よって、どんな場合に『いいえ』ボタンがクリックされるのかがはっきりしないので全体像がつかみにくいです。
それに関連するのかどうかわかりませんが、1.→2.→3.と順調に進んだのに 4.で『キャンセル』を押すという流れは複雑すぎるように思います。
少しExcelの味方をするようですが、[印刷プレビュー]ボタンがクリックされたことにより発生したBeforePrintイベントプロシージャの中で[印刷]ボタンがクリックされると、またまたBeforePrintイベントが発生するのでしょうか? そうだとすると『親亀の背中に子亀・・』のようですが、そのときに 4. で[キャンセル]ボタンがクリックされたら、どうなるのでしょうか?

「入力漏れがある場合」や「白紙を印刷したい人」など、たくさんのニーズに応えようと努力なさっているのは尊いことです。 あえて意見を申し上げるとすれば、もう一度、流れを整理して機能を絞り込んでBeforePrintイベントプロシージャへの負荷を減らすか、思い切って他の手段に変えるかと思います。
お役に立たなかったことと思いますが、上手くいくようになりましたら、私にも教えてください。お待ちしています。

 

Excel VBA Macro