三流君 ken3のmemo置き場

メモ置き場、保管庫として利用。まとまっていませんがヨロシク



XXXXさんへ VBA IE操作で オブジェクト変数または With ブロック変数が設定されていません について

よく聞くエラー、
オブジェクト変数または 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