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

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

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

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

VBA

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

Q&A

解決済

1回答

6435閲覧

VBA 上の処理が完了するまで処理を止める方法について

hirokin92

総合スコア3

DOM

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

VBA

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

0グッド

0クリップ

投稿2020/06/09 07:30

編集2020/06/09 09:00

お世話になっております。
現在Pタグから値を取得することは出来ました。
しかし、
ステップイン実行だと正常に動作して、
プログラム全体で実行を行うとPタグの値を取得出来ない、
という状況になってしまいパニックになりました。

色々なサイトを見たのですが、
今回の原因はおそらく、Pタグの値を取得する前に次の処理を行っているのが、
原因かと思っています。

■質問の内容
上の処理が完了するまで下の処理を止めるというコードを書きたいのですが、
ご教示いただけないでしょうか。


■作成したコード
Sub test()

Dim searchx As String
Dim searchy As String
Dim all As String
Dim box() As String

Dim WebIE As InternetExplorer

'------------------------------------
'★セルの文字取得

searchx = Cells(1, 1)
searchy = Mid(Cells(1, 5), InStr(Cells(1, 5), "@") + 1, 20)
all = searchx + " " + searchy
'------------------------------------

'------------------------------------
'★変数webIEを使用してIE起動

Set WebIE = New InternetExplorer WebIE.Visible = True WebIE.Navigate "https://www.google.com/?hl=ja"

'------------------------------------

'------------------------------------ '★IEのリロード完了まで処理をしない While WebIE.Busy Or WebIE.readyState <> READYSTATE_COMPLETE DoEvents Wend '------------------------------------ On Error Resume Next '値がないとエラーが出るので、エラー回避用 '------------------------------------ '★値をWebで入力 Dim A As Object For Each A In WebIE.document.getElementsByTagName("INPUT") '①FOR EACH でINPUTをすべて抜き出す。 If A.name = "q" Then A.Value = all Next '------------------------------------ '------------------------------------ '★検索ボタンをクリック Dim b As Object For Each b In WebIE.document.getElementsByTagName("INPUT") '①FOR EACH でINPUTをすべて抜き出す。 If A.name = "btnk" Then b.Click While WebIE.Busy Or WebIE.readyState <> READYSTATE_COMPLETE DoEvents Wend Next '------------------------------------ '------------------------------------- '★指定したURLのみ取得 Dim i As Long Dim boxi As Long ReDim box(boxi) i = 5 boxi = 0 Dim htmlDoc As HTMLDocument Set htmlDoc = WebIE.document Dim anchor As HTMLAnchorElement For Each anchor In htmlDoc.Links If InStr(anchor, searchy) <> 0 And InStr(anchor, "google.com") = 0 Then box(boxi) = anchor 'Cells(i, 1).Value = anchor Else boxi = boxi - 1 i = i - 1 End If i = i + 1 boxi = boxi + 1 Next anchor '------------------------------------- WebIE.Quit Set WebIE = New InternetExplorer WebIE.Visible = True WebIE.Navigate2 box(0)

'------------------------------------

'------------------------------------ '★IEのリロード完了まで処理をしない While WebIE.Busy Or WebIE.readyState <> READYSTATE_COMPLETE DoEvents Wend '------------------------------------ Dim access As Object For Each access In WebIE.document.getElementsByTagName("a") '①FOR EACH でINPUTをすべて抜き出す。 If access.innerText = "テスト" Or access.innerText = "テスト1" Or access.innerText = "テスト2" Then While WebIE.Busy Or WebIE.readyState <> READYSTATE_COMPLETE DoEvents Wend access.Click Exit For End If Next Dim juusyo As Object Dim cntn As Long Dim change As String cntn = 5 For Each juusyo In WebIE.document.getElementsByTagName("p") If InStr(juusyo.innerText, "東京都") > 0 Then Cells(cntn, 1).Value = juusyo.innerText Else End If Next End Sub

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

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

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

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

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

kenshirou

2020/06/09 08:05

webIE.documentは読込済みでしょうか? また、どのようにしてwebIE.documentの読込完了を確認していますか?
hirokin92

2020/06/09 08:13

Web.IE.documentはステップイン実行ではイミディエイトにて読込確認しております。 しかし全体で実行では読込を確認しておりません。 上記のコードの前にWebサイトに遷移するコードを作成しています。 そのページの読込が完了するまでdoEventで処理を停止するようにしています。 ので、取得ができていないとすると質問で投げたコードのどこかの処理が飛ばされているかと思い、 質問しました。
hirokin92

2020/06/09 08:14

失礼しました。 上記の補足としてページの表示までは問題なくできています。
otn

2020/06/09 08:56

コード全体を書きましょう。
hirokin92

2020/06/09 09:04

失礼しました。 コード全体を書きました。 内容は 1.セルの値を取得 2.その値を基にIEで検索 3.検索結果から"Google.com"というURLが入っている結果を外す 4.外した結果の一番上のURLを取得して新しいブラウザで開く 5.開いたサイトのタグのインナーテキスト"テスト" "テスト1" "テスト2"が当てはまるタグを取得 6.取得したURLに遷移 7.遷移したページのPタグのインナーテキストに"東京都"が入ってあるか検索 8.当てはまるタグがあったらそのタグのインナーテキストを取得←ここが全体を実行で動作しません。
hatena19

2020/06/09 16:39

On Error Resume Next をコメントアウトして実行すると、どの行でエラーがでますか。また、そのエラーメッセージはなんですか。
guest

回答1

0

ベストアンサー

上記コードを見る限り、以下の「質問への追記・修正の依頼」にコメントされた

5.開いたサイトのタグのインナーテキスト"テスト" "テスト1" "テスト2"が当てはまるタグを取得
6.取得したURLに遷移

の後に、URL遷移が完了したかどうかの処理がないようです。
※他の所では、以下のようにしてIEの読込完了状態を確認している。

VBA

1'pタグ取得前に、以下のような処理が行われていない 2While WebIE.Busy Or WebIE.readyState <> READYSTATE_COMPLETE 3 DoEvents 4Wend

このため、ページ切替完了前に所定のpタグを探そうとして見つからない、ということなのではないかと思います。
(ステップ実行時には、ステップ実行中にページ切替が完了したため、所定のpタグが見つかった、というオチ。)

投稿2020/06/10 00:28

編集2020/06/10 00:30
kenshirou

総合スコア772

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

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

hirokin92

2020/06/10 01:01

回答ありがとうございます。 すみませんでした。 おっしゃられた通り、ページ切り替えの前にpタグ取得処理に流れていたのが原因でした。 ページ切り替えの処理の後ろにWhile ~Wendを挿入したら、問題なく全体で実行が動きました。 本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問