@Haru57636433 (haru .)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

エクセルマクロVBA

ご質問失礼致します。
エクセルVBAマクロを使用したwebスクレイピングについてのご質問になります。

前提
Dim str As Variant ' 取得文字列として定義

    ' 検索対象A
    For Each str In html.getElementsByClassName("クラス名")
        Cells(irow, 5).Value = str.innerHTML
    Next

上記コードにて、とあるサイトの情報を取得しており、こちらに関しては問題なく動作します。
ですが、同じクラス名が同ページ内に複数存在する為、添え字を使用して下記の通りスクレイピングしようとしました。

    ' 検索対象A
    For Each str In html.getElementsByClassName("クラス名")(0)
        Cells(irow, 5).Value = str.innerHTML
    Next

添え字(0)を付け加えたのですが、
「実行時エラー438
 オブジェクトは、このプロパティまたはメソッドをサポートしていません」
というエラーを受け取ってしまいます。
添え字の付け方は間違っていないと思っているのですが、どこが問題かお分かりになれば教えて頂きたいです。

また、下記の通り.innertextを付け加えたりしましたが、同様の結果となりました。

    ' 検索対象A
    For Each str In html.getElementsByClassName("クラス名")(0).innertext
        Cells(irow, 5).Value = str.innerHTML
    Next
0 likes

3Answer

追記:この回答は複数存在する要素の最初のものだけを処理する想定でした。すべての要素を取得して順にセルに入れるには @jinoji さんの回答を参照してください。


For Each str In XXX は、配列 XXX から順に値を取り出して str に代入して以下の処理を繰り返す、という意味です。 html.getElementsByClassName("クラス名")(0) が返すのは配列ではなく要素オブジェクトですから、 For Each では処理できません。

ここでは何かを繰り返し処理する必要はないので、 For Each を使わず1つの要素オブジェクトを処理するように書き換えてください。

Dim element As Object
element = html.getElementsByClassName("クラス名")(0)
Cells(irow, 5).Value = element.innerHTML
1Like

Comments

  1. @Haru57636433

    Questioner

    ご回答ありがとうございます。
    配列と要素オブジェクトの違いも理解しておりませんでしたので
    助かりました。

ひょっとしてこういうことですか?

    For Each str In html.getElementsByClassName("クラス名")
        Cells(irow, 5).Value = str.innerHTML
        irow = irow + 1
    Next
1Like

Comments

  1. @Haru57636433

    Questioner

    ご回答ありがとうございまず。
    こちらのご回答の内容で必要としていたものが取り出せました。
    ありがとうございました。

こちらのご回答で問題が解決致しました。

For Each str In html.getElementsByClassName("クラス名")
Cells(irow, 5).Value = str.innerHTML
irow = irow + 1
Next

0Like

Your answer might help someone💌