vba タスクに IE が残る

vba タスクに IE が残る

vba タスクに IE が残る。
VBAでブラウザ経由でサイトのページの情報を拾い上げる技は結構使いますよね?
私だけ?www

そうすると、なぜかvba タスクに IE が残っていて、繰り返し利用するとどんどんと増えていき、それが原因でマシン全体が遅くなってしまう。


VBAでサイトのページのHTMLを読み込む

VBAでサイトのページのHTMLを読み込む基本的な方法は以下の通り。
Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = viewsw '見えるようにする

objIE.Navigate "https://www.yahoo.co.jp/"

While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE
    DoEvents
Wend

Set objIE = Nothing

これが、一般的にサイト検索で見つかる構造です。

ところが、これで閉じてしまうと IE がタスクに残ってしまいます。


IE のタスクを強制的に殺す

クロームなどを標準で使っている方は、タスクから強制的に排除してしまうという手があります。

以下を標準モジュールに貼りつけて call Kill_IE を呼び出してあげれば、タスクから 「すべての」IEがいなくなります。
Option Explicit
Dim objShell As Object
Dim objExec As Object
Sub Kill_IE()
    Set objShell = CreateObject("WScript.Shell")
    Set objExec = objShell.Exec("taskkill.exe /F /IM iexplore.exe")
End Sub


本当は、使い方が間違っていた IE 呼出し。だからタスクが残るんです

実は、調べてみたら、先の一連の構造は間違っていました。

以下の方法は、IEを使い終わったら Nothing をセットすればいいということになっていますけど、これがあやまち。
最初の方がこの書き方をして検索上位に上がりそれが拡散された気配があります。

Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = viewsw '見えるようにする

objIE.Navigate "https://www.yahoo.co.jp/"

While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE
    DoEvents
Wend

Set objIE = Nothing


vba タスクに IE が残さずに IE を止めるには


vba タスクに IE が残さずに IE を止めるには IE のオブジェクトには、実は Quit というリフレッシュするコマンドがあります。

Set objIE = Nothing の前に Quit してあげるとタスクに残らずに IE のオブジェクトを無効にすることができます。

Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = viewsw '見えるようにする

objIE.Navigate "https://www.yahoo.co.jp/"

While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE
    DoEvents
Wend

objIE.Quit

Set objIE = Nothing

盲点でした orz

スポンサーリンク