none
VBAでChromeを動かすと「メモリ不足」と出て止まってしまう! RRS feed

  • 質問

  • https://note.com/teihen_escape/n/n40e672b1c97f
    ↑これを試行中です。お題は「【お手軽カンタン自動化!エクセルVBA × Google Chromeで身代わりロボットを作る方法】」です。
     
    準備が整って、このページに載っている、これを稼働させたのですが↓

    ===========

       

    Sub ヤフー検索()

    Dim Driver As New ChromeDriver

    Driver.Get "https://search.yahoo.co.jp/"

    Driver.FindElementByCss("#yschsp").SendKeys "VBA"
    Driver.FindElementByCss("#sbn > fieldset > div.sbox_1.cf > input").Click

    Stop

    Driver.Close
    Set Driver = Nothing

    End Sub

    ==========

    Chromeは一応立ち上がってくれて、Yahooの検索画面まで進むのですが、自動検索は行われず(上のプログラムはYahooでの検索を自動でやってくれるしくみです)、VBE上に「実行時エラー7 メモリが不足しています」と出て凍ってしまうのです。Chromeも消えてしまいます。

     
    これはどうしてでしょう?Yahoo側が何かこういう自動システムを排除するようになっているのでしょうか。
     
    どうすれば望む機動になるのか、皆さんのお知恵をお貸し願えますか。

    [追記]上のプログラムから

    Driver.FindElementByCss("#yschsp").SendKeys "VBA"
    Driver.FindElementByCss("#sbn > fieldset > div.sbox_1.cf > input").Click

    この部分を外してみたところ、正常に機能しました。ということはこれが「メモリ不足」の原因なのだと思います。しかしどうしてこれがメモリ不足を起こしてしまうのでしょう?

    • 編集済み enjin2000 2020年12月22日 2:10
    2020年12月22日 1:54

回答

  • メモリ不足かどうかは判りませんが、FindElementByCssの引数が間違っていることは確かです。
    search.yahoo.co.jpのページにはyschspという要素は存在していないため、見つけることができません。

    Chromeを普通に立ち上げて、F12キーを押すと開発ツールが表示されます。
    開発ツールの左上にあるアイコンをクリックしてからページ内の要素をクリックすると、その要素の情報が見られるので、idやクラスが正しいかを調べましょう。

    Sub ヤフー検索()
    
        Dim Driver As New ChromeDriver
        
        Driver.Get "https://search.yahoo.co.jp/"
        
        Dim elem As Selenium.WebElement
        
        'Driver.FindElementByCss("#yschsp") 'idがyschspの要素を探す。ただし見つからないのでエラー
        'Driver.FindElementByCss("#sbn > fieldset > div.sbox_1.cf > input") 'idがsbnの要素を探して、その内側のfieldsetを探して、、、となっているが見つからないのでエラー
        
        Set elem = Driver.FindElementByCss("input") 'タグがinputの要素を探す
        'Set elem = Driver.FindElementByCss(".SearchBox__searchInput")'classにSearchBox__searchInputがある要素を探す
        
        Call elem.Clear
        Call elem.SendKeys("VBA")
    
        Set elem = Driver.FindElementByCss(".SearchBox__searchButton")
        elem.Click
        
        Do While Driver.ExecuteScript("return document.readyState") <> "complete"
            Call Driver.Wait(100)
        Loop
      
        Stop
        
        Driver.Close
        Set Driver = Nothing
    
    End Sub


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2020年12月22日 14:44
    • 回答としてマーク enjin2000 2020年12月27日 10:05
    2020年12月22日 14:01

すべての返信

  • メモリ不足かどうかは判りませんが、FindElementByCssの引数が間違っていることは確かです。
    search.yahoo.co.jpのページにはyschspという要素は存在していないため、見つけることができません。

    Chromeを普通に立ち上げて、F12キーを押すと開発ツールが表示されます。
    開発ツールの左上にあるアイコンをクリックしてからページ内の要素をクリックすると、その要素の情報が見られるので、idやクラスが正しいかを調べましょう。

    Sub ヤフー検索()
    
        Dim Driver As New ChromeDriver
        
        Driver.Get "https://search.yahoo.co.jp/"
        
        Dim elem As Selenium.WebElement
        
        'Driver.FindElementByCss("#yschsp") 'idがyschspの要素を探す。ただし見つからないのでエラー
        'Driver.FindElementByCss("#sbn > fieldset > div.sbox_1.cf > input") 'idがsbnの要素を探して、その内側のfieldsetを探して、、、となっているが見つからないのでエラー
        
        Set elem = Driver.FindElementByCss("input") 'タグがinputの要素を探す
        'Set elem = Driver.FindElementByCss(".SearchBox__searchInput")'classにSearchBox__searchInputがある要素を探す
        
        Call elem.Clear
        Call elem.SendKeys("VBA")
    
        Set elem = Driver.FindElementByCss(".SearchBox__searchButton")
        elem.Click
        
        Do While Driver.ExecuteScript("return document.readyState") <> "complete"
            Call Driver.Wait(100)
        Loop
      
        Stop
        
        Driver.Close
        Set Driver = Nothing
    
    End Sub


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2020年12月22日 14:44
    • 回答としてマーク enjin2000 2020年12月27日 10:05
    2020年12月22日 14:01
  • 返信が遅れてしまいました。自力でなんとか解決しました。ほんの二週前に学び出したど素人です。

    2020年12月27日 10:06