• ベストアンサー
※ 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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

    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

  • 実行時エラー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 というコードなのですが、どこかおかしいですか?

  • 同じ i 番目のclassを連動させることはできますか?

    お世話になります <script type="text/javascript"><!-- window.onload = function() { document.getElementsByClassName = function (className) { var i, j, eltClass; var objAll = document.getElementsByTagName ? document.getElementsByTagName("*") : document.all; var objCN = new Array(); for (i = 0; i < objAll.length; i++) { eltClass = objAll[i].className.split(/\s+/); for (j = 0; j < eltClass.length; j++) { if (eltClass[j] == className) { objCN.push(objAll[i]); break; } } } return objCN; } obj0 = document.getElementsByClassName("id"); obj1 = document.getElementsByClassName("pass"); for(i=0;i<obj0.length;i++) { obj0[i].onclick = function() { obj1[i].style.display = "block"; } } } //--></script> <style type="text/css"><!-- .id { width:150px; float:left; cursor:pointer; } .pass { display:none; } .pass0 { width:100px; } --></style> <div class="id">名前1</div> <div class="pass"> <input type="password" name="password" class="pass0"> <input type="button" name="login" value="LOG IN" class="login"> </div> <div class="id">名前1</div> <div class="pass"> <input type="password" name="password" class="pass"> <input type="button" name="login" value="LOG IN" class="login"> </div> のような感じでclass("id")[0]をクリックしたらclass("pass")[0]を表示、class("id")[1]をクリックしたらclass("pass")[1]を表示・・・というふうにしたいのですがなかなかうまくいきません>< 名前とパス両方を入力にしてやる方法もできますし、 それぞれのclass("id")にfunction()を振って obj0[0].onclick = function() { obj1[0].style.display = "block"; } obj0[1].onclick = function() { obj1[1].style.display = "block"; } のようなやり方もできるのはできます 後者のやり方は他の部分でもいろいろ使っているので記事やメンバーが増えるたびに新たに追加していかないといけないので***.onclick = function() { } を配列にするなどまとめてできる方法があれば教えていただきたいのですが^^;

  • 下記のスクリプトを高速にする具体的な方法

    下記のスクリプトを高速にする具体的な方法 現在、特定のクラスを表示、非表示にしたいと 考えております。 下記のスクリプトだとIEでの動作が遅いので改善方法を模索しております。 どなたかご教授ください。 宜しくお願いいたします。 <script type="text/javascript"> var ids = new Array(); ids = ['default','aaa','bbb']; function change(site){ if(!document.getElementsByTagName){return;} var objs = document.getElementsByTagName('*'); var check = ids.join('|'); var re = new RegExp('(?:^|\\s)'+site+'(?:$|\\s)'); for(var i=0; i<objs.length; i++){ var obj = objs.item(i); if(re.test(obj.className)){ obj.style.display = ''; }else{ if(obj.className){ if(obj.className.match(check)){ obj.style.display = 'none'; }else{ obj.style.display = ''; } } } } } </script> <html> <select name="site_change" id="site_change" onchange="change(this.value)"> <option value="default">デフォルト</option> <option value="aaa">aaa</option> <option value="bbb">bbb</option> </select> <div class="aaa bbb">aaa bbb</div> <div class="aaa">aaa</div> </html>

  • VBA 実行時エラー1004 rangeメソッドは

    始めまして、VBA初心者です。 現在VBAプログラムを使って、サイトに自動ログイン出来るようにコードを作成しているのですが、『実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクト』とメッセージが出て、実行できません。 デバックをすると以下の11行目で黄色のバーが出ていました。いろいろと調べてみましたが、原因がわからずに止まってしまいました。 どなかた分かる方がいらっしゃいましたら教えて頂けますようにお願い致します。 コードは下記です。 Sub 無料スペースログイン() Set ObjIE = CreateObject("InternetExplorer.Application") ObjIE.Visible = True ObjIE.Navigate "http://mnnf.jp/signup/" Do While ObjIE.ReadyState <> 4 Do While ObjIE.Busy = True Loop Loop For Each Obj In ObjIE.Document.getElementsByTagName("input") If Obj.Name = "mail" Then ObjIE.Document.getElementsByName("mail")(0).Value = Range("A1").Value Else If Obj.Name = "password" Then ObjIE.Document.getElementsByName("password")(0).Value = Range("B1").Value Else Exit For If Obj.alt = "新規無料登録" Then Obj.Click Exit For End If End If End If Next End Sub

  • オブジェクトがありませんのエラー

    過去ログを呼んで近いのがあったのでよく読んだのですが よくわかりませんので書き込みします。 以下のスクリプトで「オブジェクトがありませんのエラーが発生します。3行目のfor文の「obj.childNodes」でエラーが発生します。 「document.getElementById」が「null」であるのが原因のようですが、なぜ「document.getElementById」に値が入らないのかがつかめません。 お手数ですがよろしくお願いします 【script】 --------------------------------------------- if(document.getElementById && document.all && !navigator.userAgent.match(/Opera/)){ var obj = document.getElementById("mainmenu"); for(var i=0;i<obj.childNodes.length;i++){ if(obj.childNodes[i].className=="pullmenu"){ obj.childNodes[i].onmouseover = function(){pull(this) }; obj.childNodes[i].onmouseout = function(){pull(this) }; } } } --------------------------------------------- 【html】 --------------------------------------------- <ul id="mainmenu"> <li id="Begginer" class="pullmenu"><a href="http://www.○○○.co.jp/b/w.php">○○○</a> <ul> <li><a href="http://www.○○○.co.jp/b/w.php">○○○ </a></li> <li><a href="http://www.○○○.co.jp/b/s.php">○○○ </a></li> <li><a href="http://www.○○○.co.jp/b/m.php">○○○ </a></li> </ul> </li> </ul>

  • 三菱東京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 でも、押せないのですが、ご教授いただけませんか? よろしくお願いします。

  • javascriptをCSSに書き込むと動作しません。何故ですか?

    下記のjavascriptをCSSに書き込みました。拡張子は.jsとしました。 jsのフォルダにtopmuv.jsというファイル名にしました。 <script type="text/javascript"> <!-- function blink() { if (!document.all) { return; } for (i = 0; i < document.all.length; i++) { obj = document.all(i); if (obj.className == "blink") { if (obj.style.visibility == "visible") { obj.style.visibility = "hidden"; } else { obj.style.visibility = "visible"; } } } setTimeout("blink()", 500); } // --> </script> </head> <body onload="blink()"> htmlの読み込みは <LINK rel="stylesheet" href="js/topmuv.js" type="text/javascript"> と書いています。 この場合、上記javascriptのソースをシート上にダイレクトに書き込むと正常に動作しますがcssにすると動作しません。 何が悪いのでしょうか? 詳しい方宜しくお願いします。

  • 折りたたみメニューについて

    現在あるサイトを作成中で、メニューに折りたたみ式のものを使っています。いろいろなサイトや書籍を参考に、メニューそのものはきちんと動いているのですが、メニューをクリックするたびに展開したサブメニューがまた閉じてしまい、ページ移動するたびにメニューを展開させるのは使い勝手が悪いなと感じております。 たとえばAというメニューを展開し、AAAというページへ移動した場合、展開されたAは展開したままにしたいのですが… なにかヒントでもつかめないかと検索を続けてみましたが、どうしても分からず困っています。 ソースを記述しますので、こう修正すればできるんじゃない?とか、こっちのソースを使ったらできるよ、とかありましたら教えていただけませんでしょうか? よろしくお願いします。 [Javascript] function oritatami(id,id2){ obj=(document.all)?document.all(id):((document.getElementById)?document.getElementById(id):null); if(obj) obj.style.display=(obj.style.display=="none")?"block":"none"; if(document.all){ with(document.all(id2)){innerText=(innerText=="▽")?"△":"▽";} } else if(document.getElementById){ with(document.getElementById(id2)){firstChild.nodeValue=(firstChild.nodeValue=="▽")?"△":"▽";} } } [HTML] <a href="URL" onclick="oritatami('mw00','+0');return false"><span id="+0">▽</span> メニュー1</a><br> <div class="d2" id="mw00" style="display:none;"> ┣メニュー2(メニュー1から展開)<br> ┃┣ 001<br> ┃┣ 004 - 007<br></div> </div>

  • javascriptにフェードインを追加したい。

    下記のjavascriptに、フェードイン効果を追加するにはどうすればいいでしょうか? 現在は、クリックで、テキストが切り替わる仕様になっているんですが、これにフェードイン、フェードアウトの機能を付け加えたいです。 また、切り替わった際に下記のようにCSSの.actveをclass=""に追加させたいのですが、 どうすれば可能でしょうか? 目的は、アクティブになったボタンの背景を変更したい為です。 <div class="button actve"><a href="#" onclick="checkd1();return ChDsp2('text1','textALL');">ボタン1</a></div> 【javascript】 function ChDsp2(strShow,classHidden){ var tags=document.getElementsByTagName("div"); for(var i=0;i<tags.length;i++){ if(tags[i].className.match('textALL')){ tags[i].className=tags[i].className.replace(/hide/,"").replace(/^\s+|\s+$/,""); if(tags[i]!=document.getElementById(strShow)) tags[i].className+=' hide'; } } return false; } function checkd1(){ document.FORM.CHECK1.checked=true document.FORM.CHECK2.checked=false document.FORM.CHECK3.checked=false } function checkd2(){ document.FORM.CHECK1.checked=false document.FORM.CHECK2.checked=true document.FORM.CHECK3.checked=false } function checkd3(){ document.FORM.CHECK1.checked=false document.FORM.CHECK2.checked=false document.FORM.CHECK3.checked=true } function change(c) { var f = c.checked, btn = c.form.elements['btn1']; btn.disabled = f?false:true; f = f?'sozai/button_2.jpg':'sozai/button_1.jpg'; btn.style.backgroundImage = 'url(' + f + ')'; } 【HTML】 <div class="button"><a href="#" onclick="checkd1();return ChDsp2('text1','textALL');">ボタン1</a></div> <div class="button"><a href="#" onclick="checkd2();return ChDsp2('text2','textALL');">ボタン2</a></div> <div class="button"><a href="#" onclick="checkd3();return ChDsp2('text3','textALL');">ボタン3</a></div> <div class="clear">&nbsp;</div> <div class="area"> <form name="FORM"> <div id="text1" class="textALL"> その1、ここは最初に表示されています。 </div> <div id="text2" class="textALL hide"> その2、ここはボタン2をクリックで表示されます。 </div> <div id="text3" class="textALL hide"> その2、ここはボタン3をクリックで表示されます。 </div> </form> </div> 上記は、以前頂いたプログラムをわかる範囲で改造したものなのですが、 限界を感じまして、どなたか教えて頂けたら助かります。 宜しくお願いします。