三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

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

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)