AccessVBAとExcelマクロとVBScriptの(ブラウザ操作上の)注意すべき相違点

AccessVBAとExcelマクロとVBScriptの(ブラウザ操作上の)注意すべき相違点

私はVBScriptでの記載は初経験。言語的には AccessVBA と大差ないので苦ではありませんでしたが、悩むポイントがいくつかありました。

その中の1つがブラウザのアクティブ化です。

アクセスとExcelを経由してブラウザを起動すると勝手にアクティブにしてくれる

AccessやExcelからブラウザを起動すると、勝手に最前面でブラウザを開いてくれます。

VBSだとこれが機能しません。

なので、ブラウザをアクティブにする工程が必要となるのですが、ココにも1つの課題があります。

CreateObject("InternetExplorer.Application") で起動するとプロセスIDを取得しない

アクセスやExcelからブラウザを起動するとプロセスIDを勝手に取得してくれます。
(まぁ、多分プロセスIDを取得するから最前面で表示になるのでしょうけど)

VBSではプロセスIDが取れていないので『IDを指定してアクティブ化』という魔法は使えません。
幾つかのステップを踏んでアクティブにする必要があります。

  1. Win32プロセスを使って開いているウィンドから指定のプロセス名を探す
  2. 探し当てたプロセス名のプロセスIDを取得する
  3. プロセスIDをアクティブ化する

具体的なプログラムはこんな

Option Explicit

Dim strIEexe
Dim intProcID

strIEexe = "iexplore.exe"

'IEのウィンドウをアクティブ化する
call ActiveIE

sub ActiveIE()
    Dim objWshShell
    GetProcID(strIEexe)
    If intProcID = 0 Then
        WScript.Quit(0) 
        Exit Sub
    End If
    
    Set objWshShell = WScript.CreateObject("WScript.Shell")
    objWshShell.AppActivate intProcID
    Set objWshShell = Nothing
End Sub

'プロセスIDを探す
Function GetProcID(ProcessName)
    Dim Service
    Dim QfeSet
    Dim Qfe

    Set Service = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer
    Set QfeSet = Service.ExecQuery("Select * From Win32_Process Where Caption='"& ProcessName &"'")

    intProcID = 0

    For Each Qfe in QfeSet
        intProcID = Qfe.ProcessId
        Exit For
    Next

    GetProcID = intProcID <> 0
End Function

VBSの場合は呼び出し方で取得の有無が変わる

VBSではプロセスIDを取得してくるアプリ起動方法もあります。

Set objShell = WScript.CreateObject ("WScript.Shell")
    objShell.Run (ブラウザexeへのパス)

こうやってWScriptで起動して上げるとプロセスIDも取得しています。

【 objShell.ProcessID 】IDを吐き出してくれるのでとても便利ですが、COMのサポートは無くなります。

まとめ

思えばWSH/VBSでのscript作成は終始『ウィンドのアクティブ化との格闘』でした。

それ以外はPCで行っている操作をキーボードで追えばよいだけだったので難しくはないんです。

でも、ウィンドがアクティブになってくれないと全ての操作が(エクスフローラとか)別窓で処理されてしまうので必要なやつ勝手に削除してしまったり、重要なスクリプトにゴミのような文字書き込んで動かなくしたりなど右往左往してしまいます。

皆さんも書く時は気を付けましょう。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください