- 締切済み
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 以下省略
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- kumatti1
- ベストアンサー率60% (73/121)
ご参考程度にタイプライブラリに参照設定の要らないコードも載せておきます。 「VBAでIInternetExplorerManager」 https://gist.github.com/kumatti1/6b68ea65fdfc9ecf727f
- kumatti1
- ベストアンサー率60% (73/121)
ご質問の件は、IE11の拡張保護モードが有効下で特定のサイト(Yahoo!等)で発生する様です。 なので拡張保護モードを無効にするか、IE10以降でサポートされたIInternetExplorerManagerを使うかになるのではと。 タイプライブラリを作れる環境(VC++がインストールされてるなど)を用意して、コマンドプロンプトにて midl /newtlb hoge1.idl と入力すれば hoge1.tlb が出来ますのでそれを参照設定すれば、 前述のオブジェクト(IInternetExplorerManager)が使えます。 https://gist.github.com/kumatti1/7575516
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
#2です。 補足コメント、ご苦労様です。 真摯なお返事頂いていますから、必要以上にお気になさらいでいてくださいね。 > ... としてみましたが、改善はできませんでした。 ... 今回の問題は私の想定よりはずっと難しい問題だったようです。 力不足ですみません。今すぐ対策を示すことが出来ないので却って申し訳ないです。 私にとっては俄かに解決策を見つけられそうもないのですが、 私以外に、今はまだ一連の質問には応えていないけれど、 この問題の解決の為に着手されている識者の方がいらっしゃるようです。 私が勝手に盗み見した情報なので恐縮なのですが、 可能なら、ですが、、、1点確認してみて頂けないでしょうか? IEの設定で、 メニューバー[ツール]→[インターネット オプション] →[詳細設定]タブ→「セキュリティ」→ [拡張保護モードを有効にする] のチェックを外す。 以上の手順で、【一時的】に[拡張保護モード]を無効にした場合、 エラーが起こる環境で、エラーなく動作するのではないか、ということです。 確認が済んだら【一時的】な設定変更を元に戻してあげてください。 誤解のないように添えますが[拡張保護モード]が有効になっていても、 必ず(どの環境でも)状況が再現できるという訳でもないようです。 結果が解りましたら、補足欄に書き込んでみてください。 結果に違いが見られるようでしたら(或いは違いがなくても)、そのまま、 この質問スレを保留にしたまま、少し待ってあげてみてください。 思いの外、この問題の難度が高かったようなので、 誰にしても、何の確約は出来ないでしょうけれど、 私自身も継続して挑戦し(折に触れ解決策を考え)てみようと思います。 ひとまず、私の返信については「繋ぎ」役ということで、ご勘弁を。
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。 以前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関連の質問に回答されている方々にとっては、 探すまでもなくそこにある事象としてマルチポストが目に付くと思います。 「真面目に応えようと支度しても、その間に他所で解決するかも知れず、 徒労に終わりかねないことは、あまりやりたくない」 マルチポストを否定的に考えない方にとっても、やる気を削がれる意味で、 積極的には考え難いものです。 今のやり方は、チャンスを減らすやり方になっていると思うのです。 先々のご参考として役に立つことがあれば幸いです。 閑話休題。 こちらの書いた内容について疑問があればお応えします。 上記の方法で解決に至らない場合もあるでしょうけれど、 うまくいかなかった場合は、より具体的な補足を書いてみて下さい。 私ごときの実力だけでは、どこまでお役に立てるかは解りませんが、 もし、対話的に情報を整理していくことが出来れば、 多くの実力ある人を味方に付け、より早くより確かな解決に近づく 可能性は拡がると思います。 以上です。
- imogasi
- ベストアンサー率27% (4737/17070)
http://okwave.jp/qa/q8942903.html?f=mail_favorite_new と同じ方の同じ内容の質問ではないですか。 そちらを締め切ってから、こちらを投稿すべきでしょう。この質問のコーナーのマナーは守るべき。 質問の文章を補強したときも同じでしょう。 いくら回答がつかない(上記では2件)とか、自分のニーズを満たさないとしても、ここは無料の回答コーナーで、回答するかもしれないと見てる人も多くない分野であるので、やむを得ない。 まして、商売(<=依頼者)からみで質問するなどは、ほかの回答先を探すべき。
補足
おっしゃるとおりですね。 大変失礼しました。
補足
ありがとうございます。 自分が取った行動がいかに無礼だったか反省しております。 また、そんな中でもアドバイスや回答をいただき、感謝しております。 今後このような事がないよう気をつけてまいります。 アドバイスいただきました点、修正してみました。 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がレノボの低スペックモデルのようですので、処理速度の問題が強いのかもしれません。