実行時エラーが表示されます。VBA初心者です。どこを直したらエラーが消えますか?

このQ&Aのポイント
  • 以下のVBAコードを使用すると実行時エラー`91'が表示されます。エラーが消えるように修正するにはどこを直せばよいでしょうか?
  • VBA初心者の方が以下のコードを使用すると実行時エラー`91'が表示されます。エラーが消えるように修正するにはどこを直せばよいでしょうか?
  • VBA初心者の方が以下のコードを使用すると実行時エラー`91'が発生します。エラーを修正するにはどの部分を修正すれば良いですか?
回答を見る
  • ベストアンサー

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

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

noname#223693
noname#223693

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

  • ベストアンサー
回答No.2

もうすぐ70歳を迎える爺ですので、書かれているコードは全く理解不能。そこで、とにもかくにもExcelにコピペして動かしてみました。すると、添付図のような結果をえました。 【修正箇所】 1、オプションで変数宣言を強要にしたこと。 2、Do-Loop に DoEvents を追加したこと。 3、For-Next のL、Mを追加。 3は特に重要な修正です。この場合のLとMはメモリではなくスタックに記憶され高速で参照される可能性があります。ForループのたんびにドキュメントのDIVクラスのテキスト長を参照するやり方よりちょっとだけエレガントかも知れません。教訓として、Option Explicitをモジュールの先頭に必ずが良いと思います。 なお、動作はしましたが内容はチンプンカンプンです。 Option Explicit Sub テスト()   Dim I As Integer   Dim L As Integer   Dim M As Integer   Dim S As String   Dim obj As Object   Dim targetURL As String      ' ----------------------------------------------   ' IEオブジェクトのセット   ' ----------------------------------------------   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     DoEvents   Loop   ' ----------------------------------------------   ' [str_title_hira]のInnerTextの取得   ' ----------------------------------------------   L = obj.Document.All.tags("div").Length - 1   For I = 0 To L     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 L   ' ----------------------------------------------   ' [unit]のInnerTextの取得   ' ----------------------------------------------   M = obj.Document.All.tags("p").Length - 1   For I = 0 To M     If obj.Document.All.tags("p")(I).classname = "unit" Then       S = obj.Document.All.tags("p")(I).InnerText       Range("A3") = S     End If   Next M   ' ----------------------------------------------   ' 終了処理   ' ----------------------------------------------   obj.Quit End Sub

その他の回答 (1)

  • chie65535
  • ベストアンサー率43% (8518/19364)
回答No.1

Dim obj as Object で、objを宣言する必要があります。 「どこに宣言を入れれば良いか?」という初心者的おバカな質問はしないように。

関連するQ&A

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

    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

  • 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にすると動作しません。 何が悪いのでしょうか? 詳しい方宜しくお願いします。

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

  • JavaScriptエラーについて

    お世話になります。 おわかりになる方、ぜひ教えてください。 タブメニューのボタンを押すと、内容が切り替わるというJavaScriptなのですが、いちよう正常に動作はしているようなのですが、エラーがでてしまいます。 エラーを無くしたいのですが、どうすればいのでしょうか? 【エラー内容】 'document.getElementById()'はNullまたはオブジェクトではありません。 【HTML】 <div id="javascript_tab_sample"> <ul> <li><a href="#W3C">W3C</a></li> <li><a href="#xhtml">xhtml</a></li> </ul> <dl id="w3c"> <p>内容1</p> </dl> <dl id="xhtml"> <p>内容2</p> </dl> </div> 【JavaScript】 window.onload=function() { tab.setup = { tabs: document.getElementById('tab').getElementsByTagName('li'), pages: [ document.getElementById('w3c'), document.getElementById('xhtml') ] } tab.init(); } /*--setup end--*/ var tab = { init: function(){ var tabs = this.setup.tabs; var pages = this.setup.pages; for(i=0; i<pages.length; i++) { if(i !== 0) pages[i].style.display = 'none'; tabs[i].onclick = function(){ tab.showpage(this); return false; }; } }, showpage: function(obj){ var tabs = this.setup.tabs; var pages = this.setup.pages; var num; for(num=0; num<tabs.length; num++) { if(tabs[num] === obj) break; } for(var i=0; i<pages.length; i++) { if(i == num) { pages[num].style.display = 'block'; tabs[num].className = 'selected'; } else{ pages[i].style.display = 'none'; tabs[i].className = null; } } } } よろしくお願いします。

  • 同じ 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>

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

    過去ログを呼んで近いのがあったのでよく読んだのですが よくわかりませんので書き込みします。 以下のスクリプトで「オブジェクトがありませんのエラーが発生します。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>

  • 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

  • 三菱東京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にフェードインを追加したい。

    下記の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> 上記は、以前頂いたプログラムをわかる範囲で改造したものなのですが、 限界を感じまして、どなたか教えて頂けたら助かります。 宜しくお願いします。

専門家に質問してみよう