• 締切済み

繰り返し処理?VBA

エクセルのVBAの中で下記の様なものを作りました。 VBAで開かせたブラウザのページの中に、画像のボタンが数個あり、 その中の一つのボタンをクリックして、ページを移動させたいのですが、下記でやっても、数回に1回はページを移動しないという問題が起きています。 処理は行われているはずなのですが、確実にページを移動させてから、 次の処理を行わないと、次の処理で止まってしまいます。 いい方法があれば、伝授ください。 開いているページから、111.htmlページへ確実に移動した事を確認してから、次の処理をさせたいのです。 For Each link In objIE.Document.Links If link.href = "​http://www.***.111.html"​ Then link.Click Exit For End If Next

みんなの回答

  • iekjqo
  • ベストアンサー率19% (7/36)
回答No.1

会社にしかリファレンスブックがないので、 確実ではないですが、IEのオブジェクトで ロードが終了したら。。。みたいなメソッドがあった気がします。

sumi3377
質問者

補足

上記の後に、読み込んでから。。。というメソッドを 入れていますが、読み込んでいないのに、走っているようです。 その後の、処理でエラーになってしまいますので、原因は、上記のボタンにあるリンク先をクリックする処理にある様な気がします。 多分、クリックしてもページが切り替わらない時があるのだと思いますが、それを確実にページが切り替わってから。。。処理するにしたいのです。何かいい方法はありますか?

関連するQ&A

  • VBAでリンクを踏みたい

    とあるサイトにログインした後に、「このページを印刷する」というリンクをVBAでクリックしたいのですが ソースは <div class="section sideinfo"> <a href="#" class="print" onClick="JavaScript:openPrintWindow('CG017_001', 'CG018'); return false;">このページを印刷する</a> </div> こうなっています。 VBAコードで objIE.Document.all.Item("JavaScript:openPrintWindow('CG017_001', 'CG018')").Click をすると、「オブジェクト変数または With ブロック変数が設定されていません。」になります。 For i = 0 To objIE.Document.Links.Length - 1 'Debug.Print objIE.Document.Links(i).innerHTML If objIE.Document.Links(i).innerHTML = "このページを印刷する" Then objIE.Document.Links(i).Click Exit For End If Next i これで踏むことはできるのですが、 ソースから文字を探してそれをVBAコードにあてて踏むことはできないのでしょうか?

  • VBAにて、セルの内容と一致しない場合の処理

    VBAを独学で学んでいる者です。 実力・知識がないながらも検索エンジンなどを頼りに頑張っています。 しかしながらどうしてもわからない事があり、煮詰まってしまいましたので、質問させていただきました。 当方、VBAにてIEを操作し、セルの内容を自動入力していくプログラムを書いています。 以下に記述しているものや、「document.body.innertext」で取得したIEの情報と書き込みたいセルの内容が一致しない場合にエラーメッセージを表示したいのですが、どうもうまくいきません。 If~Thenなどを使うことで条件分岐できるのだとはおもうのですが、当方の記述ですと条件を無視(?)してElseに飛んでしまいます。 当方が記述している内容は以下です。 (Cells(1, 1)には文字列を入力しています。) ~ここから~ 'リンク情報からオブジェクトを探し.Clickする For n = 0 To objIE.document.Links.Length - 1 'リンク数分まわす Debug.Print objIE.document.Links(n).innertext 'デバックで表示する 'リンク先(.text)をチェックする(文字列比較する) If objIE.document.Links(n).innertext = ActiveSheet.Cells(1, 1).Text Then objIE.document.Links(n).Click '.Clickでクリックしてみた Exit For '見つかったので強制的にループを抜ける Else MsgBox "NG!!", vbExclamation Exit Sub End If Next ~ここまで~ Else MsgBox "NG!!", vbExclamation Exit Sub を消すと、「For n = 0 To objIE.document.Links.Length - 1 」がinnertextを取得し、Cells(1, 1)の内容を読み取りクリックを実行してくれるのですが、Elseを入れると、Cells(1, 1)の内容と一致しているにも関わらず、Elseへ移行し、NGのメッセージボックスが出てきます。 記述が間違っているのでしょうか? 何か他の記述がございますようでしたらご教授願えますでしょうか? 宜しくお願い致します。

  • vba ie操作 電気家計簿ログインできない

    いつもお世話になっております。 何度も質問して申し訳ございません。またまた教えてください。 電気家計簿(https://www.kakeibo.tepco.co.jp/dk/aut/login/)のログインボタンをVBAで押したいのですが うまくできません。 コードは下記の通りです。 ***************************************************************** Sub test() Dim objIE As InternetExplorer Dim myObj As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://www.kakeibo.tepco.co.jp/dk/aut/login/" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Document.all("id").Value = "test" objIE.Document.all("password").Value = "tset" 'objIE.Document.Forms(0).submit 'これだと更新されちゃうっぽい 'objIE.Document.Forms(0).Item(2).Click 'Item(0)とItem(1)はエラーにならないけど何も起こらない。Item(2)にするとエラー 'objIE.Document.all.submit.Click 'エラー 'エラーにならないけど何も起こらない 'For i = 0 To objIE.Document.Links.Length - 1 ' If objIE.Document.Links(i).innerHTML Like "*alt=ログイン*" Then ' objIE.Document.Links(i).Click ' Exit For ' End If 'Next i 'エラーにならないけど何も起こらない 'For Each myObj In objIE.Document.forms(0).all ' If TypeName(myObj) = "HTMLInputElement" Then ' If myObj.alt = "ログイン" Then ' myObj.Click ' Exit For ' End If ' End If 'Next Set objIE = Nothing End Sub ***************************************************************** 自分なりにいくつか試してみたのですが、うまくいきませんでした。 ご教授よろしくお願いします。

  • vba IE操作で こういう事ってできない?

    vba IE操作で こういう事ってできないのでしょうか? Dim objIE As InternetExplorer Sub test() Dim myObj As Object Dim myStr As String Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://employment.en-japan.com/search/search_list.cfm?area=23&startRow=1&m=1&job=100000" objIE.Visible = True Call iewait For Each myObj In objIE.Document.all.tags("a") If myObj.outerText = "詳細を見る" Then myObj.Click Call iewait Debug.Print objIE.LocationName objIE.GoBack Call iewait End If Next objIE.Quit Set objIE = Nothing End Sub Sub iewait() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.ReadyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub このコードを実行して、 1ページ目の「詳細を見る」をクリックして、2ページ目のタイトルを抜き出し 1ページ目に戻り、次の「詳細を見る」をクリックして、2ページ目のタイトルを抜き出し・・・ と言う処理を繰り返したいのですが、 1回目のmyObj.Clickを通った後(Call iewaitの後かも?)に、 myObjの値が変数なしになってしまい、 2回目のIf myObj.outerText = "詳細を見る" Thenで 書き込みできません。(Error 70) になります。 1ページ目のリンクをクリックして、戻って また1ページ目のリンクをクリックして・・・ と言う処理をしたい場合どうすればよろしいでしょうか?

  • VBA、IE操作、初心者になります

    webページの操作についての質問になります。 VBAでやりたいことです。 (1)webページを開き、指定したソースが表示されるまで、画面を更新 (2)ソース表示がされたら、指定したボタンをクリック (3)画面が移行する (4)移行したページの指定したボタンをクリック 不具合 (2)ボタンクリック後、ページは移行するが(4)のボタンが押せません。 しかし(3)のページを直接指定して開いた後に(4)の動作を行うときちんとボタンクリックが出来ます。 順番に(1)→(2)→(3)→(4)と処理を行うと(4)のボタンが押せないという状況です。 こんな感じで作成しました。 Dim objIE As InternetExplorer ' Set objIE = CreateObject("Internetexplorer.Application") objIE.Visible = True Dim strUrl As String strUrl = "●●●●●●?sc_i=shp_pc_top_mdItemRanking_01" objIE.navigate strUrl Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE Loop (1)の処理 Do While (True) If (TypeName(objIE.document.getElementsByClassName("●●●●")(0)) <> "Empty") Then Set tmp = objIE.document.getElementsByClassName("●●●●") flag = False For Each t In tmp If (InStr(t.getAttribute("class"), "●●●●") > 0) Then t.Click flag = True Exit For End If Next End If If (flag = True) Then Exit Do Application.Wait [Now() + "0:00:00.5"] objIE.Refresh Do Loop Until (objIE.Busy = False) And (objIE.readyState = 4) Loop (3)の画面移行 (4)の処理 Set objINPUT = objIE.document.getElementsByTagName("INPUT")  For n = 0 To objINPUT.Length - 1 If InStr(objINPUT(n).Value, "●●●●") > 0 Then objINPUT(n).Click Exit For End If Next Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE Loop Set objINPUT = Nothing 以上になります。 お手数ですが、どなたかご教示をお願いいたします。

  • エクセルVBA ブラウザのコントロールについて

    VBでIEオブジェクトを使用、yahooのとあるページを表示し、 その中の 「ダウンロード」ボタンを押すとcsvファイルをDLするプログラムを作っています。(vista、IE8) For Each objLINK In objIE.Document.Links If objLINK.InnerTEXT = "ダウンロード" Then objLINK2.Click Exit For End If Next ここで、「ファイルのダウンロード」メッセージ   開く(O) 保存(S) キャンセル が表示されるのですが、表示されたとたんにVBAから制御できなくなります。 どうすればボタンを押せるのでしょうか? なお、普通にIEオブジェクトを作ると、ダウンロードのボタンすら押せなかったので、 こちらの三流君様のページを参考にして、ユーザーフォームの中でIEオブジェクトを作っています。http://www.ken3.org/cgi-bin/group/vba_ie7.asp よろしくお願いいたします。

  • VBAによるIE操作について

    VBAでIEを操作し、PHPで開発されているMoodleというe-learningのサイトを操作しようと思っています。 概ね自分の思い通りに動くように作れたのですが、一点だけ問題が発生してしまいました。 (1)Submitのボタンを押して、(2)ページを読み込み待ち、(3)次のページのSubmitのボタンを押すという処理がうまく行きません。 エラーが出るのが、(3)のボタンを押したつもりになって、次の作業に行ってしまっていました。 (2)のページの読み込み待ちがうまく行かず、(3)のボタンを押したつもりになってしまい、次の作業でエラーを起こす、そんな次第です。 (2)のページの読み込みは下記の様に組んでます。 (4)の様に組んでも結果は一緒でした。 あとページが変わるまで、ボタンを押し続ける様に組むと、サーバーが落ちました。(ボタンが無くても押していることができるということだったので、試してみました。コードは残していなかった。) ちなみにボタンを押すコードは(5)です。 PHPの読み込みを待っていないとかそんな原因ではないかと思うのですが、解決できないでしょうか。 (2) Function IEwait(ByRef objIE As Object) Do While objIE.readystate <> 4 DoEvents Loop End Function (4) Do Until objIE.Busy = False WScript.sleep(250) Loop' (5) Public Function IEButtonClick(ByRef objIE As Object, buttonValue As String) Dim objInput As Object For Each objInput In objIE.document.getElementsByTagName("INPUT") If objInput.Value = buttonValue Then objInput.Click Exit Function End If Next End Function

  • 2ページ目が表示されるまで待つには?

    target="_blank" で開かれるリンクで、開いた先が完全に表示されるまで待つにはどうすればよいでしょう? 例えば ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Sub Sample() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "http://www.tagindex.com/html_tag/link/a_target.html" 'これは1ページ目を表示させるまで待つ Do Until objIE.Busy = False And objIE.readyState = 4: Loop For i = 0 To objIE.document.Links.Length - 1 If objIE.document.Links(i).innerText = "新しいウィンドウで表示します" Then objIE.document.Links(i).Click 'ここで2ページ目を表示させるまで待つには? Exit For End If Next Set objIE = Nothing End Sub ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ という状態で、 objIE.document.Links(i).Clickを実行した後の表示を待つにはどうすればいいでしょう? (http://www.tagindex.com/html_tag/link/target_example.htmlのページです) objIEの値は、"http://www.tagindex.com/html_tag/link/a_target.html"のままなので、 新しくobjIEを作ればいいのでしょうか? ご回答よろしくお願いします。

  • VBA IE操作 スクレイピング

    VBA IE操作について こんばんわ。いつもお世話になっております。 初心者の質問ですが、先生方のご意見ご指導宜しくお願いいたします。 OS : windows7 , EXCEL2007 -------------------------------------------------------------- プロ野球のサイトにアクセスし、(セントラル・リーグ)の球団に在籍する選手 の画像を自動で取得するコードを作りたいと思っています。 (1) 2012年度 選手一覧 → http://bis.npb.or.jp/players/ を開く (2) 球団名のリンクをクリックして球団ページへ移動する (3) 球団ページ内の選手名のリンクをクリックして選手ページへ移動する (4) 選手紹介欄の画像を取得する 上記のような行程なのですが、(2)の球団数も6球団あります。 (4)の選手数にしても何十人もいますので、for ~ next でループさせたいと思っています。 このような場合IEで処理することは可能なのでしょうか? 参考サイトなどから沢山のお知恵をいただき、下記のようなコードを試してみたのですが、 エラーとなり、うまくいきませんでした。 sheet1       A 1 2 3  中日ドラゴンズ 4  東京ヤクルトスワローズ 5  読売ジャイアンツ 6  阪神タイガース 7  広島東洋カープ 8  広島東洋カープ 9  横浜DeNAベイスターズ Sub Test () Sub Graph_Down2() Dim nmbr As Integer nmbr = Range("A3").End(xlDown).Row - 2 Set objIE = CreateObject("InternetExplorer.Application") 'IEを開く objIE.Visible = True objIE.Navigate "http://bis.npb.or.jp/players/" Do While objIE.ReadyState <> 4 'サイトが開くまで待機 Do While objIE.Busy = True Loop Loop For i = 0 To nmbr '表示されているサイトのアンカータグ一つずつを変数objにセット For Each obj In objIE.Document.getElementsByTagName("a") 'Obj.innerTextと全機種名が一致すれば If Trim(Range("A" & i + 3).Value) = Trim(obj.innerText) Then '該当するタグをクリック obj.Click 'ページジャンプ '// '移動したページの画像を取得する処理コードを書く '// objIE.GoBack '前のページへ戻る   '* ここでエラーになります Exit For End If Next Next i ' Set Obj = Nothing ' objIE.Quit ' Set objIE = Nothing End Sub 上記コードですが、 IEで2012年度 選手一覧を開く → A3の球団名と一致したリンクをクリック →  中日ドラゴンズのページに移動 まではできています。 この先の処理についてご指導いただければと思います。 基礎ができていないど素人のため拙い説明ですが、 お分かりの方いましたら是非ご指導願います。 宜しくお願いいたします!

  • 三菱東京UFJ銀行に自動ログインしたいのですが

    どうもうまくできません。 ログインボタンが押せません。 Sub tset() Dim objIE As Object Dim i As Long Set objIE = CreateObject("InternetExplorer.Application") objIE.navigate "https://entry11.bk.mufg.jp/ibg/dfw/APLIN/loginib/login?_TRANID=AA000_001" objIE.Visible = True Do While objIE.Busy = True DoEvents Loop With objIE.document .all("KEIYAKU_NO").Value = "test" .all("PASSWORD").Value = "PASSWORD" End With For i = 0 To objIE.document.Links.Length - 1 If objIE.document.Links(i).innerHTML Like "*alt=ログイン*" Then objIE.document.Links(i).Click Exit For End If Next i For i = 0 To objIE.document.Links.Length - 1 If objIE.document.Links(i).innerText = "ログイン" Then objIE.document.Links(i).Click Exit For End If Next i End Sub でも、押せないのですが、ご教授いただけませんか? よろしくお願いします。

専門家に質問してみよう