2012年6月11日月曜日

VBA:URLを既定のブラウザで開く

VBAから任意のURLをブラウザで開こうとするとき、ExcelならHyperlinkのFollowというメソッドがあります。

Private Const URL = "http://bardiel-of-may.blogspot.jp"

Public Sub TEST()
    ActiveSheet.Hyperlinks.Add(Anchor:=Range("A1"), Address:=URL).Follow
End Sub

URLは既定のブラウザで開くようです。ブラウザが起動していれば新しいタブで開きます。

しかし、これだとセルに書き込みをしないとできません。既に使用されているシートでは危険です。かと言って、そのために新規のシートを追加して後で削除するとか、そのためにDisplayAlertsをFalseにしてTrueに戻すとか、それをユーザーに見せないためにScreenUpdatingをFalseにしてTrueに戻すとか・・・よけいな処理もあんまりやりたくありません。今までは下記のようにやってました。

Dim objIE As Object
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
    objIE.Navigate (URL)

既定のブラウザがなんであれIEで開くんですが。
また、実行するたびに新しいIEが起動してしまいます。それについては下記のように対処してました。

Dim objShell As Object
Dim objWindows As Object
Dim objWindow As Object
Dim objIE As Object

    Set objShell = CreateObject("Shell.Application")
    Set objWindows = objShell.Windows()
    'IEが開いているか探す
    For Each objWindow In objWindows
        If StrConv(objWindow.FullName, vbUpperCase) Like "*IEXPLORE.EXE" Then
            Set objIE = objWindow
            Exit For
        End If
    Next
    '開いていなければ起動
    If objIE Is Nothing Then
        Set objIE = CreateObject("InternetExplorer.Application")
        objIE.Visible = True
    End If

    objIE.Navigate (URL)

ただし「IEが開いているか探す」の部分は、状況によってはエラーになります。Outlookで引っかかったのですが、WindowオブジェクトにFullNameが無いケースがあるようです。
と言うか、この後IEを操作するならともかくURLを開くだけならもっとかんたんにできんのか?

それにユーザーがふだんIEを使っているとは限りません。
やはり既定のブラウザで開くようにしたい。レジストリで取得できるみたいですけど:

ShellExecute を使用して、既定の Web ブラウザーを起動するには - Microsoftサポート

あらためて調べたら、こんないろいろ考えなくてもいい方法がありました。

Run メソッド - MSDN

Dim objWSH As Object

    Set objWSH = CreateObject("WScript.Shell")
    objWSH.Run URL, 1

これだけで既定のブラウザで開くようです(起動してる場合は新しいタブで開く)。2つ目の引数でウィンドウの状態も指定できます。もっと早く知るべきでしたw

0 件のコメント:

コメントを投稿