実行時エラー92 forループが初期化されていませ
- エクセル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 というコードなのですが、どこかおかしいですか?
- kgkpwuioekxn
- お礼率78% (54/69)
- Excel(エクセル)
- 回答数2
- ありがとう数3
- みんなの回答 (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 = ""の場合は、マクロが終了しています。 そうでない場合は、なにも処理がされていません。 何がしたいのか判らないマクロです。 やりたいことを整理しなおして、新しい質問として投稿したほうがいいのでは?
その他の回答 (1)
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
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 されないケースもありますので、注意して扱ってください。 以上です。
お礼
ご回答ありがとうございます。
関連する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 をやる方法を教えてください。
- ベストアンサー
- Excel(エクセル)
- 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 = "検索文字" これが間違ってる気がするのですが どのように修正すればよいでしょうか?
- ベストアンサー
- Visual Basic
- 実行時エラーが表示されます。
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
- ベストアンサー
- Visual Basic
- 実行時エラーが表示されます。
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
- ベストアンサー
- Visual Basic
- 複数の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文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 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回しかないようです。 うーん、うまくできません。 ご教授よろしくお願いします。
- ベストアンサー
- Visual Basic
- マクロエラー 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
- 締切済み
- Visual Basic
お礼
ご回答ありがとうございます。