アプリ版:「スタンプのみでお礼する」機能のリリースについて

これまでエクセル2003を使っていました。

Private Sub Workbook_BeforePrint(Cancel As Boolean)
MsgBox "印刷指示されました。"
End Sub

このコードで、PrintでもPrintPreviewでもイベントが発生しました。
ところが、今エクセル2010でためしたところ、Previewではイベントが発生しません。印刷を指示しないかぎり発生しないようです。
では、新たにBeforePrintPreview?ができたのかと思いましたが見当たりません。
2010でPrintPreviewでイベントを発生させる方法はありますか?
あるいは2003で、PrintとPrintPreviewのイベントを別に取得する方法はありますか?
教えてください。

A 回答 (2件)

>これで何か問題が起きるおそれはないでしょうか?


Sheet1以外にシートが無ければ良いですが、
印刷対象が複数であればそれなりに対応しないといけないでしょう。

また、印刷用のボタンでは、プリンタを切り替えたい場合も考慮しておく必要があります。
Sheet1.PrintOut ではなくて
Application.Dialogs(xlDialogPrint).Show を使うとか。


ただ、今回の目的には対応できないですね。
>社内のユーザーがプレビューされた段階で入力が完了したと勘違いする危惧がある
2010の場合のプレビューは[ファイル]タブの[印刷]の事ですよね。
BeforePrintが走らない状況には変わりありません。


さて、どうしましょうか。
>或る入力用のシートを作っていて、ユーザーが印刷指示しても、
>入力に矛盾あるいは不足の場合、印字できないようなマクロを組んでおりました。
入力値をチェックしてユーザーに注意喚起する、
またはその後の操作に制限をかけたいというニーズがある事は理解できます。
『印字できない』ようにするのが最終目的ならBeforePrintの制御で良いですね。
別にユーザーが入力未完了と勘違いしたとしても、『印字できない』事は達成できてます。
(だったら現状のままで良い事になります)
2000-2010の各バージョンによって操作感に違いが出るのは事実なので
2010ユーザーにそれを認識してもらうしかないですね。

それは許容できないという事であれば、
『印字できない』のが最終目的ではない、という事になりませんか?
入力作業を終える時に、『入力に矛盾あるいは不足を許したくない』という事では?
もし、こちらが目的だったら、それに見合ったイベントでのチェックや仕掛けを考えたほうが良い気がします。
「入力規則」やWorksheet_Changeイベントなど。
    • good
    • 0
この回答へのお礼

> Sheet1以外にシートが無ければ良いですが、
> 印刷対象が複数であればそれなりに対応しないといけないでしょう。

すみません。質問では主題ではないので省略しましたが
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If ActiveSheet.Name <> Sheet1.Name Then Exit Sub
と手当てしております。

> 2010の場合のプレビューは[ファイル]タブの[印刷]の事ですよね。
> BeforePrintが走らない状況には変わりありません。

仰せのとおりでした。

> 入力作業を終える時に、『入力に矛盾あるいは不足を許したくない』という事では?

これもその通りですね。
もう一度考え直して見ます。
ありがとうございました。

お礼日時:2012/04/14 22:49

Excel2010で従来バージョンの(全画面)印刷プレビューを行うには、


クイックアクセスツールバーでカスタマイズする必要があります。
http://www.becoolusers.com/office/2010print-prev …

この印刷プレビューではBeforePrintイベントが発生します。
>2010でPrintPreviewでイベントを発生させる方法はありますか?
PrintPreviewのみのイベントはありません。



>あるいは2003で、PrintとPrintPreviewのイベントを別に取得する方法はありますか?
これはかなり難しいです。
以前、CommandBarControlによって識別できるのでは、と考えた事がありますが
ID:= 4 のCommandBarControl、つまり[ファイル]-[印刷]からの[印刷プレビュー]が識別できません。

APIを使ってできるのかもしれませんが茨の道です。

どういった目的で[プレビュー]と[印刷]を識別したいのでしょう?
その目的にもよりますが、BeforePrintで印刷を制限してしまって、
[プレビュー]or[印刷]は自前のコマンドからでないと実行できないようにする、
というのが現実的な対応かと思われます。
#それでも状況によってはかなり使いづらくなります。
    • good
    • 1
この回答へのお礼

> どういった目的で[プレビュー]と[印刷]を識別したいのでしょう?
> その目的にもよりますが、BeforePrintで印刷を制限してしまって、

社内には2000、2003、2010が混在してます。
どれも同じ挙動をしてくれるならわざわざ識別する必要はないんです。

或る入力用のシートを作っていて、ユーザーが印刷指示しても、入力に矛盾あるいは不足の場合、印字できないようなマクロを組んでおりました。
ところが、問題がある場合、2003までならプレビュー画面も表示されないのに、2010ではプレビューが表示されてしまいます。
これでは、社内のユーザーがプレビューされた段階で入力が完了したと勘違いする危惧があるための質問でした。

でもかなりやっかいなようですので、今回は以下のように、エクセル本来の印刷指示は無効にして、

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = True
MsgBox "シート上の印刷ボタンを押してください。"
End Sub

Private Sub CommandButton1_Click()
' エラーチェックのコード (略)
Application.EnableEvents = False
Sheet1.PrintPreview
Application.EnableEvents = True
End Sub

として対応しようと思います。
これで何か問題が起きるおそれはないでしょうか?

お礼日時:2012/04/13 11:02

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