.Document.Window が正しい書き方みたいです。2012/02/23 追記・修正
先にVB2010のWebBrowserを使いブラウザを操作したい。 VB2010を使用… - 人力検索はてな
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 です。
www.youtube.com
↑途中脱線したり、無言で固まったり(笑)してますが、よろしくお願いします。