ヘルプの森~Excel・Access・Office全般ヘルプデスクサイト

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"]

関連ヘルプ

ブック内のすべてのワークシートで同じ処理を行う 《For Each~Next》
ブックを開くとき、閉じるときにマクロを自動実行したい 《イベント プロシージャ》
データを快速で検索するには 《Find》
エラーの種類、そしてエラー処理の設置方法について 《On Error GoTo》
InputBox のテキスト ボックス入力時に日本語入力をオンにする 《SendKeys》
Excelのデータをテキスト ファイルに書き出す(出力する) 《Open・Print・Close》
ExcelからOutlookでメールを作成・送信する基本のVBA 《CreateObject関数》
Excelのメールアドレス データを使用し、Outlookのメールを自動送信する 《CreateObject関数》
ソートしたグループごとのデータを別ブックに分割するサンプルVBA
右クリック、印刷、上書き保存などブックに規制をかける 《イベント プロシージャ Cancel=True》
フォルダー内のすべてブックを開いて同じ処理を行う 《Do~Loop・Dir》
フォルダー内のすべての画像ファイルをペイントで開きサイズ変更
フォルダー内のフォルダーとファイルの一覧をセルに書き出す1 《Dir》
フォルダー内のフォルダーとファイルの一覧をセルに書き出す2 《FileSystemObject》
フォルダー内のファイル名を変更する 《Do~Loop・Dir・Name~As》
ColorプロパティとRGB関数について、Color値からRGB、RGBからColor値を求める方法 《Color・RGB関数》
twitter hatena line pocket