No.004
アプリケーションを起動し動作させる 《Shell・SendKeys・Wait》
2003/2007/2010/2013
Excelからメモ帳を起動するなど、Office製品でない他ののアプリケーションを起動するためのVBAの記述をご紹介します。
プログラムを実行させるには、Shell関数を利用します。
メモ帳を起動する場合は
Shell "notepad.exe", 1
電卓を起動する場合は
Shell "calc.exe", 1
ペイントを起動する場合は
Shell "mspaint.exe", 1
ちなみにPowerPointを起動する場合は
Shell "POWERPNT.EXE", 1
という具合に、最初の引数にアプリケーションの起動ファイルを指定します。
メモ帳のなどの起動ファイルはシステム フォルダーにあり、Windowsの標準的な環境設定によりパスが通っていますので、ファイル名のみの指定で可能です。
パスが通っていないアプリケーションの場合は、起動ファイル前のパスも記述します。
最後の数値は開いてくる状態の設定で、「1」は開いたウィンドウがアクティブになります。詳細は下記の<ヘルプmemo>でご確認ください。
Office以外のアプリケーションでは、例えばメモ帳ではVBAは通用しません。
そんなときでもキーボードのキー操作を送れる SendKeysステートメント を利用すれば、メモ帳に簡単な操作をさせることができます。
例えば、Excelで何かをコピーしておき、メモ帳を起動し、ショートカット キー「Ctrl」+「V」で貼り付け、「Alt」+「F4」で名前を付けて保存するといった動作が可能です。
次のサンプルを参考にしてください。
Sub Sample()
Shell "notepad.exe", 1 'メモ帳起動
SendKeys "^V" '「Ctrl」+「V」
SendKeys "%{F4}" '「Alt」+「F4」
SendKeys "{Enter}" 'メッセージ確定
Application.Wait Now + TimeValue("0:00:03") '3秒待つ
SendKeys "d:¥memo.txt" '保存先入力
SendKeys "{Enter}" 'ダイアログ ボックス確定"
End Sub
SendKeysステートメントについては、ヘルプ「InputBox のテキスト ボックス入力時に日本語入力をオンにする」のページ下の方にある[ヘルプmemo]をご覧ください。
ここでポイントは、Waitメソッドで少し待つことです。
Waitメソッドは、引数に時間を指定し、その時間まで動作を停止します。
上記の引数「Now + TimeValue("0:00:03")」は、現時間の3秒後です。
今回、Waitメソッドの記述がない場合、次に進みません。ダイアログ ボックスが表示されて、確実にアクティブになるまで数秒待ってあげるというイメージです。
SendKeysで止まってしまったときは、その前にWaitしてあげてください。
またShell関数は、アプリケーションの起動に成功した場合、OSが内部的に使用するタスクIDという数値を任意に返しますが、うまく開けない場合は必ず「0」を返します。
そこで変数を利用して、次のような対応ができます。
Dim Kido_note As Long
Kido_note = Shell("notepad.exe", 1)
If Kido_note = 0 Then
MsgBox "メモ帳起動に失敗しました"
End If
ヘルプmemo
<Shell関数>
実行可能プログラムを実行し、実行が完了するとプログラムのタスクIDを示すバリアント型の値を返します。プログラムの実行に問題が発生した場合は、0を返します。
構文: Shell(pathname[,windowstyle])
引数:
pathname …実行するプログラムの名を指定
windowstyle …実行時のウィンドウ形式を指定[省略可]
値 / 定数
0 / vbHide
…フォーカスを持ち、非表示にされるウィンドウ
1 / vbNormalFocus
…フォーカスを持ち、元のサイズと位置に表示されるウィンドウ
2 / vbMinimizedFocus(規定)
…フォーカスを持ち、最小化表示されるウィンドウ
3 / vbMaximizedFocus
…フォーカスを持ち、最大化表示されるウィンドウ
4 / vbNormalNoFocus
…最後にウィンドウを閉じたときのサイズと位置に復元される
フォーカスを持たないウィンドウ
6 / vbMinimizedNoFocus
…最小化表示されるフォーカスを持たないウィンドウ
ヘルプmemo
<Waitメソッド>
実行中のマクロを指定の時刻まで停止します。指定の時間に達した場合、True を返します。
構文: Application.Wait(Time)
引数:
Time …マクロを再開する時刻を Excel の日付の書式で指定
ヒント:
Application.Wait "15:00:00" '15時に再開
10秒間停止する場合、次のような書き方が可能です。
Application.Wait Now + TimeValue("0:00:10")
Application.Wait Now + TimeSerial(0, 0, 10)
Application.Wait [Now()+"00:00:10.0"]