よく聞くエラー、
オブジェクト変数または With ブロック変数が設定されていません
について、下記の質問をいただきました。
>三流君さんの ビデオを参考にして、 >ドロップダウンリストを選択するコードを、自分で書きましたが、うまくいきませ >ん。 >どこがダメなのか教えてもらえないでしょうか? > >'ドロップダウンリスト の部分の HTML ソース ><select name="selBrand" class="sBrand" >onchange="selBrand_onChange(0);"><option value="-" >selected>----------<option value="0011,4" >東京金<option value="0013,4" >東 >京白金<option value="0022,4" >東京ゴム<option value="0016,4" >東京ガソリン ><option value="0017,4" >東京灯油<option value="0018,4" >東京原油<option >value="0058,4" >東京コメ</select></td> > >' ログイン画面 > ie.document.forms(0).elements("txtUID").Value = "UserID" 'ok > ie.document.forms(0).elements("txtPWD").Value = "PassWord" > ie.document.all.iLogin.Click >' ここまでは問題なし ログイン後、ドロップダウンリストのあるページに行く。 > >ie.document.all("selBrand").selectedIndex = 1 ' ← ここでエラー オブジェ >クト変数または With ブロック変数が設定されていません。(Error 91) > >''' 最後のコードのどこがいけないのでしょうか?
↑と、質問をいただく。
相場の流れと同じで、インターネットの世界は流れが速いので、
既に他の場所で解決されているかもしれませんが、
3つの気になるパターンを書いてみた。
解決の糸口となれば・・・
1.ログイン後の処理待ちが無いパターン
気になるのは、
>' ログイン画面
> ie.document.forms(0).elements("txtUID").Value = "UserID" 'ok
> ie.document.forms(0).elements("txtPWD").Value = "PassWord"
> ie.document.all.iLogin.Click
>' ここまでは問題なし ログイン後、ドロップダウンリストのあるページに行く。
の後に、ログイン後の画面が変わるのを待っていない?とか?
' ログイン画面 ie.document.forms(0).elements("txtUID").Value = "UserID" 'ok ie.document.forms(0).elements("txtPWD").Value = "PassWord" ie.document.all.iLogin.Click ' ここまでは問題なし ログイン後、ドロップダウンリストのあるページに行く。 'ここで、ログイン後のページが表示されるのを待つ While ie.Busy = True Or ie.readyState <> READYSTATE_COMPLETE DoEvents Wend '↑で再度 表示を待ってから、↓セットかなぁ ie.document.all("selBrand").selectedIndex = 1 ' ← ここでエラー オブジェ
2.同じ名前のオブジェクトがある
あと、よくあるパターンが、同じ名前のセレクトがあって、
たとえば、
東京金の選択があるので、同じ名前で NY金 など、項目があると、
ie.document.all("selBrand").selectedIndex = 1
でどちらの name="selBrand" か判断がつかなくて、エラーになるかなぁ。
<select name="selBrand" class="sBrand" onchange="selBrand_onChange(0);"> <option value="-">selected>---------- <option value="0011,4" >東京金 のほかに <select name="selBrand" class="sBrand" onchange="selBrand_onChange(1);"> <option value="-">selected>---------- <option value="9999,4" >NY金
とか、
select name="selBrand"
と 同じ名前で選択項目があって、呼ぶ関数のselBrand_onChange(0) (1)だけ違うとか。
そんな時は、
ie.document.all("selBrand")(0).selectedIndex = 1
や
ie.document.all("selBrand")(1).selectedIndex = 1
みたいな感じかなぁ。
document.all("名前")(n番目).selectedIndex = 1 'nは0からスタート。
三流君VBA:VBAからIE操作 NAMEが同じフォームの項目へデータをセットする
http://www.ken3.org/vba/backno/vba176.html
↑手前みそですが、参考にしてみてください。
2.1 .selectedIndex = 1だけだと、onchangeが走らないかも?
.selectedIndex = 1でonchange="selBrand_onChange(0);"が走らなかったら、IE SELECT後 .fireEventでJavaScriptのイベントを起動
三流君VBA:IE SELECT後 .fireEventでJavaScriptのイベントを起動
http://www.ken3.org/vba/backno/vba155.html
みたいに、セット後に
document.all("名前").fireEvent ("javascriptのイベント名")
かなぁ。
ie.document.all("selBrand").fireEvent ("onchange")
同じ名前があったら、
ie.document.all("selBrand")(0).fireEvent ("onchange")
ie.document.all("selBrand")(1).fireEvent ("onchange")
selBrand_onChange を 呼ぶ感じかなぁ。
3.フレームになっている
株やFXの発注画面や分析画面って、Googleのインデックス化・SEOを気にしていないので
フレームを使った HTMLで作成されていたりする。
※メニュー の HTMLと明細部分を分けて、HTMLの量を軽くするため?
フレームになっていないか、確認かなぁ。。。
確認方法は(2011/12/15追加)
XXXXさんへ VBAでIE操作 フレームページを探って操作するテスト - ken3memo (三流君)
http://d.hatena.ne.jp/ken3memo/20111215/1323883317
を見てください。
以上、3点を疑ってみました
解決の糸口となれば、幸いです。 三流プログラマー Ken3