質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

2654閲覧

VBA:Tableのタグの取り出しについて

taakfue

総合スコア5

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2021/10/10 08:55

編集2021/10/11 13:17

前提・実現したいこと

エクセルのセルに入力されている英単語の意味を調べ、日本語訳を隣のセルに書き出すマクロを組もうとしています。その前段階として変数に日本語訳が格納される(イミディエイトウィンドウに表示されるか)か確認したところ、下記に記したマクロでは「オブジェクトはこのプロパティやメソッドをサポートしていません」というエラーが出てしまいます。この原因と対応策をご教示ください。
また可能であれば、「試したこと」に書いてある内容についても原因を教えてくれると幸甚です。よろしくお願いいたします。

発生している問題・エラーメッセージ

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

該当のソースコード

    Sub searchword() 0. 0. ' Seleniumのインスタンス生成(お決まり文言) 0. Dim Driver As New Selenium.WebDriver 0. Driver.Start "chrome" ' chrome使うからこれ 0. 0. ' 引数に開きたいURLを指定する 0. Driver.Get "URLの文字列" 0. 0. Dim searchword As String 0. searchword = ActiveSheet.Cells(1, 1).Value 0. 0. '' ' ①検索ボックスに英単語を入力 0. Driver.FindElementByCss("#searchWord").SendKeys searchword 0. '' 0. '' ' ②検索ボタンをクリックする 0. Driver.FindElementByCss("#headFixBxTR > input").Click 0. 0.  Dim mean As WebElements 0. Dim e As Variant 0. Set mean = Driver.FindElementsByTag("td") 0. For Each e In mean 0. Debug.Print e.Path 'イミディエイトウィンドウに書き出し メソッドサポートしていないエラー発生 0. Next 0. ' 終了処理 0. Driver.Close 0. Set Driver = Nothing 0. 0.   End Sub

試したこと

td要素を取得するために以下のコードに置き換えて試すと、エラーが出ずに処理は進みますが、イミディエイトウィンドウに何も表示されません…

' Dim elements, elements2
' '該当テーブルのTRを取得(ポイントはElement"s")
' Set elements = Driver.FindElementByXPath("//*[@id=""summary""]/div[2]/table/tbody/tr/td[2]").FindElementsByTag("tr")
' 'データの数だけループ
' For Each elements2 In elements
' '見出し行でないかの確認
' If elements2.FindElementsByTag("th").Count = 1 Then
' Debug.Print elements2.FindElementsByTag("th")(1).Text '書店
' Debug.Print elements2.FindElementsByTag("td")(1).Text '店舗名
' Debug.Print elements2.FindElementsByTag("td")(2).Text '住所
' Debug.Print elements2.FindElementsByTag("td")(3).Text '営業時間
' Debug.Print elements2.FindElementsByTag("td")(4).Text '在庫状況
' End If
' Next elements2

補足情報(FW/ツールのバージョンなど)

e.Pathをe.Textに変更したら、今度は下記の画像のようなエラーが出てしまいました。申し訳ないのですが対応方法を教えてください

イメージ説明

ここにより詳細な情報を記載してください。

すみません。StaleElementsReferenceErrorについては、待機時間を設けることで解決できました。しかし、目的のtdタグの情報が取り出せずにいません。下記の画像中の青枠で囲まれた部分の取り出し方をご教示いただけますでしょうか。
何度もすみません。よろしくお願いいたします。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Debug.Print e.Path 'イミディエイトウィンドウに書き出し メソッドサポートしていないエラー発生

少し調べてみたところ WebElementPath というプロパティは無さそうでした。
代わりに Text プロパティを試してみて下さい。

VBA

1For Each e In mean 2 'Debug.Print e.Path 3 Debug.Print e.Text 4Next

<参考>
■ Selemium Basic VBA用ドキュメントの日本語訳メモ
https://curio-shiki.com/blog/vba/selemium-basic-vba-documentation

投稿2021/10/10 12:20

cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taakfue

2021/10/11 12:27

回答いただき、ありがとうございます。e.textに変更したら、438の実行時エラーは出なくなりました。しかし今度は実行時エラー10が出てくるようになりました…(上部の補足情報の欄にエラーの画像を示したのでご確認ください) これについて対処法をご教示いただけますでしょうか。 (また、参考情報のリンク先を共有いただき、ありがとうございます。)
taakfue

2021/10/11 13:18

すみません。StaleElementsReferenceErrorについては、待機時間を設けることで解決できました。しかし、目的のtdタグの情報が取り出せずにいません。下記の画像中の青枠で囲まれた部分の取り出し方をご教示いただけますでしょうか。よろしくお願いいたします。
cx20

2021/10/11 15:53

Set mean = Driver.FindElementsByCss(".descriptionWrp table td.content-explanation.ej") で、どうでしょうか? なお、サービスによってはスクレイピングが禁止されているサービスもありますので留意ください。
taakfue

2021/10/17 06:24

返信が遅くなり申し訳ありません (通知が来ず、コメントが来ていないと勝手に思っておりました) 上記のコードに置き換えるとうまくいきました!本当にありがとうございます。 またご助言いただきありがとうございます。スクレイピングする際は利用規約等を確認するようにします。
taakfue

2021/10/17 07:00

すみません。もう一点質問させてください。 上記の変数(mean)をエクセル上に書き出そうとするとエラーが出てうまくいきません。 例えば、 Range("B1").Value = mean.Attribute("innerText") と入力すると、「実行時エラー1004:見つからないパラメータには既定値がありません」と表示され、 Range("B1").Value = e.Attribute("innerText") と入力すると「オブジェクトが必要です」とエラーがでます。 すみませんが対処法を教えていただけますでしょうか? よろしくお願いいたします。
cx20

2021/10/17 09:14

> Range("B1").Value = mean.Attribute("innerText") ⇒ Range("B1").Value = mean.Item(1).text > Range("B1").Value = e.Attribute("innerText") ⇒ Range("B1").Value = e.Text を試してみて下さい。
taakfue

2021/10/17 13:05

Range("B1").Value = mean.Item(1).text に置き換えるとうまくいきました!ありがとうございます。 ただ、 Range("B1").Value = e.Text だとやはり「オブジェクトが必要です」というエラーが出ます。 とりあえず書き出すことには成功できたのでよしとします。 助かりました
cx20

2021/10/17 13:09 編集

> Range("B1").Value = e.Text だとやはり「オブジェクトが必要です e を使う場合は、mean からコレクションの要素を取り出す必要があります。 For Each e In mean   Range("B1").Value = e.Text Next
taakfue

2021/10/19 21:34

うまくいきました!ありがとうございます。 変数の種類(?)によってコードの書き方を変える必要があるんですね もう少し勉強してみようと思います いろいろご教示いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問