arigato2050
@arigato2050 (arigato 2050)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

VBAにて getElementsByClassName がエラーになる

解決したいこと

VBAにて、getElementsByClassName がエラーになる。
当方の理解不足と思いますが、getElementsByClassNameを成功させる方法を教えてください。

発生している問題・エラー

Microsoft Visual Basic

実行時エラー'438':
オブジェクトは、このプロパティまたはメソッドをサポートしていません。

[継続][終了][デバッグ][へルプ]

該当するソースコード

Sub webtest()
    Set httpObj = CreateObject("MSXML2.XMLHTTP")
    httpObj.Open "GET", "https://qiita.com/about", False
    httpObj.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    httpObj.send

    Set objHtml = CreateObject("htmlfile")
    Call objHtml.write(httpObj.responseText)

    Set ele2 = objHtml.getElementsByTagName("div") '←これは成功
    Debug.Print ele2.Length
    For Each dl_ In ele2
        If dl_.getAttribute("className") > "" Then
            Debug.Print dl_.getAttribute("className")
        End If
    Next
    
    Set ele1 = objHtml.getElementsByClassName("allWrapper") '←ここでエラー
    Debug.Print ele1.Length
End Sub

結果↓

 24 
allWrapper


style-ymuwam
style-fv3lde
style-fv3lde

mainWrapper

style-1etsp53
style-17m4t2m
style-m7qmhk
style-rwj657
style-198ouat
style-12b39f7
style-6daghd
style-aqo7be
st-footer_container
st-footer_start
st-footer_signature
st-footer_catchcopy



自分で試したこと

・getElementsByTabName は成功した
・getElementById は成功した

※qiita様勝手にアクセスしてすみません。

0

3Answer

自分の(以下の)環境だと、エラーになりませんでした(取得できました)。

  • Windows 11 Pro バージョン 23H2、OS ビルド 22631.3810
  • Excel for Microsoft 365 バージョン 2406 ビルド 16.0.17726.20078 (64ビット版)

使われているOSやExcelのバージョンは何でしょうか?

2Like

Comments

  1. @arigato2050

    Questioner

    ありがとうございます。希望が持てました。
    当方のバージョンは以下でした。
    -Windows 11 Pro バージョン 23H2、OS ビルド 22631.2861
    -Microsoft 2016 MSO(16.0.4849.1000)(64ビット版)

「vba getelementsbyclassname 使えない」などをキーワードにググってみると IEのドキュメントモードが IE8 以下だと getElementsByClassName は未対応だそうですが、それが原因ではないのですか?

ところで、スクレイピングは、サイトの管理者に許可を得ているとか、規約に従って専用の API にアクセスしているとかでなければ、迷惑行為になるかもしれないということは認識してますか?

クローラーを作って某図書館サイトにアクセスしたら業務妨害とかで逮捕された事例もありますので、甘く見ない方がいいと思います。

逮捕までいかなくても、被害が深刻な場合は損害賠償の訴訟を受けるかもしれません。

訴訟までいかなくても、アクセス遮断なら Web サーバーの設定で管理者だけの判断で容易に可能なので、多分に可能性はあると思います。帯域ごと遮断され、あなたのやったことで多数の利用者が巻き添えを喰らうことになるかもしれません。

ご注意ください。

0Like

Comments

  1. @arigato2050

    Questioner

    ありがとうございます。
    IEは不使用ですが、「IEのドキュメントモード」が関係する可能性ですね。

    あなたのやったことで多数の利用者が巻き添えを喰らうことになるかもしれません。

    犯罪性や、上の可能性がないことも明記します。(export失敗する社内サーバのデータの退避)

  2. IE そのものは使ってなくても、どこかで COM の ShDocVw.dll が使われているとかがあるとするとドキュメントモードが IE8 以下になっている可能性はありますのでご注意ください。(例としては ShDocVw.dll のラッパーの WebBrowser コントロールがデフォルトでは IE7 相当です)

  3. @arigato2050

    Questioner

    ありがとうございます。
    現在手元のPC環境での解決は見送り、より新しいバージョンのPC環境で試そうと思います。

        Set objHtml = CreateObject("htmlfile")
        Call objHtml.write( _
            "<html><head><meta http-equiv='X-UA-Compatible' content='IE=Edge'/></head><body>" _
            & "<div id='idid' class='cccc'><div class='abc'></div><div class='xyz'></div></div>" _
            & "</body></html>")
    
        MsgBox objHtml.documentMode
    

    →結果:「8」

    (先駆者の情報)
    https://kinuasa.wordpress.com/2011/05/07/documentmode%E3%81%8C9%E3%81%AB%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%EF%BC%9F/

    documentModeが9にならない?

  4. 自分の環境で実行すると「11」でした。

  5. @arigato2050

    Questioner

    情報ありがとうございます。辻褄が合って、納得です。

Excelのバージョンを上げると成功するかも知れないと、理解しました。
確認はいつになるかわかりません。
ご協力ありがとうございました。

image.png

0Like

Comments

  1. 納得したのであれば、本問をクローズしましょう。

Your answer might help someone💌