VB2010のWebBrowserを使いブラウザを操作したい。


VB2010を使用し、IEを操作するコードを考えています。
操作したいサイトはフレームが使われています。

IEを起動させURLを指定しフォームを指定する
まずは。
objIE_A = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。
objIE_A.Visible = True '可視、Trueで見えるようにします。
objIE_A.Navigate("https://") 'URLを指定

ボタンをクリックすると。
    TextBox1.text = objIE_A.document.frames(2).document.all("hoge").innerTEXT 'データを取得
これでフレーム内のデータが取得できます。

ですが。WebBrowserを使用し、
    objIE_A = WebBrowser1
    TextBox1.text = objIE_A.document.frames(2).document.all("hoge").innerTEXT 'データを取得
のようにするとエラーがでて動きません。

どのようにすればWebBrowserを使いフレームページのデータを取得できるようになるのでしょうか?

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2011/08/27 06:01:33
  • 終了:2011/08/27 17:24:48

ベストアンサー

id:a-kuma3 No.4

a-kuma3回答回数4563ベストアンサー獲得回数19082011/08/27 16:51:16

ポイント1000pt

エラーの内容は「公開メンバー 'frames' は型 'HtmlDocument' に見つかりませんでした。」です。


frames を持ってるのは HtmlDocument じゃなくて、HtmlWindow なので、

objIE_A.Document じゃなくて、objIE_A.Document.Window かな。

test = objIE_A.Document.Window      ' ★ここ!
test2 = test.frames(1).Document
TextBox1.Text = test2.all(1).InnerText

後、関係ないと思うけど、プロパティの大文字/小文字も合わせておきたいところ。

frames → Frames

all → All


以下、.NET Framework のリファレンス。

HtmlDocument メンバ

HtmlWindow メンバ


どちらも同じようなことをやってるけど、実は「同じ」ではない。

WebBrowser コントロールは .NET Framework のオブジェクトで、

InternetExplorer.Application は Microsoft Internet Controls のオブジェクトだから、

メンバーが微妙に違う。


# 「同じにしてくれよ!」という気持ちは分かる :-)

id:lupink

うまくいきました!

かなり悩み苦戦してたのでとてもたすかりました。

ありがとうございます。

2011/08/27 17:23:42

その他の回答(3件)

id:ken3memo No.1

ken3memo回答回数246ベストアンサー獲得回数772011/08/27 09:52:33

ポイント100pt

http://d.hatena.ne.jp/ken3memo/20110524/1306190154

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

とか?

objIE_A = WebBrowser1

    TextBox1.text = objIE_A.document.frames(2).document.all("hoge").innerTEXT 'データを取得

んっ、もしかして、

Set objIE_A = WebBrowser1

のSet じゃないよね・・・

参照が深いので、

Set objIE_A = WebBrowser1.document.frames(2).document

TextBox1.text = objIE_A.all("hoge").innerTEXT 'データを取得

にするとか?

Setが無いのが気になったのと、分割位置を変えてみては・・・の提案でした。

無事に動作することを願いつつ、失礼します。。。。

id:lupink

回答ありがとうございます。サイトで色々勉強させていただいています。

分割してもうまくいきませんでした。

質問内容を補足しましたのでもしよろしければ解決策を教えて下さい。

2011/08/27 16:15:45
id:you1031931 No.2

you1031931回答回数323ベストアンサー獲得回数32011/08/27 10:26:17

ポイント10pt

コピーは出来ないんですか?

出来たらそのほうが楽かと思います

id:lupink

回答ありがとうございます。

具体的にどのようにすればいいのかご存知でしたら回答お願いします。

2011/08/27 16:16:25
id:a-kuma3 No.3

a-kuma3回答回数4563ベストアンサー獲得回数19082011/08/27 10:49:43

    objIE_A = WebBrowser1

    TextBox1.text = objIE_A.document.frames(2).document.all("hoge").innerTEXT 'データを取得

Set が無い、ということは、objIE_A はクラスのメンバーなのかな?

WebBrowser1 は、Form に WebBrowser コントロールを貼りつけている、ということですよね?


CreateObject を使ったときと同様に、Navigate メソッドを呼んであげる必要があります。

Form をロードしたときの関数などで、データを取り出す前に、

Sub Form1_Load
    ...
    WebBrowser1.Navigate("https://...")
    ...
End Sub

としてください。


データを取り出す直前でも、もちろんOKです。

    WebBrowser1.Navigate("https://...")
    TextBox1.text = WebBrowser1.document.frames(2).document.all("hoge").innerTEXT
id:lupink

回答ありがとうございます。

setが無い クラスのメンバー

というのはよくわからないのですが、使用しているのはVisual Basic2010です。

WebBrowser1.Navigate("https://...")を入れてもうまく動きませんでした。

質問の内容を詳細に書き直しましたので、回答いただければ幸いです。

2011/08/27 16:17:46
id:a-kuma3 No.4

a-kuma3回答回数4563ベストアンサー獲得回数19082011/08/27 16:51:16ここでベストアンサー

ポイント1000pt

エラーの内容は「公開メンバー 'frames' は型 'HtmlDocument' に見つかりませんでした。」です。


frames を持ってるのは HtmlDocument じゃなくて、HtmlWindow なので、

objIE_A.Document じゃなくて、objIE_A.Document.Window かな。

test = objIE_A.Document.Window      ' ★ここ!
test2 = test.frames(1).Document
TextBox1.Text = test2.all(1).InnerText

後、関係ないと思うけど、プロパティの大文字/小文字も合わせておきたいところ。

frames → Frames

all → All


以下、.NET Framework のリファレンス。

HtmlDocument メンバ

HtmlWindow メンバ


どちらも同じようなことをやってるけど、実は「同じ」ではない。

WebBrowser コントロールは .NET Framework のオブジェクトで、

InternetExplorer.Application は Microsoft Internet Controls のオブジェクトだから、

メンバーが微妙に違う。


# 「同じにしてくれよ!」という気持ちは分かる :-)

id:lupink

うまくいきました!

かなり悩み苦戦してたのでとてもたすかりました。

ありがとうございます。

2011/08/27 17:23:42
  • id:lupink
    質問の内容を補足します。

    Microsoft Visual Basic 2010 Expressを使っています。

    フォームには
    TextBox1
    Button1
    Button2
    Button3
    WebBrowser1
    が配置されています。

    サンプルコードは

    Public Class Form1


    Dim objIE_A As Object '変数を定義


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    objIE_A = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。
    objIE_A.Visible = True '可視、Trueで見えるようにします。
    objIE_A.Navigate("http://www.ken3.org/vba/test116.html") 'URLを指定

    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

    Dim test As Object

    test = objIE_A.Document.frames(1).Document
    TextBox1.Text = test.all(1).InnerText

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

    WebBrowser1.Navigate("http://www.ken3.org/vba/test116.html") 'URLを指定

    End Sub


    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

    Dim test As Object
    Dim test2 As Object

    objIE_A = WebBrowser1

    test = objIE_A.Document
    test2 = test.frames(1).Document
    TextBox1.Text = test2.all(1).InnerText

    End Sub

    End Class


    これでButton1を押せばIEが立ち上がりButton2を押すとそのフレーム内のデータが取得できます。
    ですがButton3を押しフォームのWebBrowserにアドレスを入れ、Button4を押しフレーム内のデータを取得しよとするとエラーが出ます。
    エラーの内容は「公開メンバー 'frames' は型 'HtmlDocument' に見つかりませんでした。」です。

    どのようにすればフォームのWebBrowser内のフレームの中にあるデータを取得できるのでしょうか?
  • id:lupink
    解決したので締め切ります。
    皆様の回答のおかげで解決できました。ありがとうございます。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません