Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4591 / 13644 ツリー ←次へ | 前へ→

【55744】開いている複数のIEを閉じる。 あつし 08/5/18(日) 14:07 質問[未読]
【55746】Re:開いている複数のIEを閉じる。 kanabun 08/5/18(日) 14:51 発言[未読]
【55748】Re:開いている複数のIEを閉じる。 あつし 08/5/18(日) 15:13 発言[未読]
【55753】Re:開いている複数のIEを閉じる。 りん 08/5/18(日) 16:42 回答[未読]
【55763】Re:開いている複数のIEを閉じる。 あつし 08/5/18(日) 22:44 お礼[未読]
【55760】Re:開いている複数のIEを閉じる。 IE 08/5/18(日) 21:11 回答[未読]
【55764】Re:開いている複数のIEを閉じる。 あつし 08/5/18(日) 23:00 お礼[未読]

【55744】開いている複数のIEを閉じる。
質問  あつし  - 08/5/18(日) 14:07 -

引用なし
パスワード
   現在開いているすべてのIEを閉じたいのですが、どうしても、数が増えるとすべて消すことが出来ません。
自分が試したコードは以下のようです。

Sub test()
 Dim oSH, oIE

 Set oSH = CreateObject("Shell.Application")

 For Each oIE In oSH.Windows
  If InStr(oIE.FullName, "IEXPLORE.EXE") > 0 Then
   oIE.Quit
  End If
 Next
End Sub

このコードを実行すると2〜3程度のIEなら消せるのですが、それ以上の数を開くと、全部閉じずに終了してしまいます。
どなたかアドバイスお願いします。

また、もし特定のIEのみ開いたままで、他のすべてのIEを閉じる方法もありましたら、併せてアドバイスお願いします。

【55746】Re:開いている複数のIEを閉じる。
発言  kanabun  - 08/5/18(日) 14:51 -

引用なし
パスワード
   ▼あつし さん:

> For Each oIE In oSH.Windows
>  If InStr(oIE.FullName, "IEXPLORE.EXE") > 0 Then
>   oIE.Quit
>  End If
> Next

    'HTMLDocumentだったら
    If TypeName(oIE.document) = "HTMLDocument" Then

判定してはどうかしら

【55748】Re:開いている複数のIEを閉じる。
発言  あつし  - 08/5/18(日) 15:13 -

引用なし
パスワード
   kanabun さん こんにちは。
早速の返答ありがとうございます。

>    'HTMLDocumentだったら
>    If TypeName(oIE.document) = "HTMLDocument" Then

試してみたのですが、やはり複数のIEが開いていると3〜4回 For で回った後、まだ開いているIEがあっても For から抜けてしまいました。

【55753】Re:開いている複数のIEを閉じる。
回答  りん E-MAIL  - 08/5/18(日) 16:42 -

引用なし
パスワード
   あつし さん、こんにちわ。

>やはり複数のIEが開いていると3〜4回 For で回った後、まだ開いているIEがあっても For から抜けてしまいました。
全部チェックすることはできてもQuitは2〜4で中断するようですね。

配列に取得して、後ろから閉じます。

Option Explicit
Sub TEST()
  'オブジェクトを格納する変数
  Dim obj1 As Object, obj2 As Object, NN As Long, II As Long, ChkUrl As String
  'サンプル:質問箱のトップページ
  ChkUrl = "htt" & "p://www.vbalab.net/"
  '
  Set obj1 = CreateObject("Shell.Application")
  'ウインドウの数
  NN = obj1.Windows.Count
  If NN > 0 Then
   'ウインドウオブジェクトと判定結果を取得しておくための配列
   ReDim flg(NN) As Boolean
   ReDim w1(NN) As Object
   II = 0
   For Each obj2 In obj1.Windows
     II = II + 1
     flg(II) = TypeName(obj2.document) = "HTMLDocument"
     If flg(II) = True Then
      'アドレスが一致したら閉じない
      flg(II) = Not (obj2.document.URL = ChkUrl)
     End If
     Set w1(II) = obj2
   Next
   '閉じるときは念のために逆回し
   For II = NN To 1 Step -1
     If flg(II) = True Then w1(II).Quit
   Next
   Erase w1, flg
  End If
  '終了
  Set obj1 = Nothing
End Sub

こんな感じです。
アドレスを分けてるのは禁止語句で投稿できないからなので、実際はつなげて書いてただいて結構です。

【55760】Re:開いている複数のIEを閉じる。
回答  IE  - 08/5/18(日) 21:11 -

引用なし
パスワード
   > For Each oIE In oSH.Windows

降順に処理

 For k=oSH.Windows.Count-1 To 0 Step -1
  Set oIE=oSH.Windows.Item(k)

【55763】Re:開いている複数のIEを閉じる。
お礼  あつし  - 08/5/18(日) 22:44 -

引用なし
パスワード
   りんさん、こんばんは。

完璧なコードありがとうございます。
まさに、自分のしたかったことが、実現できました。

なぜ、Quitが数回の実行で終了するのかは分かりませんが、配列に入れることで解決出来る事がわかり、助かりました。
試しに
>   '閉じるときは念のために逆回し
>   For II = NN To 1 Step -1
のところを正順で
    For II = 1 to NN
としてみましたが、作動しました。

【55764】Re:開いている複数のIEを閉じる。
お礼  あつし  - 08/5/18(日) 23:00 -

引用なし
パスワード
   IE さん 今晩は。

>  Set oIE=oSH.Windows.Item(k)
のところで
プロシージャの呼び出し、または引数が不正です。
とのエラーが出てしまいました。

試しにウィンドウを7つ開いているときに
A: Set oIE=oSH.Windows.Item(6)
または
B: Set oIE=oSH.Windows.Item(k-1)
とするとエラーは出なくなるのですが、

A:では続けて処理できないし、
B:では最後のウィンドウがItemの引数が-1になるためエラーになるので、閉じることが出来ませんでした。

しかし、降順で処理することで連続してQuitを処理することが出来ることを確認しました。
りんさんのアドバイスで必要な答えがいただけたので、これで解決とさせていただきます。
上記の問題は追々自分で調べて見ます。

アドバイスありがとうございました。

4591 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free