ExcelVBAでWebデータ取得時のエラー処理方法

このQ&Aのポイント
  • ExcelVBAを使用してWebのデータを取得しようとしていますが、エラーメッセージが表示されることがあります。同じ処理を繰り返すことでエラーが解消される場合もありますが、連続してエラーが出た場合に途中で処理を停止させる方法を知りたいです。
  • ExcelVBAのクリックイベントでWebのデータを取得する処理を実装していますが、エラーが発生することがあります。一度エラーが出た場合は再度同じ処理を行い、2回目もエラーが出る場合はエラーメッセージを表示させたいです。しかし、2回連続でエラーが発生した場合は処理を途中で停止させたいです。
  • ExcelVBAを使用してWebのデータを取得する際にエラーが発生した場合、同じ処理を繰り返すことでエラーが解消される可能性があります。しかし、2回連続でエラーが出た場合は処理を途中で停止させたいです。連続したエラー時の処理方法について教えてください。
回答を見る
  • ベストアンサー

ExcelVBAについて質問です。

ExcelVBAについて質問です。 Webのデータを取得したいのですがたまにエラーがでます。 そこで1回エラーが出たら再度同じ処理をして、2回目もエラーが出たら エラーメッセージを表示させたいです。 しかし1回目エラーで2回目取得できたらうまくいくのですが 2回連続でエラーになったら途中で止まってしまいます。 2回連続でエラーになった時の処理方法を教えてください。 Public Sub クリック_Click()  On Error GoTo Err1  Dim エラー As Integer For エラー = 0 To 1  'HTML読み込み   Dim fff As String 'ファイルパス   Dim objIE As Object 'オブジェクト   Dim Myhtml As Variant 'HTMLタグデータ  '制御htmlファイル   phn = ThisWorkbook.Path   fff = "URL"  'Webページ表示   Set objIE = CreateObject("InternetExplorer.Application")   objIE.Navigate fff  '画面表示待ち   Do While objIE.Busy = True    DoEvents   Loop  Myhtml = objIE.Document.Body.innerHTML  objIE.Quit  Sheets("シート").Range("A1").Value = Myhtml Exit Sub Err1:  Next エラー  MsgBox "エラー発生" End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1

一度エラーになったら、そのまま処理を続けることはできません。 必ず Resume 命令で エラーを解除する必要があります。  :  :  Sheets("シート").Range("A1").Value = Myhtml Modori:  Next エラー Exit Sub Err1:  If エラー = 0 Then Resume Modori  MsgBox "エラー発生" End Sub

excel1122
質問者

お礼

どうもありがとうございました。 おかげさまでうまくいきました。 大変感謝してます。m(__)m

その他の回答 (1)

回答No.2

接続部分はFunctionにしたらいかがですか? Public Sub クリック_Click()  dim i as integer  for i = 0 to 1   if i = 0 then    ' 成功したら処理を抜ける    if prfReadHtml() = true then exit for   else    if prfReadHtml() = false then     ' ここでエラーメッセージを表示    end if   end if  next end sub private function prfReadHtml() as boolean  ' ここに読み込み処理を記入、成功したらtrue、失敗したらfalseを返す end function

excel1122
質問者

お礼

どうもありがとうございます。 いろいろ参考になりました。m(__)m

関連するQ&A

  • IEの操作(Busy)でエラーになる

    下記コードを実行するとBusyの所でエラーになってしまいます。 何が悪いのでしょうか?教えて下さい。 Excel2000で起動しました。 Sub tst031() Dim fff As String 'ファイルパス Dim objIE As Object 'オブジェクト Dim Myhtml As Variant 'HTMLタグデータ Dim objTAG As Object '制御htmlファイル fff = "http://oshiete.goo.ne.jp/" 'Webページ表示 Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate fff '画面表示待ち Do While objIE.Busy = True DoEvents Loop For Each objTAG In objIE.document.body.all Debug.Print objTAG.tagName Next objIE.Quit 'MsgBox Myhtml End Sub

  • これは何がおかしいですか?

    こんばんは。 会社のWEBアプリを開くコードなのですがエラーになります。 Dim objIE As Object Sub webアプリ() Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://○○.aspx" Call IE_wait End Sub Sub IE_wait() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.ReadyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub こうすると、 Do Until objIE.ReadyState = READYSTATE_COMPLETE の部分で、 --------------------------- 実行時エラー-2147417848 もしくは 実行時エラー-2147023179 オートメーションエラーです。 そのインターフェイスは認識されません。 --------------------------- になります。 最初に実行時エラー-2147417848になり、デバッグボタンを押すと 実行時エラー-2147023179に変化します。 Dim objIE As Object を Dim objIE As InternetExplorer にしてもエラーが発生します。 しかし、 objIE.Navigate "https://○○.aspx" を objIE.Navigate http://www.goo.ne.jp/ にすると、エラーは発生しません。 https://○○.aspxは存在するアドレスです。 問題なく表示はされています。 表示するまで待たせて次のコードを書きたいので、表示するまで待つ処理をしたいです。 ご教授よろしくお願いします。

  • VBAでWebに値を入力

    VBAでWebに値を入力する操作を考えています。 エクセルシートのA1に入っている値をWeb上に入力する操作なのですが、 以下のコードを実行すると「AllLog.keyword.Value = t」の部分でエラーになります。 googleではkeywordのところを「q」、yahooではkeywordのところを「p」にすれば問題ないのですが、 神奈川中央交通のページではエラーになってしまいます。 なぜですか?? Sub google() Dim objIE As InternetExplorer '参照設定:Microsoft Shell Controls and Automation Dim objShell As Shell Dim WinFlg As Boolean Dim objWin As Object Dim AllLog As Object On Error GoTo EndProcess Set objShell = New Shell For Each objWin In objShell.Windows If TypeName(objWin) = "IWebBrowser2" Then WinFlg = True Set objIE = objWin Exit For End If Next Set objShell = Nothing If WinFlg = False Then MsgBox "IEオブジェクトが取得できません", vbCritical Exit Sub End If EndProcess: If Err() > 0 Then MsgBox Err.Description End If With objIE Set AllLog = .Document.all t = Cells(1, 1) AllLog.keyword.Value = t End With Set objIE = Nothing End Sub

  • 【アクセス】リンク切れかどうかをVBAで取得したい

    テーブル1のフィールド1をハイパーリンク型にし、 アドレスを「http://www.yahoo.co.jp/」と入力し、保存しました。 そのレコードをクリックすると、ヤフーのHPが開きます。 しかし、アドレスを「//www.yahoo.co.jp/」とした場合、 もちろんURLは開けません。 エラーメッセージが出たあとに 『「//www.yahoo.co.jp/」を開くことができません。 指定されたファイルを開くことができません。』 と再度エラーメッセージが表示されます。 このエラーが表示されるかどうかの結果をvbaで取得するのは可能でしょうか? わざとエラーを発生させるために Sub test() Dim ObjIE As Object Dim URL As String Set ObjIE = CreateObject("InternetExplorer.Application") URL = "http://www.co.jp/"’←ここの部分はあとでレコードの情報を読み取るコードを考えます。 ObjIE.Navigate (URL) ObjIE.Visible = True Set ObjIE = Nothing End Sub としてみましたが IEが開き、「Inernet Explorer ではこのページは表示できません」 となりますが、、エラーページかどうかの情報はvbaでは取得できません。 この場合、どうすればいいのでしょうか? ご教授よろしくお願い致します。

  • webページのみのURLを取得したい

    Sub testa() Dim objIE Dim myStr Set objRE = CreateObject("VBScript.RegExp") For Each objIE In CreateObject("Shell.Application").Windows myStr = myStr & vbCrLf & objIE.LocationURL Next MsgBox myStr End Sub を実行するとフォルダのパスまで取得されてしまいますが WEBページのみ取得するにはどうすればいいですか? 正規表現で”「HTML」で終わる”と言う条件を付けくわえようとしましたが htmlで終わらないサイトもあるのでダメでした。

  • InternetExplorer.Applicat

    Sub test1() Dim objIE As Object Dim i As Long Dim MyRow As Long Dim Str As String Dim tmp As Variant Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://oshiete.goo.ne.jp/" objIE.Visible = True Do While objIE.Busy = True DoEvents Loop Str = objIE.Document.Body.innerHTML 'ソースを抜き出す tmp = Split(Str, Chr(10)) '配列に格納する MyRow = 1 '初期値 For i = LBound(tmp) To UBound(tmp) Cells(MyRow, 1) = tmp(i) MyRow = MyRow + 1 Next i objIE.Quit Set objIE = Nothing End Sub ************************************************** Sub test2() Dim objIE As Object Dim Str As String Dim tmp As Variant Dim i As Long Dim MyRow As Long Set objIE = CreateObject("MSXML2.XMLHTTP") objIE.Open "GET", "http://oshiete.goo.ne.jp/", False objIE.Send Str = objIE.responseText 'ソースを抜き出す tmp = Split(Str, Chr(10)) '配列に格納する MyRow = 1 '初期値 For i = LBound(tmp) To UBound(tmp) Cells(MyRow, 1) = tmp(i) MyRow = MyRow + 1 Next i Set objIE = Nothing End Sub ************************************************** 上記の二つのコードは どちらもVBAでHTMLソースをエクセルに書き出すコードなのですが 結果が違います。 なぜなのでしょうか? 実際のソースを確認したら CreateObject("MSXML2.XMLHTTP") の方が正しかったです。 CreateObject("InternetExplorer.Application") は何が取得されてるのでしょうか?

  • 二つのエラーを発生させたい

    ひとつのプロシージャー内で、 二つのエラートラップを仕掛ける事は出来ないのでしょうか? Sub エラーが発生した時にエラーが発生したら() Dim i As Long On Error GoTo Err1 i = "a" Exit Sub Err1: MsgBox "Err1のエラー: " & Err.Description On Error GoTo Err2 i = "b" Exit Sub Err2: MsgBox "Err2のエラー: " & Err.Description End Sub を行うと、 i = "b" で2回目のエラーが発生した時は、 実行時エラーになってしまいます。 i = "b" で2回目のエラーが発生した時に、 「Err2のエラー: 型が一致しません。」 と表示させるにはどうすればいいでしょう? Sub エラーが発生した時にエラーが発生したら() Dim i As Long On Error GoTo Err1 On Error GoTo Err2 i = "a" Exit Sub Err1: MsgBox "Err1のエラー: " & Err.Description i = "b" Exit Sub Err2: MsgBox "Err2のエラー: " & Err.Description End Sub にすると、 i = "a" のエラーで、 「Err2のエラー: 型が一致しません。」 へ移動してしまいます。

  • 「ページが表示されました」まで取得したい

    IEを立ち上げてステータスバーのテキストを取得して、 「ページが表示されました」を取得出来たら、次のコードへ進みたいのですが、 下のコードでStatusTexttを書き出しても「ページが表示されました」まで取得できません。 Sub test() Dim objIE As InternetExplorer Dim i As Long Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://www.goo.ne.jp/" objIE.Visible = True Workbooks.Add Cells(1, 1) = objIE.StatusText i = 2 Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Cells(i, 1) = objIE.StatusText i = i + 1 Loop Cells(i, 1) = objIE.StatusText Set objIE = Nothing End Sub Do While objIE.Busy = True Or objIE.ReadyState <> 4 ここら辺のコードを弄ればいいような気がしますが、うまくいきません。 ご回答よろしくお願いします。

  • MSXML2で、サイトのタイトルを取得したい

    アクセスvbaです。 InternetExplorerの方法だと、 **************************************************** Sub Sample1() Dim ObjIE As InternetExplorer Set ObjIE = CreateObject("InternetExplorer.Application") ObjIE.Navigate "http://www.yahoo.co.jp/" ObjIE.Visible = True Do While ObjIE.Busy = True DoEvents Loop Do While ObjIE.Document.ReadyState <> "complete" DoEvents Loop Debug.Print ObjIE.Document.Title Debug.Print ObjIE.LocationName ' 同じ ObjIE.Quit Set ObjIE = Nothing End Sub **************************************************** で、該当のサイトのタイトルを取得できるのですが、 これではなく、 **************************************************** Sub Sample2() Dim objMSXML2 As Object Dim myObj As Object Dim myAll As Variant Set objMSXML2 = CreateObject("MSXML2.XMLHTTP") objMSXML2.Open "GET", "http://www.yahoo.co.jp/", False objMSXML2.Send myAll = objMSXML2.responseText 'ソースを抜き出す ’タイトル取得 Set objMSXML2 = Nothing End Sub **************************************************** の方法で、サイトのタイトルを取得したいのですが、 可能でしょうか? コードをご教授ください。よろしくお願いします。

  • NewはCreateObjectと同じ意味?

    Sub test01() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True End Sub Sub test02() Dim objIE As New InternetExplorer objIE.Visible = True End Sub この二つのコードを比較した場合、 Dim objIE As New InternetExplorer で宣言すれば、 Set objIE = CreateObject("InternetExplorer.application") がなくても、 objIE.Visible = True をしてみるとブラウザが立ち上がっているのですが、 これは NewはCreateObjectと同じ意味という事でしょうか?

専門家に質問してみよう