その他関連のテクニック

外部アプリを操作する

(Excel 97/2000/2002/2003/2007)
Excel VBAでインターネットへ接続するときなどは、オートメーションでInternet Explorerを操作します。
たとえば次のような感じです。

Sub Sample1()
    Dim URL As String, IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    URL = "http://www.moug.net/"
    With IE
        .Visible = True
        .Navigate URL
    End With
    Set IE = Nothing
End Sub
このようにオートメーションで操作できるアプリケーションならCreateObjectでインスタンスを操作してやればいいのですが、オートメーションに対応していないアプリケーションではこの方法を使うことができません。 そんなときは次のようにします。 1.操作対象のアプリケーションをアクティブにする 2.操作対象のアプリケーションにキーコードを送る 3.Excelに戻って次の処理をする 別のアプリケーションをアクティブにするいはAppActivateを使います。 次のマクロは、Windows付属の「メモ帳」をアクティブにします。 なお「メモ帳」では、Sample.txtを開いているものとします。
Sub Sample2()
    AppActivate "Sample.txt - メモ帳", True
End Sub
AppActivateの引数には、アクティブにしたいアプリケーションのタイトルバーに表示されている文字列を指定します。 引数に指定した文字列と完全に一致するタイトルバーが存在しないときは、引数に指定した文字列を前方一致で検索します。 ただし、タイトルバーに操作中のファイル名が表示されるような場合は、Windowsの設定によって拡張子が表示されない場合もありますので注意が必要です。 アクティブにしたアプリケーションにキーコードを送るにはSendKeysを使います。 次のマクロは、アクティブにしたメモ帳のデータを全選択し、クリップボードにコピーします。
Sub Sample3()
    AppActivate "Sample.txt - メモ帳", True
    SendKeys "^a"
    SendKeys "%ec"
End Sub
最初のSendKeysで送ったキーコード「^a」は「Ctrl + a」を表し、2つめに送ったキーコード「%ec」は「Alt + e → c」という意味です。 詳しくはSendKeysのヘルプをご覧ください。 ただし、上記のマクロは正常に動作しない場合があります。 アプリケーションをアクティブにするのはWindowsの仕事であり、AppActivateはその指令を送ったに過ぎません。 続くSendKeysによるキーコードを、間違いなく外部アプリケーションに送信するためには、若干の"待ち時間"が必要な場合もあります。 ここでは、アプリケーションがアクティブになるまで「2秒間」待つことにします。 指定した時間までマクロを停止するにはWaitを使います。
Sub Sample4()
    AppActivate "Sample.txt - メモ帳", True
    Application.Wait Now + TimeSerial(0, 0, 2)
    SendKeys "^a"
    SendKeys "%ec"
End Sub
Waitは、マクロを「何秒後に再開する」ではなく「何時になったら再開する」と、再開する時間を指定します。 2秒後とは、現在の時間に2秒を加えた時刻ですから、Nowで現在の日時を取得し、TimeSerialの2秒を加えています。 Excelに戻ってくるときも、Waitを入れた方がよい場合があります。 マクロを実行するパソコンの環境によっても異なりますので、このへんは試行錯誤が必要ですね。 次のマクロは、メモ帳のデータをクリップボードにコピーし、Excelのアクティブシートに貼り付けます。
Sub Sample5()
    AppActivate "Sample.txt - メモ帳", True
    Application.Wait Now + TimeSerial(0, 0, 2)
    SendKeys "^a"
    SendKeys "%ec"
    Application.Wait Now + TimeSerial(0, 0, 2)
    AppActivate "Microsoft Excel", True
    ActiveSheet.Paste
End Sub