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

エクセル2003です。
ThisWorkbookには以下の記述があります。

Private Sub Workbook_BeforePrint(Cancel As Boolean)
If ActiveSheet.Name <> "Sheet1" Then Exit Sub
If Range("A1").Value = "" Then
MsgBox "A1が未入力です"
Range("A1").Select
Cancel = True
End If
Application.OnTime Now(), "ページ移動"
End Sub

標準モジュールには以下の記述があります。

Sub ページ移動()
Sheets("Sheet2").Select
Range("A1").Select
End Sub

Sub プリント()
ActiveWindow.SelectedSheets.PrintPreview
End Sub

これでSheet1を開いた状態でツールバーから印刷プレビュー指示をすると、A1セルが入力済みであればプレビュー画面を出し、プレビューを閉じればSheet2が表示されます。
ところが、同じ状態でツールバーからではなく、マクロ Sub プリント を実行すると、プレビュー画面にはなりますが、プレビューを閉じてもSheet1のままです。
なぜ、
Application.OnTime Now(), "ページ移動"
が、有効にならないのでしょうか?

A 回答 (1件)

>なぜ、


>Application.OnTime Now(), "ページ移動"
>が、有効にならないのでしょうか?
結論から言うと、『仕様です』という事になります。
イベントプロシージャは手動操作をトリガーにして実行されますが、
他マクロからのネストでイベントが発生する時、
ある種のメソッドが無視されるように作られているようです。

『ある種の..ようです』と書いてるのは、
全容を網羅したドキュメントを見た事がないからです。
個別にはMSsupportで紹介されているものが幾つかあります。
http://support.microsoft.com/kb/294810/ja
http://support.microsoft.com/kb/898511/ja
他にはBeforeCloseイベント内でProtectメソッドが利かないとか、
BeforeSaveイベント内でOnTimeメソッドが利かないとか、
同じくBeforeSaveイベント内でAutoFilter操作が利かないとか、
Excel系のQ&A掲示板で経験した事があります。
特にWorkbookイベントにその傾向がありますね。

今回の事例では
1:Sub プリント()開始
2: Workbook_BeforePrint開始
3:  OnTimeメソッド発行
4: Workbook_BeforePrint終了
5: PrintPreview
6:Sub プリント()終了
こういうネスト状態です。

手動では1と6がありませんから
OnTimeメソッドで発行されたSub ページ移動()が
5の終了時に実行されるわけですが
上記ネスト状態だと5の終了後は、
まだSub プリント()の制御内にあります。
マクロから呼び出されたイベント内で
全てのメソッドを許してしまうと何らかの不具合が出るため(?)
その対策としての仕様かもしれません。

実際、マクロを書いてWorkbook_BeforePrintを呼び出しているのだから
そのマクロ内にOnTimeメソッドの内容を書けば良いですよね、
という事なのかもしれません。
これ以上の詳細はMicrosoftに訊いてみるしかないかも。

現実的な対応としては
Sub プリント()
  ActiveWindow.SelectedSheets.PrintPreview
  ページ移動
End Sub
とするか、
Sub プリント()
  Application.CommandBars.FindControl(ID:=109).Execute
End Sub
など。
    • good
    • 0
この回答へのお礼

ありがとうございます。
そういう『仕様』ならしようがないですね。(笑)

> 実際、マクロを書いてWorkbook_BeforePrintを呼び出しているのだから
> そのマクロ内にOnTimeメソッドの内容を書けば良いですよね

そのように対応しているのですが、二度手間だなと思って質問しました。
有難うございました。

お礼日時:2012/04/03 09:32

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