![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
ご回答者様
いつもお世話になっております。
表題の件、下記ソースですが無限ループをしてしまいます。
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) VBAでのループ順序について 3 2023/03/13 10:55
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 形式を選択して貼り付け 以下のコードで「元」シートと「先」シートのA列に同じ値があったら指定範囲をコ 5 2022/11/11 07:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MFCを使って、ひとつのkey(CStr...
-
【VBA/HTML】特定のタグ要素に...
-
デジタル時計の時刻合わせの方...
-
マイページはどこを開くの
-
一定時間おきにアラームやポッ...
-
スクリプトって、何ですか?ど...
-
ウインドウを毎回同じ位置、大...
-
Javascript_submit()完了後に処...
-
エクセルのシート上に別のシー...
-
リストビューをスクロールさせ...
-
「Cancel = True」とはどういう...
-
ウィンドウが、前回閉じた位置...
-
Youtubeが勝手に右下に勝手に小...
-
Excelでワードアートや図を常に...
-
ポップアップと作業ウィンドウ...
-
Wordのスクロールバーが短くなった
-
受信メールボックスの中からメ...
-
インタネットからPDFファイルだ...
-
ポップアップウィンドウがブロ...
-
[Java] Edgeでのアドレスバー非...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MFCを使って、ひとつのkey(CStr...
-
PL/Iについて、教えてください。
-
(VBS) テキストファイル読込で...
-
VC++のデバッガでvectorの要素...
-
bxSliderで動画をスライドごと...
-
【VBA/HTML】特定のタグ要素に...
-
no confilict で value値が取れな
-
WebサイトのHTMLオブジェクトの...
-
ICPCの過去問
-
エクセルでタグの内容が取得で...
-
フローティングのやり方について
-
フォームで入力時自動で次の項...
-
エクセルの散布図で選択してい...
-
Ajax.Updaterで読み込んだ先の...
-
JavaScriptでクリップボードの...
-
lispについて質問です
-
フォームをリサイズ後に動作を行う
-
ページ全体をスクロールするAja...
-
jqueryでtable内容の置き換え
-
VBA スクレイピング
おすすめ情報