- ベストアンサー
Access2003からFirefoxを起動する方法とウインドウ管理のテクニック
- Access2003からFirefoxを起動する方法と、複数のURLを連続して表示するテクニックについて説明します。
- コマンドの実行結果でFirefoxの起動を判断する方法や、待ち時間を最適化する方法についても解説します。
- また、Access2003の中でFirefoxの起動状態を判断する方法なども紹介します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
マクロの「アプリケーションの実行」アクションは、VBAではShell関数に 相当します(データベースウィンドウで当該マクロを選択した状態で、 メニューで「ツール(T)→マクロ(M)→マクロを Visual Basic に変換(B)」 を指定すると、マクロをVBAに変換できます)。 ただ、このアクション/関数は「非同期実行」(大雑把にいうと、指定した 処理が完了したかどうかに関係なく、次に記述された処理を実行して しまう)の仕様になっているため、今回ご質問のような動作になったりします。 これの対処として一般的なのは、これらの代わりに「WshShellオブジェクトの Runメソッドを使用する」という方法です。 これを使用すると、Runメソッドの第3引数で、指定した処理が完了する まで待つかどうかを指定できますので、現状の「5秒待ち」を削除すること ができることになります。 参考: http://www.f3.dion.ne.jp/~element/msaccess/AcTipsGetDosResult.html (上記URL表示後、ブラウザで「処理完了を待機する」で検索したら、 その下から読んでみてください) ただ、今回のように「ブラウザで指定したサイトを表示」ということでしたら、 いくつかの制限が許容できるなら、VBAの「FollowHyperlink」メソッドを 使用する手もあるかと思います。 <制限> *現状で気づいた範囲で(汗)* ・表示に使用されるブラウザは、OSで「既定のブラウザ」に指定された ものになる (FollowHyperlinkメソッドは、AccessのフォームやExcelのセルなどに 記述されたハイパーリンクをクリックしたのと同様の動作を行うため、 ブラウザは指定できません) ・起動済みのFireFoxのタブで開くためには、FireFox側の設定で、 「新しいウィンドウではなく新しいタブで開く」をオンにする必要がある (FireFoxのメニューで、「ツール(T)→オプション(O)」で開く『オプション』 ダイアログで、『タブ』の項目を選択すると、当該項目が表示されます) ・URL表示後にメッセージボックス等を表示する場合、当該URLの表示 (読み込み)が完了していなくても、それらの後続処理が実行される 【方法】 <VBAでの準備> 新規の標準モジュールを作成したら、以下のコードを貼り付けて保存します: Option Compare Database Option Explicit Public Function OpenHyperlink(sAddress As String, Optional sSubAddress As String) As Boolean Call FollowHyperlink(sAddress, sSubAddress, False, False) OpenHyperlink = True End Function <マクロの記述> 現状のマクロから、「5秒の待機」をさせているアクションを削除した上で、 「アプリケーションの実行」アクションを以下のアクションに置き換えます: アクション: 「プロシージャの実行」 プロシージャ名: 「OpenHyperlink("http://oshiete.goo.ne.jp/")」 ※実際のURLの参照の仕方は、現在「アプリケーションの実行」で 使用されているのと同様の方法を使用できると思います。 ・・・以上、参考まで。
その他の回答 (1)
- nicotinism
- ベストアンサー率70% (1019/1452)
アプリケーションが起動しているか否かは VBA の標準モジュールに Function AppIsAlive(trgApp As String) As Boolean Dim wProcess As Object For Each wProcess In GetObject("winmgmts:root\cimv2") _ .ExecQuery("select * from Win32_Process " _ & " where Name='" & trgApp & "'") 'Debug.Print wProcess.Name, wProcess.commandline AppIsAlive = True Exit For Next End Function として置いて、appisalive("firefox.exe") とか appisalive("msaccess.exe") などで True が返ってくれば起動中、False だと存在しないと分かります。 マクロだと(正直マクロはほとんど使ってませんけど) 条件の所に、appisalive("firefox.exe") としてナントカすれば良さそうです。 と考えましたが・・・ >1回目の起動の後5秒ぐらい間を置いて(=Firefoxの起動が完了してから) なのでFireFoxが落ち着いたのを判断しなくてはいけないようですね。 これに関しては、? です。 蛇足ながら(FireFoxも使ったこと・・・) 下記リンクによれば https://developer.mozilla.org/ja/Command_Line_Options 『URL を新しいタブで開きます。Firefox と SeaMonkey2.x のみ。 -new-window URL URL を新しいウィンドウで開きます。Firefox と SeaMonkey2.x のみ。 -search term 』 これは関係ないのかな?
お礼
ありがとうございます。 返信が遅れてしまい、大変失礼しました。 これからじっくり検討・テストしてみます。
お礼
DexMachina様、大変ありがとうございました。 無事できました。 最初は「処理完了を待機する」にトライして、難しく感じたの ですが、FireFoxを既定のブラウザにしてOpenHyperlinkでやったら できました。 ありがとうございました。