その買うを、もっとハッピーに。|ハピタス

エクスプローラーを全て閉じるVBScript

なんか、僕は作業しているといつの間にかエクスプローラーのウィンドウがいっぱいになってたりすることがあるんです(笑)
個人的には、4〜5以上エクスプローラーのウィンドウがあるとウザいと思ってしまいます。。
そういった時は一旦全部閉じてしまおう、ということで、
一辺にエクスプローラーのウィンドウを閉じるVBScriptです。
このスクリプトに関しても、
ファイル名を指定して実行(Win+R)を利用してショートカットを用いた方が便利です。

ファイル名を指定して実行(Win+R)の活用方法はコチラ

'CloseExplorer.vbs
Option Explicit
On Error Resume Next

Dim objShell, objWindow
Dim Cnt

Set objShell = CreateObject("Shell.Application")

Do
    For Each objWindow In objShell.Windows
        'エクスプローラーのみ閉じる
        If TypeName(objWindow.document) = "IShellFolderViewDual2" Then
            objWindow.Quit
            Cnt = Cnt + 1
        End If
    Next
    If Cnt = 0 Then Exit Do
    Cnt = 0
Loop

Set objShell = Nothing

エクスプローラーが無くなるまでループ

一昨日のファイル吸い出しVBScriptでも同じ手法を使ってますが、
For Eachの外にDo Loopを噛ますことで、エクスプローラーが無くなるまでループという処理をしてます。
単純にFor Eachのループ中その要素を移動したり削除したりすると、
素数分ループするFor Eachでは、途中で要素数が変わって思い通りの結果になりません。
ですので、例えばFor Eachでその要素のパスとか、今回ならウィンドウハンドルを配列に控えておいて、
後でその配列分ループして移動なり削除する手法を用いますが、
これだと今回のプログラムの場合、何故だかエラーが多いんです(笑)
プログラムの記述ミスとかでは無く、VBScript自体が返すエラーです。
どうにかならないかなぁ〜と思って、この手法を思いつき試したら、エラーはかなり少なくなりました。
でも、完全には無くならないようですので、On Error Resume Nextステートメントで誤魔化してます(笑)
まぁ、この方が見た目もすっきりしますし、良いかも。

追記

この記事を書いていた頃はWindows XPを使っていました。追記している2018年現在、Windows 10が主流ですが、上記のままではエクスプローラーを閉じることが出来ません。

「IShellFolderViewDual2」の部分を「IShellFolderViewDual3」にすることで閉じることが出来ます。今後もし数字の部分が増えていくのなら、「InStr(TypeName(objWindow.document), "IShellFolderViewDual")」とでもした方が良いかもしれません。


Windows自動処理のためのWSHプログラミングガイド

Windows自動処理のためのWSHプログラミングガイド