起動しているIEを全て閉じたい。
http://www.youtube.com/watch?v=uQKlDRNm4k8
こんにちは。
>NO156を参考にさせていただき、起動済みのIEを探して、順にすべてをQUITし、新しくIEを立ち上げたいのですが、
>すべて処理(QUIT)する前にループを抜けてしまいます。
>ちなみにIE数を確認しているかmsgboxで確認したのですが、起動分数えていました。(ほとんどパクっているので当然ですよね・・・すんません。)
>Private Sub CommandButton1_Click()
> Set objShell = CreateObject("Shell.Application")
> For Each objWindow In objShell.Windows
> Set objIE = objWindow
> MsgBox "確認" & objIE
> objIE.Quit
> Next
> 'Set objShell = Nothing
>
>Set objIE = CreateObject("InternetExplorer.application")
> objIE.Visible = True
>話がうまくまとめられず申し訳ないのですが、msgboxで確認した起動数と、
>数えているはずなのに処理せず抜けてしまう矛盾に疑問を感じ質問したしだいです。
For Each objWindow In objShell.Windows
のループで、中身がリアルタイムに変わっていくと
(ここでは、ループの中で .Quit してます。)
うまく全てを取れないみたいです。
↓Debug.Print objShell.Windows.Count を 入れてみました。
これで、確認してみてください。
Sub bbb() 'ここで、.Quitで終わらせる。
Dim objShell As Object
Dim objWindow As Object
Dim objIE As Object
Set objShell = CreateObject("Shell.Application")
For Each objWindow In objShell.Windows
Debug.Print objShell.Windows.Count
Set objIE = objWindow
MsgBox "確認" & objIE & objShell.Windows.Count
objIE.Quit
Next
Set objShell = Nothing
End Sub
↑、カウンターの減り方が変ですよね。※あっ、そもそも減っちゃまずいのかなぁ。
※ループ中にobjShell.Windowsの内容が変化してしまうので、
For Each objWindow In objShell.Windows で 順番に取得できないみたいです。
なので、後ろからまわしてみる。そんな処理に変更してみました。
Sub ccc() 'ここで、.Quitで終わらせる。
Dim objShell As Object
Dim objIE As Object
Dim n As Integer
Set objShell = CreateObject("Shell.Application")
'後ろから消してく。
For n = objShell.Windows.Count To 1 Step -1 'MAXから-1ひいてく感じ
Set objIE = objShell.Windows(n - 1) 'n番目のウインドウを代入
MsgBox "確認" & objIE
objIE.Quit
Next
Set objShell = Nothing
End Sub
※objShell.Windows(0)から始まっているので、n-1としてます。
※※IEだけじゃなくて、C:やD:全てのファイルエクスプローラーも閉じちゃうけど。
疑問は、解決されましたか?
何かの参考となれば、幸いです。