【Excel VBA×Selenium】NoSuchWindowエラーの原因と対処法|閉じたタブを操作してしまう場合
みなさんこんにちは。
Excel VBAとSeleniumで複数のタブを操作していると、NoSuchWindowやno such windowというエラーが表示されることがあります。
今回は、閉じたタブを操作してしまう原因と、操作対象を元のタブに戻す方法についてご紹介したいと思います。
NoSuchWindowエラーが発生する原因
SeleniumはChromeで見えているタブと、VBAが操作対象にしているタブを別々に管理します。Closeでタブを閉じたあと、切り替えずにTitleなどを取得するとエラーになる場合があります。

SeleniumBasicでタブの一覧を確認する
通常のSeleniumでいうWindowHandlesに相当する機能は、SeleniumBasicではdriver.Windowsです。driver.Windows.Countで開いているタブ数を確認できます。
また、driver.Windowで現在のタブを保存でき、Window.Activateで切り替えられます。
Close後に正しいタブへ切り替えるコード
VBAの参照設定で「Selenium Type Library」を有効にし、標準モジュールへ次のコードを入力してください。新しいタブを開いて閉じ、残ったタブへ切り替える例となります。
Option Explicit
Sub CheckWindowAfterClose()
Dim driver As New Selenium.ChromeDriver
Dim firstWindow As Selenium.Window
Dim remainingWindow As Selenium.Window
On Error GoTo ErrHandler
'Chromeを起動し、最初のタブを保存する
driver.Start "chrome"
driver.Get "about:blank"
Set firstWindow = driver.Window
'2枚目のタブを開き、操作対象を切り替える
driver.ExecuteScript "window.open('about:blank','_blank');"
driver.SwitchToNextWindow 5000
Debug.Print "Close前:" & driver.Windows.Count & "タブ"
'現在操作している2枚目のタブを閉じる
driver.Close
'タブ一覧を取得し直し、元のタブに戻す
Debug.Print "Close後:" & driver.Windows.Count & "タブ"
If driver.Windows.Count = 0 Then GoTo CleanUp
Set remainingWindow = driver.Windows.Get(1)
remainingWindow.Activate
Debug.Print "切替後のURL:" & driver.Url
CleanUp:
driver.Quit
Exit Sub
ErrHandler:
Debug.Print "エラー:" & Err.Number & " " & Err.Description
On Error Resume Next
driver.Quit
End Sub

エラーの再現と実行結果
エラーを確認したい場合は、上記コードのdriver.Closeの直後に、一時的に次の行を追加してください。エラーハンドラーが内容をイミディエイトウィンドウへ出力します。撮影後は追加行を削除してね。
'エラーを確認するときのみ、driver.Closeの直後に追加
Debug.Print driver.Title
通常のコードを実行すると、イミディエイトウィンドウ(Ctrl + G)には次のように表示される想定です。
Close前:2タブ
Close後:1タブ
切替後のURL:about:blank
再取得と注意点
Windows.Get(1)は残りのタブが1枚の場合の例です。SeleniumBasicのListはVBAから参照すると1始まりとなります。複数タブが残る場合は、閉じる前に保存したfirstWindowをfirstWindow.Activateで復帰させる方法がおすすめよ。
なお、タブを切り替えたあとは、新しいタブのDOMに合わせてFindElementなどで要素を取得し直してください。閉じたタブのWebElementは再利用しないようにしましょう。
最後に
いかがでしたでしょうか。NoSuchWindowが発生した場合は、タブが残っているか確認し、Close後に操作対象を切り替えることが大切です。少しでも参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
