• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:実行時エラーが表示されます。)

VBA初心者のための実行時エラー修正と要約文作成

このQ&Aのポイント
  • VBA初心者の方が実行時エラーに遭遇し、エラーメッセージ「実行時エラー91 - オブジェクト変数またはWithブロック変数が設定されていません」と表示されました。
  • 質問者はコード内の「If obj.Document」の部分に問題があると感じています。
  • また、このコードは不安定で、一部では正常に実行される場合もありますが、途中でエラーが発生することもあります。修正方法を教えていただけると助かります。

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

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

最下のVBAコードでは 「VBAのIE制御入門」http://www.vba-ie.net/ よりIE制御に関するサブルーチンプログラムを引用しています。 IEの読み込み待機を行うことで安定して動作するかと思います。 また駐車場の台数は不要ですか?改行コードによりセル出力時に行がずれてしまっていたため、下記のコードでは住所部分のみ取得しています。 testプロシージャにより、テストプロシージャを10回連続動作するようにしているため 最大行+1のA~C列へ書出すように出力部のコードを書き換えています。 あまり多くてもサーバーに不可をかけるだけなので動作確認程度に10回で行いましたが、問題なく動作しているようです。 ■VBAコード '▼VBAのIE制御入門のサブルーチン引用▼ #If VBA7 Then     Private Declare Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) #Else     Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) #End If 'http://www.vba-ie.net/ie/navigate2.html#a3 Sub ieView(objIE As Object, _         urlName As String, _         Optional viewFlg As Boolean = True) 'IE(InternetExplorer)のオブジェクトを作成する     Set objIE = CreateObject("InternetExplorer.Application")     'IE(InternetExplorer)を表示・非表示     objIE.Visible = viewFlg     '指定したURLのページを表示する     objIE.Navigate urlName     'IEが完全表示されるまで待機     Call ieCheck(objIE) End Sub Sub ieCheck(objIE As Object) Dim timeOut As Date     '完全にページが表示されるまで待機する     timeOut = Now + TimeSerial(0, 0, 20)     Do While objIE.Busy = True Or objIE.ReadyState <> 4         DoEvents         Sleep 1         If Now > timeOut Then             objIE.Refresh             timeOut = Now + TimeSerial(0, 0, 20)         End If     Loop     timeOut = Now + TimeSerial(0, 0, 20)     Do While objIE.document.ReadyState <> "complete"         DoEvents         Sleep 1         If Now > timeOut Then             objIE.Refresh             timeOut = Now + TimeSerial(0, 0, 20)         End If     Loop End Sub '▲ここまで▲ Sub test()   Dim i As Integer     For i = 1 To 10         Call テスト     Next i End Sub Sub テスト() Dim obj As Object     Call ieView(obj, "http://map.japanpost.jp/pc/syousai.php?id=300197019000")     Do While obj.Busy     Loop     obj.Visible = True     For i = 0 To obj.document.All.tags("div").Length - 1         If obj.document.All.tags("div")(i).classname = "str_title_hira" Then             s = obj.document.All.tags("div")(i).InnerText             Worksheets("Sheet1").Cells(Cells(Rows.Count, "A").End(xlUp).Row + 1, "A") = s         End If     Next     For i = 0 To obj.document.All.tags("div").Length - 1         If obj.document.All.tags("div")(i).classname = "str_title_kana" Then             s = obj.document.All.tags("div")(i).InnerText             Worksheets("Sheet1").Cells(Cells(Rows.Count, "B").End(xlUp).Row + 1, "B") = s         End If     Next     For i = 0 To 1         If obj.document.All.tags("p")(i).classname = "unit" Then             s = obj.document.All.tags("p")(i).InnerText             Worksheets("Sheet1").Cells(Cells(Rows.Count, "C").End(xlUp).Row + 1, "C") = Replace(s, vbCrLf, " ")         End If     Next     obj.Quit End Sub