三流君 ken3のmemo置き場

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

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

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

QA20110523 VBA IE操作、フレームの操作をデバック

.Document.Window が正しい書き方みたいです。2012/02/23 追記・修正

先に

VB2010のWebBrowserを使いブラウザを操作したい。 VB2010を使用… - 人力検索はてな
http://q.hatena.ne.jp/1314392493#a1097389

↑を見てください。
.Document.Window が 正しいみたいです。

下記の私のサンプルは、たまたま、動いていたみたい(ぉぃぉぃ)
たぶん、VBAで省略したプロパティを勝手に補完してくれたから?
※恥は、そのまま、残しておきます。




修正前の記事。正解は↑のリンク先を見てください


VBAIE操作で、フレーム操作をデバックしながら遊んでみました。
いつものように、途中脱線したり、無言で固まったり(笑)してます。

質問内容

下記のような質問をいただきました。

ある動作でエラーになってしまうのですが、その原因がわかりません。
その動作というのが、
「"ユーザーフォームのWebBroserコントロールを使用した"、frame構造となっているHTMLの制御」です。
三流さんのサイトに記載されている「"IEウインドウを使用した"、frame構造HTMLの制御」はきちんと正しく

動作するのです。
しかし、それが"ユーザーフォーム"となるとエラーが起こってしまうのです。

例えば
objIE.Document.frames("F_RIGHT").Document.all("userid").Value = "Ken3"
などは上手く行くのですが、
UserForm1.WebBrowser1.Document.frames("F_RIGHT").Document.all("userid").Value = "Ken3"
ではエラーが出てしまいます。
ちなみに、
MsgBox UserForm1.WebBrowser1.Document.frames("F_RIGHT").NAME
では正しく"F_RIGHT"と表示されるので問題ないです。
frames("F_RIGHT")より下の.Documentなんちゃらかんちゃら以降を書いた文だとすべてエラーが発生してし

まいます。
frames("F_RIGHT")までの文ならばエラーは発生しません。
ちなみにエラーの種類は「オブジェクト変数またはWithブロック変数が設定されていません。」です。
ユーザーフォームを使用して、このエラーを回避する方法がございましたら教えていただけないでしょうか

!?
どうぞよろしくお願いします。

ユーザーフォームに貼った、WebBrowserコントロールに対して、
UserForm1.WebBrowser1.Document.frames("F_RIGHT").Document.all("userid").Value = "Ken3"
とコードを書くとエラーになってしまう、そんな感じみたいです。

う〜ん。

ア.IEの表示待ち、フレームページは.Busyじゃなくて.ReadyState?

私がよくやる失敗だと、フレームのページ、読み込み待ちをするときに

    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop

と、.Busyで待つと、片方のフレームページが読み込まれていないので、
エラーになったりします。
もしかしたら、

    '表示終了まで待つ
    Do While Me.WebBrowser1.ReadyState <> READYSTATE_COMPLETE
        '何もしないループ(笑)
        DoEvents
    Loop

のように、.ReadyState <> READYSTATE_COMPLETE で 待った方がいいかもしれません。

イ.オブジェクトの階層が深いので、途中に変数を入れる?

あとは、オブジェクトの階層が深いので、

    'TOPのオブジェクトから項目まで.で行く(笑)のでは無く、
        '途中に変数を作り、フレームのドキュメントオブジェクトを代入
    Dim objDOC   As HTMLDocument      'HTMLドキュメント
    Set objDOC = Me.WebBrowser1.Document.frames("F_RIGHT").Document 'フレームドキュメントをセット

    objDOC.all("userid").Value = "Ken3"
    objDOC.all("pass").Value = "aaa"

みたいに、
途中に、objDOC As HTMLDocument と 変数を1つ作り(※MicroSoft HTML Object を参照設定してください)
フレームを代入
Set objDOC = Me.WebBrowser1.Document.frames("F_RIGHT").Document
してから、
objDOC.all("userid").Value = "Ken3"
objDOC.all("pass").Value = "aaa"
のように値をセット、みたいな感じで、分割するといいのかなぁ?

こんな感じで、動きました

上記2点を合わせると、下記のような感じかなぁ

Private Sub CommandButton1_Click()

    'フレームページを表示する
    Me.WebBrowser1.Navigate "http://www.ken3.org/vba/test116.html"

    '表示終了まで待つ
    Do While Me.WebBrowser1.ReadyState <> READYSTATE_COMPLETE
        '何もしないループ(笑)
        DoEvents
    Loop

    'TOPのオブジェクトから項目まで.で行く(笑)のでは無く、
        '途中に変数を作り、フレームのドキュメントオブジェクトを代入
    Dim objDOC   As HTMLDocument      'HTMLドキュメント
    Set objDOC = Me.WebBrowser1.Document.frames("F_RIGHT").Document 'フレームのドキュメントをセット

    objDOC.all("userid").Value = "Ken3"
    objDOC.all("pass").Value = "aaa"
    
End Sub

実行結果とデバック動画

いつもの操作動画 http://www.youtube.com/watch?v=P-FC3baJkzo です。
www.youtube.com
↑途中脱線したり、無言で固まったり(笑)してますが、よろしくお願いします。

Ken3 ホームページ 目次

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

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



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