
ご回答者様
いつもお世話になっております。
表題の件、下記ソースですが無限ループをしてしまいます。
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
の部分が何か文字が入っていればとなりますがどのようにソースを記載すれば宜しいでしょうか。
よろしくお願いいたします。
No.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で出力するのなら、該当する最も外側の要素を一度だけ出力すればそれで足りると言えるかも知れません。(それで使いやすいのかどうかは別ですが…)
想像するところ、きちんと目的の対象要素だけをピックアップできる探索方法に変えれば良いのでしょうけれど、実体がどうなっているのか、求める結果がどういうものかなどがご質問文からは一切わからないので、そのあたりに関しては不明です。
お世話になります。
1晩置いてみましたが処理が完了していました。
時間がかかりそうですが一度今のソースで作成し、無理が出てきたら書き換えます。
ありがとうございます。
No.1
- 回答日時:
ここにある情報だけでは「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桁のチェックデジット付きのみ
⑦ その他(具体的に詳しく説明して下さい)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
bxSliderで動画をスライドごと...
-
PL/Iについて、教えてください。
-
WebサイトのHTMLオブジェクトの...
-
JavaScriptでクリップボードの...
-
Edge Chrom などの超初心者質問...
-
デジタル時計の時刻合わせの方...
-
エクセルのシート上に別のシー...
-
スクリプトって、何ですか?ど...
-
マイページはどこを開くの
-
ウインドウを毎回同じ位置、大...
-
一定時間おきにアラームやポッ...
-
小さな表示窓の呼び方は
-
Excelのワークシートが全部表示...
-
TikTokLiteの自動スクロールの...
-
エクセルVBAでフォームのListbo...
-
リトルバスターズEXを中古で購...
-
助けて下さい!小窓表示位置が...
-
同じページをブラウザで複数開...
-
MacのVLCでウインドウの幅の変更
-
「Cancel = True」とはどういう...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
(VBS) テキストファイル読込で...
-
bxSliderで動画をスライドごと...
-
MFCを使って、ひとつのkey(CStr...
-
PL/Iについて、教えてください。
-
【VBA/HTML】特定のタグ要素に...
-
WebサイトのHTMLオブジェクトの...
-
JavaScriptでクリップボードの...
-
VC++のデバッガでvectorの要素...
-
どこまでを動的に、どこまでを...
-
エクセルの散布図で選択してい...
-
【VB.NET】HTML要素を取得しよ...
-
jqueryについて(v 1.4.2)
-
ajax
-
[C++] vector<string> の各要素...
-
no confilict で value値が取れな
-
AJAXでのinputもしくはoptionな...
-
jqueryでtable内容の置き換え
-
フォームで入力時自動で次の項...
-
ajaxで追加したdom要素にscript...
-
ModeSwitchの状態の取得方法
おすすめ情報