ken3memo (三流君)

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




[記事一覧、バックナンバーを見る]

2011-05-24

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

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

先に

no title

http://q.hatena.ne.jp/1314392493#a1097389

↑を見てください。

.Document.Window が 正しいみたいです。

下記の私のサンプルは、たまたま、動いていたみたい(ぉぃぉぃ)

たぶん、VBAで省略したプロパティを勝手に補完してくれたから?

※恥は、そのまま、残しておきます。




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


VBAのIE操作で、フレーム操作をデバックしながら遊んでみました。

いつものように、途中脱線したり、無言で固まったり(笑)してます。

質問内容

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

ある動作でエラーになってしまうのですが、その原因がわかりません。

その動作というのが、

「"ユーザーフォームの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 です。

D

↑途中脱線したり、無言で固まったり(笑)してますが、よろしくお願いします。

ken3memoken3memo 2012/02/23 18:33 XXXXさんへ ご指摘ありがとう。
ハッっと思いだし、過去の質問みてみたら、同じようなことがあったので、頭にリンクを載せました。

ken3memoken3memo 2012/02/25 23:56 んっ、
.NetとVBAは違うから いいのか?

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証





[記事一覧、バックナンバーを見る]








ブログトップ 記事一覧 ログイン 無料ブログ開設