🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

VBA

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

Q&A

1回答

4418閲覧

Excel VBAのIE操作でinnertextの変数代入においてobjtag.innertext.valueのようなものの代わりのやり方を知りたい。

sneko

総合スコア5

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

VBA

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

0グッド

0クリップ

投稿2019/12/12 09:06

編集2019/12/13 01:43

for eachでtd idを取得してそれぞれ取得するところまでできたのですが、取得したループごとに変わる一時的な値をifの外で使うために、innertextを文字として変数に代入したいです。

下記のコードは間違っていますがイメージを伝えるためにあえて書きます。

HTMLの一部は下記のような感じです。

HTML

1<td id="ABC">12345</td> 2<td id="ABC">54321</td> 3<td id="ABC">13579</td> 4<td id="ABC">02468</td>

VBA

1 2Dim ExampleID as long 3 4For Each objtag In objIE.document.getElementsByTagName("td") 5if instr(objtag.outerHTML, "ABC") then 6ExampleID = objtag.innertext 7end if 8 9debug.print ExampleID 10 11Next 12

今回の場合if文の外で使いたい変数に入る値は1回目のループは"12345" 2回目"54321"となります。
この場合変数"ExampleID"をif文の外に書いたら当然、全体のobjtag.innertextを取得してしまいます。
そこで、下記のようにしてみました。

VBA

1Dim ExampleID as long 2 3For Each objtag In objIE.document.getElementsByTagName("td") 4if instr(objtag.outerHTML, "ABC") then 5ExampleID = objtag.innertext.value 6end if 7 8debug.print ExampleID 9 10next

.valueをつけてみると、使用不可なようでエラーがでました。
うまく説明できているかわからないですが不明点あれば都度追記させていただきます。
無知すぎてとても初歩的な事に気づいていないだけなのに、みなさまのお知恵をお借りすることになって申し訳ないのですがお答えいただけると幸いです。。。

追記:
td id重複の件ですが<table id="Area">内のtbody→tr→tdです。
コードを一部変えて下記に模写します。

HTML

1<tr> 2<td ~~~ id="Number">"取得したいinnertext1"</td> 3<td ~~~ id="Name">"取得したいinnertext2"</td> 4<td ~~~ id="address">"取得したいinnertext3"</td> 5</tr> 6 7<tr> 8<td ~~~ id="Number">"取得したいinnertext4"</td> 9<td ~~~ id="Name">"取得したいinnertext5"</td> 10<td ~~~ id="address">"取得したいinnertext6"</td> 11</tr>

上記のコードはダブルクォーテーション内以外そのままのものを書きました。
謎の~~~があって困ってます。
よければそれについても教えて頂きたいです。
それでは本題に戻りますと、
"取得したいinnertext"をfor eachでループごとに抜いていくのですが、

Code

1<td ~~~ id="address">のinnertext3が例えば"東京"だった場合に 2<td ~~~ id="Number">内の"取得したいinnertext1"を含めそれ以降の<td ~~~ id="Number">の 3innertextも取得しようとしています。 4おそらく、すでにinnertext3まで処理が進んでしまっているためか、うまく動かず、 51に戻って取得するにはなにか工夫が必要だと思い、今回はそれぞれnumber,name,addressを 6都度、変数に入れておいて、 7innertext3が"東京"だった場合に呼び出そうと考えました。 8 9現状だとinnertext3が"東京"だった場合にそれ以降の<td ~~~ id="Number">のinnertext4からの 10取得になってしまいます。

わかりにくい質問で申し訳ないです。

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

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

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

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

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

hatena19

2019/12/12 10:20

前回の質問のときもコメントに書いたのですが、HTML内ではidの重複はNGです。本当に同じIDが複数存在するのですか。実際はidではなくてclassではないですか。classならGetElementsByClassNameで簡単に目的のデータを取得できます。
guest

回答1

0

質問内容に矛盾があるので、勝手に解釈して、とりあえずの回答を出しておきます。

まず、idのデータが重複するということはHTMLの規則に反するので、実際はclassだとします。classなら重複は許されます。

html

1<table> 2 <tr> 3 <td class="ABC">12345</td> 4 <td class="ABC">54321</td> 5 <td class="ABC">13579</td> 6 <td class="ABC">02468</td> 7 </tr> 8</table>

このHTMLからclassが"ABC"の要素のなかのテキストをループで順に取り出したい。
とりあえずDebug.Printでイミディエイトウィンドウに下記のように出力します。

text

112345 254321 313579 402468

下記のコードで上記の出力になります。

vba

1Dim ExampleID as String 2Dim objClass AS Object 3For Each objClass In objIE.document.getElementsByClassName("ABC") 4 ExampleID = objClass.innerTExt 5 debug.print ExampleID 6Next

もし、class="ABC" がテーブル以外の要素にもついていて、テーブル内の要素(td)のみに限定したいなら、

vba

1Dim ExampleID as String 2Dim objtag AS Object 3Dim objClass As Object 4For Each objtag In objIE.document.getElementsByTagName("tr") 5 For Each objClass In objTag 6 ExampleID = objClass.innerTExt 7 debug.print ExampleID 8 Next 9Next

投稿2019/12/12 14:03

編集2019/12/13 01:22
hatena19

総合スコア34073

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

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

sneko

2019/12/13 01:38

少し追記させていただきました。
hatena19

2019/12/13 09:43

追記のHTMLを見ましたが、やはりidの値に重複がありますね。 もう一度確認しますが、本当にidなんですか。 だとしたら、そのホームページはだれが作成したものですか。 実際にあるWEB上にあるだれかが公開してるホームページですか。 もし、可能ならそのURLを提示してもらえますか。 不正確の情報で回答を書いても、結局時間の無駄遣いになりますので。 (既にかなりの時間を無駄にしています。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問