2日続けてExcelVBA。
やはり細かく分けてすぐにプロシージャごとにテストできるのはものすごく大きなメリットですね。本日は別のアプリ起動と操作に関して。
自分がやったことはWordとメモを起動してファイルパスを渡し、印刷設定をして、一括印刷、ということなんですが、別アプリだけに起動や操作が大変。
Contents
とりあえずの起動
メモ帳
下記コマンドで実行します。
1 |
Shell "Notepad.exe " & ファイルパス, ステータス |
ステータスにあたるものは起動したときの表示(最大化や最小化など)方式などの違いによるものです。詳しくはリンクを。
Word
1 2 3 4 5 6 7 |
Dim w As Object 'Wordオブジェクトを取得 Set w = CreateObject("Word.Application") 'Wordを見えるようにする w.Visible = True w.Documents.Open (ファイルパス) w.Activate |
操作
Wordはそのままコマンドがあったりするのですが(おそらくは同じMicrosoftなので共通の処理ができることを前提としているのでしょう。)、メモ帳に関しては完全に別のソフトになりますので、直接メソッドなどで命令をすることができません。
今回行いたかったのは印刷の細かい設定なので、直接制御するためには印刷設定のプロパティをいじらないといけません(両面印刷などの)。ただWindowsの印刷設定の細かい情報は見つけられなかったので今回私がとった方法はキー操作自体をExcelVBAにさせるということですね。※SendKeysという命令です。
要するにTABキーを2回おして、そのあとスペースを押すとか、そういう処理をExcelにさせるようにしました。
この方法は結構不安定で、以下のような欠点があります。
- ある動作が終わり切らないうちに次の動作が起こってしまうと、次の動作は当然受け付けられない。(SendKeysはコマンドの実行であって処理が終わったかは分からないからです。)
- イレギュラーなイベント(印刷中に紙がなくなって別のポップアップが上がってしまい、アクティブになる)
上記のような欠点がありますが、1に関してはもう実際に動かして重そうな処理は下記コマンドで待つようにしました。
1 |
Application.Wait Now + TimeValue("0:00:03") |
アプリケーションを起動し動作させる 《Shell・SendKeys・Wait》
2に関してはこういったイベントを検知できるのか、いなかの調査をいまだしています。
何とか正常処理をされたという記録がとれればいいのですが、それができない場合、マクロ自体を強制終了させるしかなさそうですね・・・