電子書籍の厳選無料作品が豊富!

ご回答者様

いつもお世話になっております。
表題の件、下記ソースですが無限ループをしてしまいます。


For Each Element3 In ObjIE3.document.GetElementsByTagname("要素")
If InStr(Element3.OuterHTML, "JANコード") > 0 Then
For Each Element4 In Element3.GetElementsByTagname("要素")
Worksheets("Output").Cells(i + 1, 1) = Element4.InnerHTML
Next
End If

恐れ入りますがならないような工夫は御座いますでしょうか。

初心者で恐れ入りますがJANコードを取得し、他の項目も取得をしたいです。
仮に商品名の場合は0以上等の数値ではないので"JANコード") > 0 Then
の部分が何か文字が入っていればとなりますがどのようにソースを記載すれば宜しいでしょうか。

よろしくお願いいたします。

A 回答 (2件)

こんにちは



>無限ループをしてしまいます。
無限ループと判断している根拠は何でしょうか?
・何も出力されずに止まっている
・同じような(←まったく同じではない)、文書断片が沢山出力される
あたりかと推測しますが…

・ご提示のコードではFor~Nextが対応していませんので、構文エラーで止まっている可能性があります。
・「"要素"」としているところに実際は何が入っているのか不明ですが、そのまま「"要素"」だとするなら、
・該当「"要素"」が存在しない時、VBAでは次のFor Eachでエラーになるようですが、回避されていません。(エラー発生はきちんと検証はしていません)
といったあたりはひとまずクリアできているとして…

対象のHTMLがどのようなものなのかまったくわかりませんが、仮に直接対象としている文書片をちゃんと探せるとしても、ご提示のロジックだとその祖先要素で重複してヒットすることになるので、累乗的回数の重複出力がされるものと考えられます。

例として、以下の文書片をElement3の包含的な構成として考えてみます。
(選択要素がdivとした場合を想定)
<div1>
 <div2>
  <div3>
   <div4>JANコード<div5></div5></div4>
  </div3>
 </div2>
</div1>

2行目の判定で、<div1><div2><div3><div4>がヒットすると考えられます。
3行目のループで、このそれぞれに対して子孫を出力しますので、得られる出力は
<div1>
<div2>
<div3>
<div4>
<div2>
<div3>
<div4>
<div3>
<div4>
<div4>
のようになることが期待されます。
通常のサイトだと、この程度のネストではすまない可能性が高いので、出力数は飛躍的に増加するかも知れません。(上記の程度の場合もあるかも知れませんが…)
もしも、これを「無限ループ」と称しているのなら、このループは「無限」ではなくきちんと終了するものと思います。
気長に待ちましょう。

あるいは、もしこれがお望みの結果ではないのならば、処理のロジックを見直すことが必要になるでしょう。
常識的に考えれば、同じものを何度も出力させることが必要とも思えませんので、必要な要素(または要素群)を一度だけ出力すれば良いものと想像されます。
innerHTMLで出力するのなら、該当する最も外側の要素を一度だけ出力すればそれで足りると言えるかも知れません。(それで使いやすいのかどうかは別ですが…)

想像するところ、きちんと目的の対象要素だけをピックアップできる探索方法に変えれば良いのでしょうけれど、実体がどうなっているのか、求める結果がどういうものかなどがご質問文からは一切わからないので、そのあたりに関しては不明です。
    • good
    • 0
この回答へのお礼

お世話になります。
1晩置いてみましたが処理が完了していました。
時間がかかりそうですが一度今のソースで作成し、無理が出てきたら書き換えます。
ありがとうございます。

お礼日時:2020/01/26 18:11

ここにある情報だけでは「Element3.OuterHTML」に何が入っているか判らないので勘違いの事になるかもしれません。


「InStr(Element3.OuterHTML, "JANコード") > 0」は「JANコード」という文字列が1つ以上という事なので、JANコードの実際の13桁の数字(8桁の数字の場合もあり)だけが入っているならば、はねられてしまいます。

以下の場面ごとの「Element3.OuterHTML」に、実際にどんな文字列が入っているかを提示していただけると回答が増えると思います。
① JANコードを含む場合
② JANコードを含まない場合

扱うJANコードについて、次の中から選択して下さい。
③ 13桁、8桁のチェックデジット付き、および、12桁、7桁のチェックデジット無の全て
④ 13桁のチェックデジット付き、および、12桁のチェックデジット無のみ
⑤ 13桁、8桁のチェックデジット付きのみ
⑥ 13桁のチェックデジット付きのみ
⑦ その他(具体的に詳しく説明して下さい)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!