実行時エラー92 forループが初期化されていませ

このQ&Aのポイント
  • エクセルVBAでFor Eachを使ってるのですが、Nextの部分で実行時エラー92 forループが初期化されていません。というエラーになります。
  • コードの中で、myObjというオブジェクトをFor Eachで処理していますが、Nextの部分でエラーが発生しています。
  • エラーメッセージから判断すると、初期化されていないForループのためにエラーが発生している可能性があります。
回答を見る
  • ベストアンサー

実行時エラー92 forループが初期化されていませ

エクセルVBAでFor Eachを使ってるのですが、 Nextの部分で 実行時エラー92 forループが初期化されていません。 というエラーになります。 On Error GoTo ERR1 For Each myObj In objIE.Document.all.tags("ul") If myObj.className = "" Then '○○の場合 Exit Sub ERR1: If Err.Number = 424 Then On Error GoTo 0 'エラーを解除 '▲▲の場合 If strカテゴリ Like "" Then Exit Sub End If End If End If Next というコードなのですが、どこかおかしいですか?

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

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

まず、On Error GoTo ERR1の飛び先が間違いです。 If文の中に飛び込んでます。 これは、出来ません。独立したルーチンとして書いてください。 通常は Sub MACRO1() On Error Goto ERR1 処理 Exit Sub ERR1: エラー処理 Resume Next End Sub というような書き方になります。 次に myObj.className = "" のIf文内でExit Subで終了してるため、 ▲▲の場合以降の文は無効です。 最後にstrカテゴリ Like "" ですが、なんで演算子がLikeなのですか? Likeはワイルドカードや文字リストを使った比較演算子です。 https://msdn.microsoft.com/ja-jp/library/swf8kaxw.aspx ""との比較なら=でいいのでは? 結果としてmyObj.className = ""の場合は、マクロが終了しています。 そうでない場合は、なにも処理がされていません。 何がしたいのか判らないマクロです。 やりたいことを整理しなおして、新しい質問として投稿したほうがいいのでは?

kgkpwuioekxn
質問者

お礼

ご回答ありがとうございます。

その他の回答 (1)

回答No.1

For Each ループでの処理がExit Subに掛かることなく 最後までループを実行し終えた場合は、 ご提示の記述では、必ず、 On Error GoTo ERR1 が有効な状態のままですから、 ご提示のループを抜けた後、 つまりNext以降の記述でエラーがあれば、 For Each ループを初期化していない(既に解放された)状態で、 ERR1: にジャンプしますから、 '実行時エラー92'になります。 現状を活かすなら、 Next に続けて、 On Error GoTo 0 を追記するような対処になります。 また、 On Error GoTo ERR1 の位置を検討の上、   For Each obl In coll     On Error GoTo line_     ' ' 処理 line_:     On Error GoTo 0   Next などのように書くこともできます。 但し、 On Error GoTo errHandle は、 errHandle: 以下の記述でエラーに対応した処理が済んだ後に Resume や Resume Next のように 本来は、ラインを戻すことで同時にエラーをクリアさせるように扱うものです。 On Error GoTo 0 との組み合わせでは、 正しく、 Err.Clear されないケースもありますので、注意して扱ってください。 以上です。

kgkpwuioekxn
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • objIE.Navigate2 "http://.

    win8.1 エクセル2010です。 1ページ目でyahooのソースをチェックし、 2ページ目でグーグルのソースをチェックするにはどうすればいいでしょうか? **************************************************************** Option Explicit Dim objIE As InternetExplorer Sub test() Dim myObj As Object Set objIE = CreateObject("InternetExplorer.Application") With objIE .Visible = True .navigate "http://www.htmllint.net/html-lint/htmllint.html" End With Call wait For Each myObj In objIE.document.all.tags("input") If myObj.Name = "URL" Then myObj.Value = "http://www.yahoo.co.jp/" Exit For End If Next For Each myObj In objIE.document.all.tags("input") If myObj.alt = "CHECK" Then myObj.Click Exit For End If Next Call wait '表示が終わってないのに次のコードに進んでるっぽい objIE.Navigate2 "http://www.htmllint.net/html-lint/htmllint.html", 2048 For Each myObj In objIE.document.all.tags("input") If myObj.Name = "URL" Then myObj.Value = "https://www.google.co.jp/" Exit For End If Next For Each myObj In objIE.document.all.tags("input") If myObj.alt = "CHECK" Then myObj.Click Exit For End If Next End Sub Sub wait() Do While objIE.Busy = True DoEvents Loop Do While objIE.readyState <> 4 DoEvents Loop End Sub **************************************************************** というコードを作ったのですが、 1ページ目のタブで、ヤフーのコードをチェックし、 2ページ目のタブで http://www.htmllint.net/html-lint/htmllint.html は表示できたのですが、 2ページ目のタブのボックスに myObj.Value = "https://www.google.co.jp/" を入れることができません。 しかし 上記のコードを実行してもエラーにはなりません。 2回目の For Each myObj In objIE.document.all.tags("input")は 何をループしているのかよくわかりません。 objIE.Navigate2 "http://www.htmllint.net/html-lint/htmllint.html", 2048 で開いた二つ目のタブで For Each myObj In objIE.document.all.tags("input") If myObj.Name = "URL" Then myObj.Value = "https://www.google.co.jp/" Exit For End If Next をやる方法を教えてください。

  • GoToRecordで実行時エラー '2105'

    教えてください。Access2000です。 Private Sub 次へ_Click() On Error GoTo Err_次へ_Click On Error Resume Next DoCmd.GoToRecord , , acNext Exit_次へ_Click: Exit Sub Err_次へ_Click: MsgBox ERR.Description Resume Exit_次へ_Click End Sub って書いたのですが、最後のレコードまで行った後 「次へ」をクリックすると実行時エラーになってしまいます。 移動できませんとかメッセージで逃げたいのですがどうすればいいのでしょうか? お願いします。

  • 検索ボタン押下時に、検索ボックスに入れた値が消える

    ie操作ですが、 検索ボックスに文字を入れて、検索ボタンを押すことは出来たのですが 検索ボタン押下時に、検索ボックスに入れた値が消えてしまい、結局何も検索ボックスに入れてない状態で検索されてしまいます。 検索ボックスに値を入れても文字の色が灰色です。 手作業で検索ボックスに文字を入れると黒で表示されます。 コードはこちらです。 Sub ヒトサラ() Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://hitosara.com/" Do While objIE.Busy = True DoEvents Loop For Each myObj In objIE.Document.all.tags("input") If myObj.Name = "keyword" Then myObj.Value = "検索文字" Exit For End If Next For Each myObj In objIE.Document.all.tags("input") If myObj.alt = "検索" Then myObj.Click Exit For End If Next End Sub myObj.Value = "検索文字" これが間違ってる気がするのですが どのように修正すればよいでしょうか?

  • 実行時エラーが表示されます。

    VBA初心者です。 下記コードのエラー修正をお願いします。 実行時エラー91 オブジェクト変数またはWithブロック変数が設定されていません と出てしまいます。 デバッグではIf obj.Document の文がおかしいそうです。 またこのコードは不安定で、最後まで実行できる時もあれば、途中でエラーになるときもあるので修正頂けると嬉しいです。 よろしくお願いします。 Sub テスト() Dim obj As Object Set obj = CreateObject("InternetExplorer.Application.1") obj.Visible = True targetURL = "http://map.japanpost.jp/pc/syousai.php?id=300197019000" obj.navigate (targetURL) 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").Range("A1") = 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").Range("B1") = S End If Next For I = 0 To obj.Document.All.tags("p").Length - 1 If obj.Document.All.tags("p")(I).classname = "unit" Then S = obj.Document.All.tags("p")(I).InnerText Worksheets("Sheet1").Range("C1") = S End If Next obj.Quit End Sub Sub waitNavigation(ie As Object) Do While ie.Busy Or ie.ReadyState < 4 DoEvents Loop End Sub

  • 実行時エラーが表示されます。

    VBA初心者です。 以下のコードを打つと、実行時エラー`91'オブジェクト変数またはWithブロック変数が設定されていません。 と出てしまいます。 どこを直したら上記の表示が消えますか? Sub テスト() Set obj = CreateObject("InternetExplorer.Application.1") obj.Visible = True targetURL = "http://map.japanpost.jp/pc/syousai.php?id=300197019000" obj.navigate (targetURL) 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 Range("A1") = s End If Next For i = 0 To obj.Document.All.tags("p").Length - 1 If obj.Document.All.tags("p")(i).classname = "unit" Then s = obj.Document.All.tags("p")(i).InnerText Range("A3") = s End If Next obj.Quit End Sub

  • 複数のFOR~を抜けるには?

    sub 1() for a = 1 to 4  for b 1 to 6   call 2  next b      '111 next a endsub sub 2() --- ---- ---- on error goto herr if ----  for c = 1 to 5   if ---    ------ 'ここでエラーが起きた場合に'111まで   end if  next c else   for d =1 to 5   if ---    ------ 'ここでエラーが起きた場合に'111まで   end if  next b end if herr endsub このような場合でも'111までForを抜けることは かのうでしょうか?

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

    ひとつのプロシージャー内で、 二つのエラートラップを仕掛ける事は出来ないのでしょうか? 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のエラー: 型が一致しません。」 へ移動してしまいます。

  • VBAでエラートラップがうまくいきません。

    VBAで次のようなプロシージャを実行してみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Value = " " Then          ~コード~   END IF END SUB すると複数のセルが選択されるとエラーがでます。そこで次のようにしてみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   On Error GoTo エラー処理   If Target.Value = " " Then     On Error GoTo 0           ~コード~   END IF   EXIT SUB エラー処理:   EXIT SUB END SUB ところがこれでもやっぱりIF文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。

  • vbaでnanacoにログイン(ie操作)

    私は「緑のパスワードがなくnanacoをお持ちの方」です。 カード記載の番号にはvbaで値を入れることはできるのですが、 nanaco番号に値を入れることとログインボタンを押すことができません。 ********************************************** Sub nanaco() Dim objIE As InternetExplorer Dim myObj As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "https://www.nanaco-net.jp/pc/emServlet" Do While objIE.Busy = True DoEvents Loop Do While objIE.document.readyState <> "complete" DoEvents Loop objIE.document.all("XCID").Value = "12345" objIE.document.all("SECURITY_CD").Value = "Password" 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 ********************************************** これだとまずall("XCID").Value でエラーになります。 ソースでは、 <input name="XCID" tabIndex="1" class="txtBoxLogin" accessKey="1" type="text" maxLength="16" value=""/> となっておりますが、同じコードが二つあるからエラーになるのでしょうか? all("SECURITY_CD").Value は問題なくできます。 ソースにも、SECURITY_CDは一つしかないです。 次にログインボタンも二つあるのですが、 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 このコードを実行すると、多分上の方のログインボタンが押されてるようです。 なので、 Dim 二つ目 As Boolean For Each myObj In objIE.document.forms(0).all If TypeName(myObj) = "HTMLInputElement" Then If myObj.alt = "ログイン" Then If 二つ目 = True Then myObj.Click Exit For End If 二つ目 = True End If End If Next に変更してみたのですが、 どうやら If myObj.alt = "ログイン" Then になるのは、1回しかないようです。 うーん、うまくできません。 ご教授よろしくお願いします。

  • マクロエラー 1004 1004 アプリケーション定義またはオブジェクト定義のエラーです。

    下記のプログラムで 自分のパソコンでは正常に動くのですが 違うパソコンでは エラー1004、アプリケーション定義またはオブジェクト定義のエラーと出てしまいます。 セルの書式設定 → 表示形式  を変更するとエラーがでてしまいます。 自分のパソコンでは何をしてもエラーは出ません。 エラーの対処の仕方を調べたのですがわかりませんでした。 教えていただけるとありがたいです。 以下作ったプログラムです。 Private Sub CommandButton2_Click() Dim myShp As Shape Dim myR As Range, SR As Range On Error Resume Next Set myR = Range("G87:K96") If Err.Number <> 0 Then Exit Sub On Error GoTo 0 For Each myShp In ActiveSheet.Shapes Set SR = Range(myShp.TopLeftCell, myShp.BottomRightCell) If Not Intersect(SR, myR) Is Nothing Then myShp.Delete End If Set SR = Nothing Next Set myR = Nothing End Sub

専門家に質問してみよう