激凹みから立ち直る方法

閲覧して下さってありがとうございます。

今回エクセルにてVBAを用いて、以下の条件をクリアできるコードを知りたいです。
<条件>
① sheet1を印刷する際、本当に印刷するかどうかを「はい」か「いいえ」で尋ねてほしい。
はいの場合は印刷し、いいえの場合は印刷しません。
(MsgBox("本当に印刷しますか?", vbExclamation + vbYesNo) = vbYes Then)恐らく式はこんな感じですよね…?

② sheet2やsheet3を閲覧中に、sheet1と2と3をまとめて印刷する際にも
sheet1に対して①の質問をしてほしい。
このとき「はい」を選択した場合はどちらも印刷されますが、
「いいえ」を選択した場合はsheet2と3のみ印刷されるようにしたいです。

③ sheet2や3単体を印刷するときは何も表示されずそのまま印刷される。

自分なりに以下の
Sub Workbook_BeforePrint(Cancel As Boolean)
Dim sh As Object
Cancel = True
For Each sh In ActiveWindow.SelectedSheets
sh.Activate
If UCase(ActiveSheet.Name) = "sheet1" Then
If MsgBox("本当に印刷しますか?", vbExclamation + vbYesNo) = vbYes Then
ActiveSheet.PrintOut
End If
End If
Next
End Sub
というコードでやってみましたが、なぜか2回同じ質問が飛んできて(はいを選んでももう一度選択を迫られます。)、さらに2回「はい」を選択しても印刷が実行されません。

質問は1回のみにしたいし、印刷は実行されるようにしたいのですが…
いかんせん初心者なもので、ネットで調べてもなかなか条件に見合ったページを見つけることができず…

わがままですが、各行の意味を記載してもらったうえで
正しいコードを教えていただけないでしょうか。

皆さんお忙しいところ恐縮ですが、
宜しくお願い致します…

A 回答 (1件)

前回の作者です。



他には類のみない内容で、出来たと思って、印刷はしていなかったので、再帰がかかることは予想はしていませんでした。大変に失礼しました。

それから、一部変えたようですが、 UCase は、大文字の意味です。UCase関数なしのほうがわかりやすかったら、なしでもよいです。sheet1は、現在小文字になっています。
これは、英字のときのお約束のようなものです。STRCOMPという文字列比較関数もあります。

If UCase(ActiveSheet.Name) = "SHEET1" Then

これでどうでしょうか?
以下のコードを経験者の方で疑問に思う方もいるかもしれませんから、注釈しておきます。
※ 長い印刷時間の掛かる場合に、ESCなどを入れられると、イベント型マクロが完全に死んでしまうことがありますので、
 Application.EnableEvents = False
 sh.PrintOut
 Application.EnableEvents = True
と間髪をいれないで、EnableEvents の間に入れました。
また、ESCの信号自体を、マクロで拾うことは可能ですが、この場合は、コードが単純なので、複雑にしたくありませんでした。

なお、初心者の方でも、イベント型マクロの復旧方法は簡単に出来ますが、ただ、マクロを作った側からすると、復旧させるのは、やはり間が抜けているように思いました。
[Application.EnableEvents =True をイミディエイトウィンドウで実行する]

ThisWorbkook モジュール
'---------------------
Sub Workbook_BeforePrint(Cancel As Boolean)
 Dim sh As Object
 Cancel = True
 For Each sh In ActiveWindow.SelectedSheets
  sh.Activate
  If UCase(sh.Name) = "SHEET1" Then
   If MsgBox("本当に印刷しますか?", vbExclamation + vbYesNo) = vbYes Then
    Application.EnableEvents = False ''※割り込みを嫌っているからこうした
    sh.PrintOut
    Application.EnableEvents = True
   End If
  Else
    Application.EnableEvents = False
    sh.PrintOut
    Application.EnableEvents = True
  End If
 Next
End Sub
    • good
    • 1
この回答へのお礼

WindFaller様
できました!
何とお礼を言えばいいのやら!
とにかく本当にありがとうございます。
このコードの仕組みがどうなっているのかも含め、
再度上から順に意味を調べてみます!

お礼日時:2018/12/25 08:28

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