• 締切済み

VBAで424エラーが出るPCと出ないPCがある

マクロ初心者なのですが、ブラウザを操作していき、自動でフォーム登録を繰り返すプログラムを組みました。 職場のPC(win7 Excel2013 IE11)と自宅PC(win7 Excel2003 IE11)で確認したところ、問題なく動作していたのですが、依頼者の環境(win7 Excel2013 IE11)ではソース最後の《イベント名入力》の処理で424エラーが出てしまいます。 以下のような事を試してみたのですが、まったくわかりませんでした。 どなたか解決策をご教示ください!! ・Excelの参照設定確認⇒動作PCとすべて一致 ・IEの互換性表示設定⇒ 実施すると424エラーが91エラーになった ・getElementByIdをforms(0)にしてみた⇒動かず ・getElementByIdをgetElementsByNameにしてみた⇒動かず(91エラー) ・%temp%で検索し、Excel8.0のディレクトリを削除⇒影響なし デバッグ時にひっかかっている箇所の前に同じような処理('イベントコード)は動作しているのが逆に謎です。 以下、ソース冒頭から該当箇所まで Sub MainFlow() Dim objIE As Object 'IE起動 Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True '管理画面に接続 objIE.navigate "http://www.xxxxxxxxx.com" 'ループ回数の算出 endrow = Cells(Rows.Count, 1).End(xlUp).Row 'ループ処理 For myCnt = 2 To endrow 'IEを待機 Call IEWait(objIE) 'イベントコード objIE.document.getElementById("s_event_cd").Value = Worksheets("data1").Cells(myCnt, 1).Value 'コピー用開催日 objIE.document.getElementById("s_event_kaisai_ymd_from").Value = Worksheets("data1").Cells(myCnt, 2).Value '検索ボタン押下 Call IEButtonClick(objIE, "検索") 'IEを待機 Call IEWait(objIE) '編集ボタン画像をクリック For n = 0 To objIE.document.images.Length - 1 'イメージ数ループする。 Set objIMG = objIE.document.images(n) 'n番目のイメージを代入 If InStr(objIMG.src, "button_mod.gif") > 0 Then '"言語の入れ替え") '合致した画像のボタンの場合 objIMG.Click Exit For End If Next 'IEを待機 Call IEWait(objIE) 'サブミット Call IEButtonClick(objIE, "このイベントのコピーを作成") 'ビジーウエイト Call IEWait(objIE) 'イベント名入力 objIE.document.getElementById("event_name").Value = Worksheets("data1").Cells(myCnt, 3).Value 以下省略

みんなの回答

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.5

ご参考程度にタイプライブラリに参照設定の要らないコードも載せておきます。 「VBAでIInternetExplorerManager」 https://gist.github.com/kumatti1/6b68ea65fdfc9ecf727f

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.4

ご質問の件は、IE11の拡張保護モードが有効下で特定のサイト(Yahoo!等)で発生する様です。 なので拡張保護モードを無効にするか、IE10以降でサポートされたIInternetExplorerManagerを使うかになるのではと。 タイプライブラリを作れる環境(VC++がインストールされてるなど)を用意して、コマンドプロンプトにて midl /newtlb hoge1.idl と入力すれば hoge1.tlb が出来ますのでそれを参照設定すれば、 前述のオブジェクト(IInternetExplorerManager)が使えます。 https://gist.github.com/kumatti1/7575516

回答No.3

#2です。 補足コメント、ご苦労様です。 真摯なお返事頂いていますから、必要以上にお気になさらいでいてくださいね。 > ... としてみましたが、改善はできませんでした。 ... 今回の問題は私の想定よりはずっと難しい問題だったようです。 力不足ですみません。今すぐ対策を示すことが出来ないので却って申し訳ないです。 私にとっては俄かに解決策を見つけられそうもないのですが、 私以外に、今はまだ一連の質問には応えていないけれど、 この問題の解決の為に着手されている識者の方がいらっしゃるようです。 私が勝手に盗み見した情報なので恐縮なのですが、 可能なら、ですが、、、1点確認してみて頂けないでしょうか? IEの設定で、  メニューバー[ツール]→[インターネット オプション]   →[詳細設定]タブ→「セキュリティ」→    [拡張保護モードを有効にする]    のチェックを外す。 以上の手順で、【一時的】に[拡張保護モード]を無効にした場合、 エラーが起こる環境で、エラーなく動作するのではないか、ということです。 確認が済んだら【一時的】な設定変更を元に戻してあげてください。 誤解のないように添えますが[拡張保護モード]が有効になっていても、 必ず(どの環境でも)状況が再現できるという訳でもないようです。 結果が解りましたら、補足欄に書き込んでみてください。 結果に違いが見られるようでしたら(或いは違いがなくても)、そのまま、 この質問スレを保留にしたまま、少し待ってあげてみてください。 思いの外、この問題の難度が高かったようなので、 誰にしても、何の確約は出来ないでしょうけれど、 私自身も継続して挑戦し(折に触れ解決策を考え)てみようと思います。 ひとまず、私の返信については「繋ぎ」役ということで、ご勘弁を。

回答No.2

こんにちは。 以前VBAでIE操作を扱っていた頃には、私の環境でも ここOKWaveを対象に、ご指摘のような現象を経験したことがあります。 Y!知恵袋の方には直接的な回答も付いているようですが、   Call IEWait(objIE) で呼び出している'IEWait'の中の記述が、   Do While objIE.busy Or objIE.readyState <> 4 ' (4 または READYSTATE_COMPLETE)     DoEvents      ' または、Sleep (milliSec)     ' または、これらの組合わせ   Loop ' または While ...Wend (色んな書き方がありますが) 等のように書かれていたとして、これは、平たく言うと InternetExplorerオブジェクトの準備が終るまで待機する という内容です。 今回の課題については  ========================  実行時エラー '424'  オブジェクトが必要です。  ======================== というエラーが発生していること、と、 > デバッグ時にひっかかっている箇所の前に同じような処理('イベントコード)は動作しているのが逆に謎です。 必ずエラーが発生する訳でもない、という2つに点から類推すると、 'IEWait'の処理内容が、今回の場合は不十分である可能性が高いです。 InternetExplorerオブジェクトの準備が終るタイミング と IE.documentオブジェクトの準備が終るタイミング にズレが生じる為にエラーになっているケースと考えると 矛盾なく状況を理解出来るのではないでしょうか。 問題なく動いているという環境でも、 比較的簡単に(IE.documentはLOADING中という)状況を 再現する方法として、   objIE.readyState <> 4 '(READYSTATE_COMPLETE) を   objIE.readyState < 3 '(READYSTATE_INTERACTIVE) や   objIE.readyState < 2 '(READYSTATE_LOADED) のように、わざと実験的な記述に書換えて何度かテストしてみる、 という手もあります。 逆に、こうした実験例のように、 objIE.readyState が 4(READYSTATE_COMPLETE)に満たないのに 待機を終わらせるようなスクリプトに書き換わってしまっていないか、 一応は、確認した方がいいです。 Y!知恵袋の方でご指摘があるように、 ご質問のような状況が起こる原因の1番は、ページソースの問題です。 エラー起きたり起らなかったりする違いを生み出す要因としては、 通信環境やPC環境、UpDateの適用、IEの設定等の相違も考えられます。 エラーが起こる環境でもエラーが起こらない場合があるという違いは、 単に読み込む速度のバラつきのせい、ということだと思われます。 ただし、原因をピンポイントで言い当てることは、私には、出来ません。 ■ 対症療法的に簡単な解決を求めるなら、一例として、 'IEWait'の中身として既存の記述の後に   Do While objIE.document.readyState <> "complete"     DoEvents ' または、Sleep (milliSec)   Loop を書き加えて試してみては如何でしょう。 直接の回答としては、以上です。 ■ ところで、 質問掲示板で解決を得たい方へのアドバイスとして書き添えますが、 「質問ページを締め切らないこと」 「質問ページを締め切らずに同じ内容で新たな質問を立てること」 「同じ内容での複数の質問を同時並行に建てること」 は、少しでも早く、多くの情報を得て解決に結びたい、というような 心情は察することは出来ますが、 むしろ、解決を遠避け、限られた情報しか得られない、 というような、逆効果に帰結する可能性が高いことを意識して、 これから質問する時には留意してみて下さい。 質問掲示板で質問者さんを解決へと導きたい回答者の目線からすれば、 「打っても響かない」 「何を以て解決なのか先が見えない」 「他所でも質問しているということは、端から期待されていない」 という風に受け止めてしまう、というような 心情もまた、察することは出来るのではないでしょうか。 これまで出会った多くの回答者さんの多くは、 マルチポストである場合には回答しない、と決めてらっしゃるようです。 特に、Web関連の質問に回答されている方々にとっては、 探すまでもなくそこにある事象としてマルチポストが目に付くと思います。 「真面目に応えようと支度しても、その間に他所で解決するかも知れず、  徒労に終わりかねないことは、あまりやりたくない」 マルチポストを否定的に考えない方にとっても、やる気を削がれる意味で、 積極的には考え難いものです。 今のやり方は、チャンスを減らすやり方になっていると思うのです。 先々のご参考として役に立つことがあれば幸いです。 閑話休題。 こちらの書いた内容について疑問があればお応えします。 上記の方法で解決に至らない場合もあるでしょうけれど、 うまくいかなかった場合は、より具体的な補足を書いてみて下さい。 私ごときの実力だけでは、どこまでお役に立てるかは解りませんが、 もし、対話的に情報を整理していくことが出来れば、 多くの実力ある人を味方に付け、より早くより確かな解決に近づく 可能性は拡がると思います。 以上です。

blackened
質問者

補足

ありがとうございます。 自分が取った行動がいかに無礼だったか反省しております。 また、そんな中でもアドバイスや回答をいただき、感謝しております。 今後このような事がないよう気をつけてまいります。 アドバイスいただきました点、修正してみました。 Function IEWait(ByRef objIE As Object) Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop   Do While objIE.document.readyState <> "complete"     DoEvents   Loop End Function としてみましたが、改善はできませんでした。 固有の設定がされていないか、IEとExcelの再インストールも試しておりますが、動きませんでした。PCがレノボの低スペックモデルのようですので、処理速度の問題が強いのかもしれません。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

http://okwave.jp/qa/q8942903.html?f=mail_favorite_new と同じ方の同じ内容の質問ではないですか。 そちらを締め切ってから、こちらを投稿すべきでしょう。この質問のコーナーのマナーは守るべき。 質問の文章を補強したときも同じでしょう。 いくら回答がつかない(上記では2件)とか、自分のニーズを満たさないとしても、ここは無料の回答コーナーで、回答するかもしれないと見てる人も多くない分野であるので、やむを得ない。 まして、商売(<=依頼者)からみで質問するなどは、ほかの回答先を探すべき。

blackened
質問者

補足

おっしゃるとおりですね。 大変失礼しました。

関連するQ&A

  • VBAのVLOOKUPの速度向上について

    VBAでVLOOKUPの速度向上について、お知恵を貸していただきたく存じます。 以下のVLOOKUPのVBAがおそく、速くしたいです。行数は2万行ぐらいです。 何卒よろしくお願い申し上げます。 Dim 範囲A As Range Set 範囲A = Worksheets("取引先").Range("A:H") On Error Resume Next myCnt5 = 2 Do Worksheets("受注データ").Cells(myCnt5, 49).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt5, 48), 範囲A, 6, False) myCnt5 = myCnt5 + 1 If Worksheets("受注データ").Cells(myCnt5, 1).Value < 10 Then Exit Do Loop On Error Resume Next myCnt6 = 2 Do Worksheets("受注データ").Cells(myCnt6, 51).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt6, 50), 範囲A, 8, False) myCnt6 = myCnt6 + 1 If Worksheets("受注データ").Cells(myCnt6, 1).Value < 10 Then Exit Do Loop On Error Resume Next myCnt7 = 2 Do Worksheets("受注データ").Cells(myCnt7, 53).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt7, 52), 範囲A, 6, False) myCnt7 = myCnt7 + 1 If Worksheets("受注データ").Cells(myCnt7, 1).Value < 10 Then Exit Do Loop 補足 上記VBAには記載していませんが、Application.ScreenUpdatingの停止、Application.Calculationを手動の設定はしています。

  • VBA オブジェクトが必要です

    ie.Document.getElementById("menu_2").Click で、オブジェクトが必要ですというエラー”424”が発生します やってることはIE操作でウェブページのメニューをクリックするという内容です いかに全コードを記載します Sub ********() Set ie = CreateObject("InternetExplorer.Application") 'IE起動 ie.Visible = True ie.Navigate "************" '開きたいサイトのURLを指定  Call IEWait(ie) 'IE待機 ie.Document.getElementsByname("${loginForm.loginId}")(0).Value = "**********" ie.Document.getElementsByname("${loginForm.password}")(0).Value = "*********" ie.Document.getElementsByname("Image7")(0).Click Call IEWait(ie) 'IE待機 ie.Document.getElementsByname("Image1")(0).Click Call IEWait(ie) 'IE待機 ie.Document.getElementById("menu_2").Click Call IEWait(ie) 'IE待機 End Sub 自分としてはie.Document.getElementsByname("Image7")(0).Clickでエラーが出ないのに getElementByIdではオブジェクトが必要と言われidで取得なのかnameで取得なのかしか、かわらないのにオブジェクトが必要です、となる意味がわからないです。 どなたかご教授お願いします。

  • VBAでオブジェクトがありません、となってしまう

    VBAを実行すると、 実行エラー424 オブジェクトが必要です。 となってしまいます。 エラーとなっている行は、 .Document.getElementById("q_d").Value = ActiveSheet.Cells(rowno, 1).Value です。 作成したリストは、以下のようになっています。 Sub MAP住所() Dim objIE As Object, rowno As Integer rowno = 1 Set objIE = CreateObject("InternetExplorer.Application") With objIE 'Google Map起動 .Navigate "http://maps.google.co.jp/" .Visible = True Do While (ActiveSheet.Cells(rowno, 1).Value <> "") 'IE待機 Do While .Busy = True DoEvents Loop '住所をテストボックスへ入力 .Document.getElementById("q_d").Value = ActiveSheet.Cells(rowno, 1).Value '送信ボタンクリック .Document.forms(0).submit '次の行 rowno = rowno + 1 Loop End With Set objIE = Nothing End Sub A列にある住所を読み込んで、グーグルマップに表示するスクリプトになります。 どう直して良いのか、皆目わかりません 御指南願います

  • マクロ EXCELセルの文字を自動でIE入力

    マクロ EXCELセルの文字を自動でIE入力フォームへ入力する方法 色々、検索してみましたが分からなくなりましたので質問させて頂きます。 IEの入力フォームへEXCELで入力してあるテキスト文を自動的に貼り付ける ことをしたくネットで調べた結果、以下のことはできました。 === 実行できたマクロ ================================================= ◆サイトソース◆ 某サイトのソースを調べたら以下のように表示されましたので <input type="text" name="n1" id="name" size="14" maxlength="11" istyle>・・・ マクロを以下のように組んで見ました。 ObjIE.Document.getElementById("name").Value = Worksheets("Sheet1").Range("A1") そうしたら、問題なくIEの入力フォームへ自動記入できました。 === 実行できなかったマクロ ================================================= ◆サイトソース◆ 某サイトのソースを調べたら以下のように表示されましたので <input type="text" name="n1" size="14" maxlength="11" istyle>・・・ 上記と同様マクロを組んで見ました。 ObjIE.Document.getElementById("n1").Value = Worksheets("Sheet1").Range("A1") そうするとエラーが起きてしまいます。 ○考えられるエラー 実行できた方のソースには・・・ 「id="name"」と入っていたので「ObjIE.Document.getElementById("n1").Value 」で 問題ないかと思いますが、実行できなかった方のソースには・・・ 「name="n1"」と、id=の部分がなかったのでここのマクロの書き方なのかなと思います。 ちなみに ObjIE.Document.getElementById("n1").Value = Worksheets("Sheet1").Range("A1")                   ↓ ObjIE.Document.getElementByName("n1").Value = Worksheets("Sheet1").Range("A1")で 実行してみましたがダメでした。 ご助言いただけると助かります。 宜しくお願いします。

  • vbaの速度向上(sumif関数)

    エクセルvbaの速度を向上できないか、お知恵を貸していただきたく存じます。 以下のvba(sumif関数)をもっと速めたいです。何とかできないでしょうか。長い記載となり申し訳ないのですが、何卒よろしくお願い申し上げます。 myCnt7 = 2 Do Worksheets("●").Cells(myCnt7, 4).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 3), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 3), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 7).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 6), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 6), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 10).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 9), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 9), Worksheets("★").Range("C:C")) Loop While myCnt7 > 201 ※シート●のC列から3列ごとに、Sumifの検索条件があります。 ※シート●のD列から4列ごとに、Sumifの計算結果を出力させます。 ※計算対象シートは、シート◆とシート★の2つです。  シート◆のSumif合計から、シート★のSumif合計を差し引いています。  Sumifの条件自体は、どちらのシートも同じ(シート●)。 ※上記のSumif関数の記述は、3つですが、実際の記述は24あります。 ※すなわち、検索条件の組み合わせが24あり、201行分をmyCnt7でLoopさせて実行しています。

  • VBAからIE操作でログインできない

    社内の業務管理システムにエクセルVBAでログインしようとしています、が、ログインはもとより、IDを入力する部分に私のID情報すら入力されません。 とりあえずID枠に入力する方法をアドバイスをお願いします。 ◆htmlソース <table> <tr> <td>ID</td> <td><input type="text" name="UserId" id="UserId" /></td> </tr> <tr> <td>PW</td> <td><input type="password" name="UserPass" id="UserPass" /></td> </tr> ◆VBAでは以下のいずれの文も失敗(ID入力枠に何も入らない。エラー発生。) ※右辺のD12セルには私のID情報を入力しています。 ObjIE.Document.all.UserId.Value = Worksheets("MyData").Range("D12").Value ObjIE.Document.all("UserId")(0).Value = Worksheets("MyData").Range("D12").Value ObjIE.Document.all("UserId").Value = Worksheets("MyData").Range("D12").Value ObjIE.document.forms(0).elements("UserId").Value = Worksheets("MyData").Range("D12").Value ObjIE.document.forms(0).elements("UserId")(0).Value = Worksheets("MyData").Range("D12").Value ObjIE.Document.getElementById("UserId").Value = Worksheets("MyData").Range("D12").Value ObjIE.document.all.Item("UserId").Value = Worksheets("MyData").Range("D12").Value 上記コードの何が間違っているのでしょうか? あるいは、上記の原因特定するために、何を試せばよいでしょうか? 宜しくお願いいたします。

  • VBAでFC2に自動ログインしたい

    excel2010 VBAを使ってFC2のログインをしたいと思います。 色々と試してみましたが、ログインボタン押下を無視されているようです。 何か良い方法は、ありませんか。 'ログイン ie.Navigate "http://fc2.com/login.php?ref=blog" waitIE ie Sleep 1000 ie.document.getElementById("id").Value = Worksheets("ブログリスト").Range("C" & num).Value ie.document.getElementById("pass").Value = Worksheets("ブログリスト").Range("D" & num).Value 'ie.document.all.INPUT.Click 'クリックメソッドを実行 ie.document.forms(0).Submit 'ie.document.getElementsByTagName("image").Item(0).Click 'ie.document.getElementById("image").Click 'ie.documant.all.Item("image").Value.Click 'ie.Document.form_login.Submit waitIE ie Sleep 1000 上記のコメントアウトは実行してエラーになりました。 良い手立てがありましたら、ご教示ください。

  • エクセルVBA For~Nextについての質問

     初めまして、よろしくお願いします。  最近VBAを見よう見まねで入力している超初心者です。 C1からC10までにA1+B1の計算結果を入力するVBAで Sub TEST()  Dim myCnt As Long   For myCnt = 1 To 10     Cells(myCnt, 3).Value = Cells(myCnt, 1).Value + Cells(myCnt, 2).Value   Next myCnt End Sub というVBAが有りますが、このA1からA10、B1からB10の間に未入力などが有ると計算の途中でエラーになってしまうようです。エラーにならない対策方法を教えていただきたく、よろしくお願いします。

  • エクセルでのVBA

    エクセルでVBAを使ってIEで指定のURLを開いて、VBAで指定したWEBフォームにエクセルで指定したセルの値を入力したいのですが、下記のコードを入れるとエラーが出てしまいます。   A1:1-1 or 1-2 or 1-3 B1:月曜日 C1:火曜日 D1:水曜日 上のA1~D1まで入力した上でコマンドボタンをクリックすると、自動的に行うようにしたいです。 Private Sub CommandButton1_Click() Dim objie As Object Set objie = CreateObject("InternetExplorer.application") objie.Visible = True objie.Navigate "http://●●●●/form.html" Dim kubun As String kubun = range("A1") Select Case kubun Case "1-1" call ma1_1 Case "1-2" call ma1_2 Case "1-3" call ma1_3 End select Set objie = Nothing End sub Sub ma1_1() objie.Document.all.form1_1.Value = Range("B1") End Sub Sub ma1_2() objie.Document.all.form1_1.Value = Range("B1") objie.Document.all.form1_2.Value = Range("C1") End Sub Sub ma1_3() objie.Document.all.form1_1.Value = Range("B1") objie.Document.all.form1_2.Value = Range("C1") objie.Document.all.form1_3.Value = Range("D1") End Sub これで実行を押すと、objie 変数が定義されていません。と出てしまいます。このobjieを有効にするにはどうしたよいのでしょうか? わかる方いましたらご教授願います。 よろしくお願いします。

  • エクセル VBA 値の取得

    <div id=result name=result class='resultleft'><div class='finalresult'> 結果 </div> </div> 上記のソースの”結果 ”という値を取り出したいのですが実現できません。 Set IE = CreateObject("InternetExplorer.Application") Cells(1, 1) = IE.Document.getElementById("result").Value や Cells(1, 1) = IE.Document.getElementsByName("result").Value は、駄目なのでしょうか。