AccessVBAとExcelマクロとVBScriptの(ブラウザ操作上の)注意すべき相違点
AccessVBAとExcelマクロとVBScriptの(ブラウザ操作上の)注意すべき相違点
私はVBScriptでの記載は初経験。言語的には AccessVBA と大差ないので苦ではありませんでしたが、悩むポイントがいくつかありました。
その中の1つがブラウザのアクティブ化です。
アクセスとExcelを経由してブラウザを起動すると勝手にアクティブにしてくれる
AccessやExcelからブラウザを起動すると、勝手に最前面でブラウザを開いてくれます。
VBSだとこれが機能しません。
なので、ブラウザをアクティブにする工程が必要となるのですが、ココにも1つの課題があります。
CreateObject("InternetExplorer.Application") で起動するとプロセスIDを取得しない
アクセスやExcelからブラウザを起動するとプロセスIDを勝手に取得してくれます。
(まぁ、多分プロセスIDを取得するから最前面で表示になるのでしょうけど)
VBSではプロセスIDが取れていないので『IDを指定してアクティブ化』という魔法は使えません。
幾つかのステップを踏んでアクティブにする必要があります。
- Win32プロセスを使って開いているウィンドから指定のプロセス名を探す
- 探し当てたプロセス名のプロセスIDを取得する
- プロセス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で行っている操作をキーボードで追えばよいだけだったので難しくはないんです。
でも、ウィンドがアクティブになってくれないと全ての操作が(エクスフローラとか)別窓で処理されてしまうので必要なやつ勝手に削除してしまったり、重要なスクリプトにゴミのような文字書き込んで動かなくしたりなど右往左往してしまいます。
皆さんも書く時は気を付けましょう。

