- ベストアンサー
エクセルVBAの不思議な挙動?
- エクセル2003でのVBAの動作について不思議な現象が起きています。特定の処理が実行されない問題が発生しています。
- 具体的には、PrintPreviewの指示をすると正常に動作するが、マクロを実行すると予期した動作にならず、プレビュー画面が閉じても元のシートが表示されたままになります。
- 問題の原因は、Application.OnTime関数が正しく動作しないことにあると考えられます。なぜこの関数がうまく動作しないのか、原因を探る必要があります。
- みんなの回答 (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 など。
お礼
ありがとうございます。 そういう『仕様』ならしようがないですね。(笑) > 実際、マクロを書いてWorkbook_BeforePrintを呼び出しているのだから > そのマクロ内にOnTimeメソッドの内容を書けば良いですよね そのように対応しているのですが、二度手間だなと思って質問しました。 有難うございました。