IEのサポートがWindows11で完全終了してしまいましたね。(2021/10/05冒頭に追記)
そんな感じで下記の質問が来たので対応策の参考になれば
下記いただいた質問
>ExcelVBAでデータを集め、競輪予想を作っています。
・
・
・
>さて最近、IEのサポート終了が告知されていますが
>WEBからのデータ取得はどのような対処がベターなのでしょうか?ご意見をお聞かせください。
ベター、ベスト、イロイロな考え方がありますが、
1.MSXML2.XMLHTTP などでHTMLを取得して、CreateObject("htmlfile") を使う
下記の例題動画、なんだか私の解説はイマイチだった・・・やはり、素直にSelenium VBAなのかなぁ。
と思いつつ、冒頭で Set objHTML = CreateObject("MSXML2.XMLHTTP")
でHTMLを取得して、使ったサンプルを紹介してみたり
IEサポート終了後の世界 MSXML2.XMLHTTPとCreateObject("htmlfile")を使用してJRAオッズ取得 ワイドのオッズ取得に挑戦してみた
目次
10:08 2.ワイドのオッズを押す
11:55 2.1 strレースを探し、頭出し?
18:47 3.オッズのテーブルを判断して、Excelにワイドオッズを取得
21:37 3.1 tableのcaptionで判断
28:30 4.ワイドの一番人気を探す
31:17 元に戻って、2.4 2回目以降は、レースを選択
他の動画を見る(YouTubeで再生リストを見る)
↑も参考になれば・・無事に移行できるといいですね。 三流プログラマー Ken3
※ソースコードは[MSXML2.XMLHTTPとCreateObject("htmlfile")を使用してJRAオッズ取得]を見てアレンジしてください。
はじめは[WebBrowserを参照設定]から入り [VBAでIE操作解説]やってます。 よく使う.Document:の解説から [.Forms]で入力処理 [.Links]でリンク情報取得 [.Images]で画像の情報 [.Frames]でフレーム処理 [.Script]でスクリプト処理 ...など、まだまだ抜けてますが、 |
手探りで[ヘルプ IEのオブジェクトを探る] IE,WebBrowser: [IE プロパティ(各種設定)] [IE メソッド(イロイロな動作)] [IE イベント(発生後処理)] |
[VBAでIE操作(TOP)] 小さな[IE操作のサンプル]でTEST 次に[少し大きなIEを使ったサンプル] にチャレンジしたり [IE関係記事一覧] [VBA(TOP)] [三流君(TOP)] |
全ての質問には、答えられませんが、リクエストや質問があったら、[作者(三流君)に質問する] から 気軽に送ってください
[三流君VBAでIEを操作・IEの制御]から、Formの操作部分を抜き出しまとめてます。InternetExplorer WebBrowser の Document.Formsを操作してみたいと思います。なかなかのジャジャ馬で制御するのが難しいんだけど・・・
こんな感じ↓で、デバックしていたり(笑)
ソースと簡単な解説は[IE操作 Name=が同じデータを(n)で処理とFormsを指定して処理]を見てください
ページ内が無駄に長いので、ページ内の目次を作りました
説明がヘタなので現物を操作しながら(サンプルを解凍後実行しながら)、IE操作の三流解説を読んでください(百聞は一見に 〜 って感じでお願いします)
Form : データ登録サンプル[IE起動とデータセットのサンプル 20080527_IE_Form.zip]←Excel VBAです
ページ内 目次
操作対象 | 詳細と簡単な説明 |
↑みたいな感じで、入力用のFORMが作られています。 |
データ登録処理の単純なパターンとして、1.入力ページを開く 2.データをセットする 3.登録や送信ボタンを押す の順番で処理を走らせます。 1.入力ページを開く [IEの起動] : CreateObject("InternetExplorer.application")でブラウザを起動させました [.Navigateで開く] : 次に目的のページを開くために.Navigateメソッドでページを移動しました ページの表示を待つために、[.Busy と .ReadyState]を見て表示の完了を待ちました。 2.データをセットする <INPUT TYPE="TEXT" : 表示されたFormのMEMOにデータを代入します。[テキストを代入する] で 軽くデータセットの実検を行いました。objIE.Document.Forms(0).Item("MEMO").Value = "こんな感じでデータセット可能"を実行してみました。 <INPUT TYPE="RADIO" : テキストをセットできたので、次はラジオボタンを選択してみます。まず[.Nameと.Value]を使い、テストで Forms(0) を For Eachで探り、.Nameと.Valueをテスト表示しました。目的のオブジェクトが見つかったら[.Checked = True]として、ラジオボタンを選択状態にしました。 別件・別操作として、単純にオブジェクトを見つけて[.Click メソッド]でオブジェクトをクリックして押すこともできます。 3.登録や送信ボタンを押す データが無事?にセットできたので、[.Submitメソッド] で送信してみます。と言ってもデータセット後にobjIE.Document.Forms(0).Submitの1文を実行しただけです(オイオイ) |
SELECT と option で選択する
|
ドロップダウン▼の選択 [SELECT OPTION 選択] : FORM SELECT OPTION の攻略(選択)サンプル [Option .Selected] : 選択なので単純に Optionタグを探しOptionタグ.Selected = Trueをセットしました。 [Select .Value] : もっと素直になって 選択したい値がわかっているのでSELECTタグ.Value = 選択したい値でセットしました。 |
FORM SELECT Size=n行 Multipleで複数選択が可能なOPTION
|
リストボックス複数選択 [SELECT 複数OPTIONの選択] : SELECT Size=nで複数表示されたリストボックスから、Ctrl+クリックで複数のOPTIONデータを選択する方法 [.tags("OPTION")で探す] : 該当するOPTIONのデータを探したかったので、For Each objOPTION In objIE.Document.tags("OPTION")で選択データを探しobjOPTION.Selected = Trueを複数セットしました。 |
チェックボックス 2パターン NAME="xxxx"が個々に違う 表示したい・区分をチェックしてから検索ボタンを押してください<br> <INPUT TYPE="CHECKBOX" NAME="ASP">ASP<br> <INPUT TYPE="CHECKBOX" NAME="VBA">VBA<br> <INPUT TYPE="CHECKBOX" NAME="24H">コンビニ系<br> <INPUT TYPE="CHECKBOX" NAME="GUCHI">愚痴系<br> NAME="XXXX"が違うパターンです NAME="xxxx"が同じでValue="zzzz"が違う <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="ASP">ASP<br> <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="VBA">VBA<br> <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="24H">コンビニ系<br> <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="GUCHI">愚痴系<br> NAME="XXXX"が同じでVALUE="ZZZZ"が違うパターンです |
[□レ チェックボックス] : まず、実際のINPUT TYPE="CHECKBOX"のパターン2つ(HTML FORM)を抜き出しました。 [.Checkedを付ける] : Name="XXXX"が個々に違う場合(CHECKBOXに1つ1つ別の名前が付いている場合)、入力フォームを表示してから、素直に Document.Forms(0).Item("名前")でオブジェクトが特定できるので、あとは.Checked = Trueで選択状態にしました。objIE.Document.Forms(0).Item("VBA").Checked = Trueみたいな感じで意外と簡単でした。 [.Valueで探す] : 次に、CHECKBOXのName="XXXX"が同じでValue="ZZZZ"が違う入力フォームの場合、.Valueで判断してから、.CheckedをTrueにしました 補足・蛇足?[Document.getElementsByNameで探す] : Name="XXXX"がわかっているなら、便利な取得方法があって、Document.getElementsByName("名前")で指定した名前(.Name)のオブジェクトを取り出せます。 |
下記のように<FORM>〜</FORM> が 無く、ボタンのonclickイベントでJavaScriptを起動しています。
↓htmlソース <p>フォームの外のボタンを押すテスト</p> <hr> <INPUT type="button" name="btop" value="三流君Topへ" onclick="IE_JUMP('www.ken3.org')"><br> <INPUT type="button" id="idvba" value="VBA解説" onclick="IE_JUMP('www.ken3.org/vba/')"><br> <INPUT type="button" value="ASP解説" onclick="IE_JUMP('www.ken3.org/asp/')"><br> <INPUT type="button" value="IE操作解説" onclick="IE_JUMP('www.ken3.org/cgi-bin/group/vba_ie.asp')"><br> <hr> ↑こんな感じでFORM無しのINPUT type="button"です。 |
ボタンを押す [Form外のボタンを押す(.Click)] : <Form>が無く<INPUT type="button" onclick="Javaで作った関数"> だけで作られたボタンを.Clickで押し JavaScriptを起動しました [名無しのボタンを押す(.Click)] : INPUT type="button" に name="名前"> と名前が付いていない場合、.Valueなど他の値を利用してオブジェクトを特定しで.Click操作したお話です |
私がIE操作、プロパティやメソッドを探る方法 を ネタばらしすると(はやいよ)、MSDNで探したりプログラムを途中で止めて オブジェクトの中身を直接見たりしています。
[三流君 が MSDN で InternetExplorer の 資料を探す]
↑上級者はここを先に見た方が良かったり?(ヘンテコな説明や動画を見るよりも こちらの方が近道かも)
と書きつつ、いきなり大切な読者様へ嘘つきました、最近はGoogleの検索を主に使っていたりします。検索のキーワードがなかなか思いつかないと思うので私のお気に入りのキーワードを紹介します。(読者の声:だったら先に書けよ↓)
[番外編 GoogleでoIE,objIE,WebBrowserをKeyWordにして検索]
↑MSDNの目次(頭)から探すのが大変なので、検索すると良いサンプルや数少ない解説ページに巡り逢えるかも、なんて自信をなくしつつも三流製 手前味噌のサンプルをどさくさに紛れて紹介します 過去記事のリンク→[過去のメルマガ] ← IE6時代のサンプルですが何かの役に立つと願いつつ・・・
※時の流れはハヤク、あと少ししたら(まだまだ先だけどオオゲサに書いてみました)IE8がリリースされるのに、実はVista IE7に苦戦しています。(IE7を攻略する前にIE8になり、取り残されたりして・・・)
さて、IEを操作 Documentの森・WebBrowserの山を頼りないガイドの三流君と一緒にさまよってみましょうか!!!
このページ 三流プログラマー的解説がIE操作方法(プロパティやメソッド)の入り口として何かの参考・お役に立てれば幸いです。
はじめに(あいさつ?):インターネットエクスプローラーの操作と一口に言ってもイロイロな操作があると思います。
そのうちの一つが、あるホームページ(URL)を表示して、入力フォームにデータをセットして登録ボタンを押す、この一連の流れをVBA上から行いたい・・・と日本語で書くのは簡単なんだけど、この流れをプログラムで記述してみたいと思います
初めの一歩・とっかかりとして、隣のメルマガ([ASPで遊ぶ])の宣伝を兼ねて(オイオイ) ASPとMDBで作ったデータ入力フォームにデータをセットしてみたいと思います。
VBAから、IEの入力フォームを操作する・・・と簡単に書いてますが、どこから手を付けるか、、、ですよねぇ。
まずは敵(ターゲット)を知る 事前準備からかな。
深呼吸して心を落ちつかせます(別にもともと落ち着いてるって?)
自動化の前に手動で、操作したいホームページを自分で(手作業で)操作して、処理のイメージをつかみます。
今回のターゲット → [http://www.ken3.org/cgi-bin/test/test029-2.asp]を開いて、手動でデータを入力したり、ボタンを押して、動きをチェックします
手動で操作のイメージを軽く頭に入れたら、
次に、文章(htmlなど)のソースを表示して<form>の中身を確認します。
いきなり、中身とかソースとか言われてもなぁ・・・頭の中?だらけだよ。
あっ、すいません、自分だけわかってて相手のこと考えて無くて。
目的の入力フォームの構造が知りたいので、
目的のページを表示後、
表示--ソースとするとhtmlやcgiの中身を手作業ですが確認できます。
[ソースの確認画面イメージ] ← 単純にIEのメニューから表示させているだけですが
※↑フレームやJavaScriptで細工されたページ、文字コードが違って化け文字になっている・・・など簡単に表示できない場合もありますが
繰り返すと、
・手作業で自動化したい操作を行ってみる。
・ソースを表示して、入力フォームや構造のチェックに使う準備をする
まずは、この2点です。
今回は、よくあるデータ登録で、テキストボックスにデータを入力して、データ送信(Submitボタン)処理を行ってみます。
Formのデータ登録サンプル:[IE起動とデータセットのサンプル 20080527_IE_Form.zip]←Excel VBAです
↑保存後、実行しながら下記の解説を読んでみてください。
今回のターゲット(操作場所)は [http://www.ken3.org/cgi-bin/test/test029-2.asp] です。下記のような単純な入力フォームです。
データを入力して下さい。 感想を書き込んでください。 ↑実際に入力したり、まずは手動で動かしてみてください。 |
←のソース↓下記、ターゲットの文章(test029-2.asp)から抜き出した<form>の中身(ソース)です。
↑みたいな感じで、入力用のFORMが作られています。 |
最近の若者は仕様書くれとうるさいので(オイオイ)
手作業の操作をただ箇条書きにした流れを書いて渡してあげた(架空の話です、現実では通用しないのでくれぐれもマネなどせぬように...)
手動で操作した時の操作を今一度思い出してください。
まず、コンピュータの電源を入れて、ログインする(ここからやるの?)
・インターネットエクスプローラーを起動して、
・URLを入力 目的の文章・ページを表示させる(ショートカットやお気に入りの人も居るかなぁ)
・入力フォーム(画面の表示)を目で確認
・マウスやキーボードを使って入力エリアへデータをセットする。(データの入力)
・書 込(送信ボタン) を 押す
だいたいこんな感じかな。
そんなの言われなくてもわかってんだよ、しつこいなぁ、ハヤク コードの解説始めろよ※クドクてシツコイ男は嫌われるぞ
最近流行の 高級料亭でも行っている料理の使い回し じゃないけど、解説の使い回しで、
[IEの起動] : CreateObject("InternetExplorer.application")でブラウザを起動させました
[.Navigateで開く] : 次に目的のページを開くために.Navigateメソッドでページを移動しました
上記を参考に(って言っても、URLが変わっただけですが)
|
次は、
・入力フォーム(画面の表示)を目で確認
です。コンピューターに目は付いていないので、IE Document.プロパティの値(状態変化)で判断します。
なぜ、表示完了を待つかと言うと、いきなり入れるとイタイでしょ?(オイオイ、何言ってんだおっさん)
表示待ちを入れないで いきなりオブジェクトに触りに行くと(フォームなどのオブジェクトにアクセスすると) 相手の心の準備ができていないみたいで(オブジェクトの展開処理が間に合わないみたいで)、どこ触ってんだよと怒られるじゃなかった、 実行時エラー Document メソッドは失敗しました ・・・など、エラーで怒られるんですよ。
エラーの画像→[http://ken3-info.blog.ocn.ne.jp/screen/2007/05/ie__debe.html]
なので、objIE.Navigate 後に相手の準備ができるが確認します。
いろいろな調理方法(待ち方)があるのですが、ここも私の好きな調理方法を紹介します(三流的手法を押しつけます)。
読者の声:Application.Wait Time:=Now + TimeValue("00:00:05") '5秒間待つとか秒数を増やす手抜きなんだろ?
ギク、、今回は少しまともな方法を使います、判断によさそうなプロパティが2つあるので、.Busy と .ReadyState の状態を見て読み込み完了を判断してみます。
1つ目の判断材料が.ReadyStateです。
MSDNの[.ReadyState http://msdn2.microsoft.com/en-us/library/aa752066.aspx]←を見ると、
Enum READYSTATE READYSTATE_UNINITIALIZED = 0 READYSTATE_LOADING = 1 READYSTATE_LOADED = 2 READYSTATE_INTERACTIVE = 3 READYSTATE_COMPLETE = 4 End Enum
2つ目の判断材料が.Busyです
MSDNで.Busy プロパティ→[.Busy http://msdn2.microsoft.com/en-us/library/aa752050.aspx]を見ると
True or False なので、
Busy(忙しい?) True→忙しい、動いてる False→ヒマ、止まっている
単純に、objIE.Busy = Trueの間、ループで待ってみますか。
材料がそろったので、調理してみたいと思います。
|
次の工程は、
・マウスやキーボードを使って入力エリアへデータをセットする。(データの入力)
です
※指定したURLを開き、相手の受け入れ準備も確認できたので、次はWeb上の入力フォームにデータを挿入してみたいと思います。
入力したいinputエリアは、
<INPUT TYPE="TEXT" NAME="MEMO" SIZE=20><br>
の部分です。
name=XXXX(NAME="MEMO")と定義されてます。
このnameを利用してオブジェクトを表現するには、どうするのだろう?
先走らないでここで深呼吸、一呼吸おいて(何事もあせっちゃダメよ落ち着いてね!!)
見慣れたExcelの例だと ブック・シート・セルへデータをセットする場合、下記のように
シート--範囲
Sheets("Sheet2").Range("B3") = "B列3行目です"
や
シート--セル(y,x)
Sheets("Sheet3").Cells(5, 4) = "y,x 5行目の4列です"
Sheets(シート名).Rangeや.Cellsでオブジェクトへアクセスしていると思います。
Htmlの入力フォームの場合、オブジェクトの階層構造が
IEアプリ--ドキュメント--フォーム--アイテム(項目)
で表すことができるので(ほかにも表現方法はあるのですが今回はこれで)
objIE.Document.Forms(0).Item("MEMO").Value = 値
htmlドキュメント フォーム(0番目) アイテム(名称:MEMO)に転記(代入)する。って感じです。
※今回Formに名前Name=が付いてるので、objIE.Document.Forms("inputTEST").Item("MEMO").Value = 値 のほうが.Forms(0)で0番目のフォームよりもカッコいいんだけど・・・(Formに名前がない場合が多いので、.Forms(0)を先にやらせてください)
下記のような感じでデータをFormのMEMOにセットすることができます
|
次の工程は
・書 込(送信ボタン) を 押す
です
挿入(データをフォームにセット)できたら、次は、送信ボタン(書込や投稿)を押したいですよね・・・
実は、単純に該当フォームを.Submitなんてメソッドで できちゃったりするんですよ。
※オブジェクト.動作(メソッド) ってイメージかなぁ。
objIE.Document.Forms(0).Submit
こんな1行で、送信処理(書込や投稿)ができてしまいます。
データセット後にobjIE.Document.Forms(0).Submitを実行してみます。
|
読者の声:だからさっきから質問してるでしょ、.Submit ? Form ? F1押して表示されるExcel VBAのヘルプにそんなの一言も載ってないよ、データセットの件、なんとなくわかってきたけど、自分でも調べてみたいし、どこで調べるんだよ??
あっ、これですか・・
英語だけどMSDNの下記の項目を見るとオブジェクトの階層構造がわかりやすいと思います。
Reference for Visual Basic Developers [http://msdn.microsoft.com/en-us/library/aa752043.aspx] が 一覧で、その 下に、
document Object [http://msdn.microsoft.com/en-us/library/ms531073.aspx] をクリック 後に、
Collections を探っていくと、
forms Collection [http://msdn.microsoft.com/en-us/library/ms537457.aspx] オブジェクトがあります。
やっとFormまでたどり着けたので、
次に FORM Element | form Object [http://msdn.microsoft.com/en-us/library/ms535249.aspx]
のメソッドの中に
submit [http://msdn.microsoft.com/en-us/library/ms536771.aspx] があります。
※なかなか、探るのが大変ですが私も[三流君 が MSDN で InternetExplorer の 資料を探す]←みたいな非効率的な探し方をしたり、効率的に同じ処理を探すために検索に頼って[番外編 GoogleでoIE,objIE,WebBrowserをKeyWordにして検索]←みたいにして探ってます
次は、ラジオボタン(INPUT TYPE="RADIO")を選択してみたいと思います。ラジオボタン選択後、テキストボックスにデータを入力して、書込ボタンを押す、そんな処理を行ってみます。
今回も前回同様(操作場所)は [http://www.ken3.org/cgi-bin/test/test029-2.asp] です。下記のような単純な入力フォームで メルマガ区分の4種類ラジオボタンを選択してみます。
データを入力して下さい。 感想を書き込んでください。 ↑実際に入力したり、まずは手動で動かしてみてください。 |
←のソース↓下記、ターゲットの文章(test029-2.asp)から抜き出した<form>の中身(ソース)です。
↑みたいな感じで、入力用のFORMが作られています。 |
最近の若者は仕様書くれとうるさいので(マダ言ってるよいい加減にしろよ)
手作業の操作をただ箇条書きにした流れを書いて渡してあげた(架空の話です、現実では通用しないのでくれぐれもマネなどせぬように...)
※読者からのクレーム(神の声):だったらマネできる仕様書の書き方を教えろ・公開しろって感じなんだけど。(三流作者:クレームは神の声です、検討します(←よく聞く検討しますの逃げ言葉・・・))
手動で操作した時の操作を今一度思い出してください。
・インターネットエクスプローラーを起動して、[IEの起動]
・URLを入力 目的の文章・ページを表示させる(ショートカットやお気に入りの人も居るかなぁ)[.Navigateで開く]
・入力フォーム(画面の表示)を目で確認[.ReadyStateと.Busyで待つ]
・ラジオボタンを選択する。(目的の区分を選択する)※今回の目的
・マウスやキーボードを使って入力エリアへデータをセットする。(データの入力)[Input TEXTにデータをセット]
・書 込(送信ボタン) を 押す[.Submitで送信処理]
だいたいこんな感じかな。
そんなの言われなくてもわかってんだよ、しつこいなぁ、ハヤク コードの解説始めろよ※クドクてシツコイ男は嫌われるぞ
IEの起動 と ページの表示ができたら、ラジオボタンの選択を行いたいと思います。
ソースを見ると、<INPUT TYPE="RADIO"で名前もNAME="KUBUN"で一緒、VALUE=と値だけが違います。
HTML タグなどで表現された文章、タグが階層構造になっているとか言ってました。FORMも文章の一部で、その中(<FORM>〜</FORM>まで)のイロイロなタグによって構成されています。
だから何?
えっと、Formの構成要素を1つ1つ取り出してみます。
For Each objTAG In objIE.Document.Forms(0)で1つ1つ要素をobjTAGに入れて、.Value , .Name を表示させてみました。
|
オブジェクトをどうにか特定できそうなので、実際にチェックしてみたいと思います。
名前(.NAME) が KUBUN
で
値(.Value) が VBA
のオブジェクトの.CheckedプロパティをTrueにしてみます。
For Each objTAG In objIE.Document.Forms(0) で回して、単純にIF文で .Name=KUBUN .Value=VBAを判断後、.Checked=Trueにしてみました。
|
プログラミングの面白さって、同じ結果を得るのにイロイロな書き方があるって所ですよね。まぁ、回答が1つじゃないので個性が出たり、書き方の好き嫌いでもめたりするんだけどね。。。(読者の声:そんな無駄話はいいから、簡単な近道があるなら寄り道しないで教えろよ)
えっと、ラジオボタンの.CheckedプロパティにTrueをセットして選択したのですが、別の方法があって、オブジェクトに対してクリックする、.Clickメソッドを発行する、そんな方法もあります。
簡略仕様書(いつもの使えない箇条書き仕様書)
1.InputBoxで上司・先輩への愚痴を文字列で受け取ります
2.次にIEを起動してWebページを開き
3.フォームの名前がinputTESTのHTML Formに対して以下の処理を行え
ア..Name(名前)=KUBUN,.Value(値)=GUCHIのオブジェクトを.Click(クリック)
イ..Name(名前)=MEMOのオブジェクトに入力文字列をセット
ウ. .Name(名前)=btnSUBMITのオブジェクトを.Click(クリック)
|
関連項目:[HTML入力フォーム外側のボタンを押す .Click]
(過去のメルマガ)[No.148 IE ラジオボタン(RADIO)の.Checkedと.Clickの違い]
今回は、データの選択方法でよく見かける SELECT OPTION の選択処理を行ってみます。
リストから1つのOPTIONを選択する場合▼の ドロップダウン パターン
と
リストからCtrlキーを押して複数選択可能な[SELECT 複数OPTIONの選択] パターン リストボックスのイメージかな?
の2つがあると思います。
まずは、OPTIONを単独で選択する場合を攻略したいと思います。今回のターゲット(操作場所)は [http://www.ken3.org/cgi-bin/test/test092-2.asp] です。下記のような選択(SELECT OPTION)です。
↑実際に入力したり、まずは手動で動かしてみてください。 |
←のソース↓下記、ターゲットの文章(test092-2.asp)から抜き出した<form>の中身(ソース)です。
↑みたいな感じで、入力用のFORM 選択(SELECT OPTION)が作られています。 |
手間だけど、Form下のオブジェクトを表示させて探ってみますか。
下記、単純にページを表示させ、手抜きでForm(0)の下、オブジェクトをシートに書き出してみました。
|
For Each objTAG In objIE.Document.Forms(0) だと、<Option>へ たどり着けなかったので、For Each objTAG In objIE.Document.Forms(0).Allと.Allを付けて探ってみました。
Sub ie_Forms_Input_Select_002() 'Form(0).Allの下、構成要素を1つ1つ取り出す '調査するURLをInput Boxでもらう Dim strURL As String '調査したいURL strURL = InputBox("調べたいURL", "URL", "http://www.ken3.org/cgi-bin/test/test092-2.asp") Dim objIE As Object 'IEオブジェクト参照用 'IEを起動する Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る objIE.Visible = True '見えるようにする(お約束) '.Navigate で 指定したURLを開く objIE.Navigate Trim(strURL) '念のため左右の空白を取ってから、.Navigateに渡す 'ページが表示される 完了を待つ While objIE.ReadyState <> 4 'READYSTATE_COMPLETE = 4 While objIE.Busy = True DoEvents '特に何もしないで.Busyの状態が変わるまで待つ Wend Wend '※FORM(0).Allの下 オブジェクトを1つ1つ表示してみた Dim i As Integer 'カウンター Dim objTAG As Object 'タグのオブジェクト格納用 Workbooks.Add 'テスト用の新規ブックを追加 Range("A1") = "NO.i番目" '見出しのセット Range("B1") = "TypeName関数の結果" Range("C1") = ".TagName タグの名前" Range("D1") = ".OuterHTML 外側含むHTML" Range("E1") = ".Value 値" Range("F1") = ".Name 項目に付けた名前" Columns("A:G").ColumnWidth = 20 '列幅を20に変更 'Form(0).AllのオブジェクトをFor Each で書き出す i = 0 For Each objTAG In objIE.Document.Forms(0).All 'データをセルへセットする Cells(i + 2, "A") = i 'i番目 結局iは使うのかよ(笑) Cells(i + 2, "B") = "'" & TypeName(objTAG) 'TypeNameでオブジェクトのタイプを表示 Cells(i + 2, "C") = objTAG.TagName 'タグの名前 Cells(i + 2, "D") = "'" & Left(objTAG.OuterHTML, 512) 'HTML 頭から512文字だけ書く '※タグの名前がSELECTかOPTIONの時だけ値を書く(FONTタグなど値や名前を持たないタグがあるので) If objTAG.TagName = "SELECT" Or objTAG.TagName = "OPTION" Or objTAG.TagName = "INPUT" Then Cells(i + 2, "E") = objTAG.Value '値 End If '※タグの名前がSELECTかINPUTの時だけ名前を書く(FONTタグなど名前を持たないタグがあるので) If objTAG.TagName = "SELECT" Or objTAG.TagName = "INPUT" Then Cells(i + 2, "F") = objTAG.Name '名前 End If i = i + 1 'インクリメント Next End Sub |
For Each objTAG In objIE.Document.Forms(0).All のループで、OPTIONを取り出せたので、値(.Value)がVBAのオブジェクトを選択(.Selected=True)してみます。
|
んっ、↑で、Document.Forms(0).All のループで回してとか言ってたけど、その前に<OPTION>は<SELECT>〜</SELECT>の中だからか?なんて言ってたよね。
はい、言ってたよ。それが何か?
何かじゃねぇダロ、選択させる値が<SELECT>〜</SELECT>の中なら初めから、<SELECT>のタグに、.Valueに値をセットしてみたら?<OPTION>を探して.Selected=Trueなんてやってられるか
、、ってことで実際にやってみました。
|
関連項目:値を直接セットできるなら、(過去のメルマガ)→ [No.154 IE SELECTタグの選択 .SelectedIndex=nで選択] も、必要なかったか・・・次に説明しようとしたのに。。。
じゃなくて屁理屈をこねると、値を変えただけだとJavaScriptのイベントが発生しないので、(過去のメルマガ)→[No.155 IE SELECT後 .fireEventでJavaScriptのイベントを起動]みたいなことが必要だし、<OPTION>を探して.Selected=Trueの応用で、探した<OPTION>を.ClickすればJavaScriptも起動する(過去のメルマガ 例はラジオボタンの.Checkedだけど)→ [No.148 IE ラジオボタン(RADIO)の.Checkedと.Clickの違い ] ってことで、<OPTION>タグを1から探す方法も無駄じゃない・・と、かなりの行数をかけて力説してみました。(読者の声:※素直にあやまればいいのに、屁理屈言って粘る 謝らないプログラマーっているよね。実力が三流のクセにプライドだけは一流ぶってるヤツ、えっ私Ken3のこと?(笑))
上で単独のOPTION選択を行ったので、次は、SELECT Size=nで複数表示されたリストボックスから、Ctrl+クリックで複数のOPTIONデータを選択する方法を探ってみたいと思います。
今回のターゲット(操作場所)は [http://www.ken3.org/cgi-bin/test/test093-5.asp] です。下記のようなリストボックスで複数選択可能なSELECTタグとOPTIONタグです。
FORM リストボックスの複数選択(selectタグ multiple で VALUE=を個別に作成) ↑実際に入力したり、まずは手動で動かしてみてください。 |
←のソース↓下記、ターゲットの文章(test093-5.asp)から抜き出した<form>の中身(ソース)です。
↑みたいな感じで、入力用のFORM 選択(SELECT OPTION)が作られています。 |
複数でも単独と同様、OPTIONの選択は.Selected = Trueかな。
単独のOPTION選択の時、[Option .Selected]で単純に For Each objTAG In objIE.Document.Forms(0).Allでループして.TagNameでOptionタグを探しOptionタグ.Selected = Trueをセットしました。
今回、同じだとつまらないので、少し変えてみます。.Allで指定したタグを抜くことが可能な、[.tags("タグの名称")]を使って、
For Each objTAG In objIE.Document.Forms(0).All.tags("OPTION")でFormからOPTIONのみを抜き、
値をチェック .Value="VBA" なら.Selected = True
と
表示文章(TEXT)の値 .InnerTEXT="愚痴系(GUCHI)" なら同じく.Selected = True
値とテキストをみて判断してみます。(※↑.InnerTEXTで見えているリストの文章を選択するのもアリかなぁ。)
|
できれば、複数選択も値の代入だけですましたかったんだけど・・・これもいつもの調査中で逃げてるって感じですね。(時間を作って、壁に立ち向かわないとダメですね)
フォームのチェックボックス INPUT TYPE="CHECKBOX"を操作します。
おおまかなタイプは2つあって、NAME="オブジェクト名"が個々に違う場合と、NAME="オブジェクト名"が同じでValue="識別する値"で区別しているパターンです。
読者の声:何言ってるのかわからない、意味不明、日本語でお願いします。。。
日本語かぁ・・・自信がないので下記にHTML言語を書きます(HTML言語で話します)
INPUT TYPE="CHECKBOX"の2パターン
NAME="xxxx"が個々に違う | NAME="xxxx"が同じでValue="zzzz"が違う |
Formの場所[test093-2.asp]↓入力イメージ ↑のHTMLソース↓ <FORM ACTION="test093-2.asp" METHOD="POST"> <font color="blue">CHECKBOX NAME=を個別に作成 Where句を作成するTEST</font><br> 表示したい・区分をチェックしてから検索ボタンを押してください<br> <INPUT TYPE="CHECKBOX" NAME="ASP">ASP<br> <INPUT TYPE="CHECKBOX" NAME="VBA">VBA<br> <INPUT TYPE="CHECKBOX" NAME="24H">コンビニ系<br> <INPUT TYPE="CHECKBOX" NAME="GUCHI">愚痴系<br> <INPUT TYPE="submit" VALUE="検索する"> </FORM> NAME="XXXX"が違うパターンです |
Formの場所[test093-4.asp] チェックボックス↓入力フォーム ↑のHTMLソース↓ <FORM ACTION="test093-4.asp" METHOD="POST"> <font color="blue">FORM CHECKBOX VALUE=を個別に作成 Where句を作成するTEST</font><br> 表示したい・区分をチェックしてから検索ボタンを押してください<br> <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="ASP">ASP<br> <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="VBA">VBA<br> <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="24H">コンビニ系<br> <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="GUCHI">愚痴系<br> <INPUT TYPE="submit" VALUE="検索する"> </FORM> NAME="XXXX"が同じでVALUE="ZZZZ"が違うパターンです |
Name="XXXX"が個別に違う場合は、素直に名前で目的のオブジェクトへアクセスできるので、
オブジェクト.Checked = Trueでチェックボックスにチェックを入れてみます
Name="VBA"とName="24H"にチェックを入れてみます。
|
次に、CHECKBOXのName="XXXX"が同じでValue="ZZZZ"が違う入力フォーム
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="ASP">ASP<br>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="VBA">VBA<br>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="24H">コンビニ系<br>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="GUCHI">愚痴系<br>
の場合、フォームのオブジェクトを1つ1つみて、.NameがKUBUNで.Valueが目的の値で判断してから、.CheckedをTrueにしてみます。
KUBUN が ASP,VBA,24Hの3つにチェックを入れる
|
上のチェックボックスの判断で、名前(.Name)と値(.Value)を判断したかったので、
For Each objTAG In objIE.Document.Forms(0) で ループを作り、
If objTAG.Name = "KUBUN" Then で 名前が KUBUN かみて
さらに If objTAG.Value = "ASP" Then で値を判断しました。
動いているので、これはこれで正解なのですが(動いているソースをイジルなってプログラマーの格言?もあるんだけど)、指定した名前を取り出す方法があったりします。
文章から指定したタグのオブジェクトを抜く時に、document.all.tags("タグの名前")で指定したタグを抜き出せました→[.tags("タグの名称")]
これに近い命令があって、
document.getElementsByName("名前(Nameの値)")
なんて感じで意外と簡単に取り出せたり。
てっことで、実際に.getElementsByNameを使ってみます
|
次は、<INPUT type="button" 〜 onclick="Javaで作った関数('パラメータ')"> で作られたボタンを.Clickで押し JavaScriptを起動してみたいとおもいます。Formに属さない無いボタンを押す、そんな処理を行ってみます。
テスト場所(操作場所)は [http://ken3-info.blog.ocn.ne.jp/test/2007/09/post_d21d.html] です。下記のように<FORM>〜</FORM> が 無く、ボタンのonclickイベントでJavaScriptを起動しています。 ↓htmlソース
<SCRIPT language="javaScript">
function IE_JUMP(s){
location.href=location.href='http://'+s;
}
</SCRIPT>
<p>フォームの外のボタンを押すテスト</p>
<hr>
<INPUT type="button" name="btop" value="三流君Topへ" onclick="IE_JUMP('www.ken3.org')"><br>
<INPUT type="button" id="idvba" value="VBA解説" onclick="IE_JUMP('www.ken3.org/vba/')"><br>
<INPUT type="button" value="ASP解説" onclick="IE_JUMP('www.ken3.org/asp/')"><br>
<INPUT type="button" value="IE操作解説" onclick="IE_JUMP('www.ken3.org/cgi-bin/group/vba_ie.asp')"><br>
<hr>
いままでの例だと 名前が付いていれば objIE.Document.Forms("フォームの名前").Item("ボタンの名前").Click や 名前が無くても番号で objIE.Document.Forms(0).Item(6).Click などFormオブジェクトの下を操作してました。
が、今回の文章(Document)には、<Form>がありません・・・
Formの下にINPUTのボタンが無いからってあわてないでよ。(読者の声:別にあわててないよ、疑問を聞いてるだけ)
<INPUT type="button" name="btop" value="三流君Topへ" onclick="IE_JUMP('www.ken3.org')"><br>
のボタンを押したい場合、名前がname="btop"と付いているので、
Document.all("btop").Click
↑こんな感じで、.all("名前")で目的のオブジェクトを指定することができます。
※余談:いつものFormアリ 属したボタン objIE.Document.Forms("フォームの名前").Item("ボタンの名前").Click 操作 を objIE.Document.All("ボタンの名前").Click と書くことも名前が重複していなければできたりします。全体allから名前でオブジェクトを特定することもできます。
話を戻して、Document.all("btop").Clickでクリックできるか、テストしてみます。
|
ボタンにName=で名前が付いてればいいけど、
<INPUT type="button" value="ASP解説" onclick="IE_JUMP('www.ken3.org/asp/')"><br>
<INPUT type="button" value="IE操作解説" onclick="IE_JUMP('www.ken3.org/cgi-bin/group/vba_ie.asp')"><br>
上記INPUTのボタンは、ボタンにName=名前が付いてないよ。お手上げでしょ?
名前がなければ素直にあきらめるのかい?名前が付いていなくても あのお店・店員の中で地下の食品売り場の背が高くて痩せ型の男性やいつも元気で笑顔がステキな女性など、特定方法はいくらでもあるダロ(読者の声:また違う方向に話が進んでるよ、まじめに解説しろ)
文章から表・テーブルデータを抜くときに、document.all.tags("タグの名前")で指定したタグを抜き出してたよね→[.tags("タグの名称")]
これ(.tags)を利用して、.tags("Input")で、INPUTを抜き、<INPUT type="button" value="IE操作解説" onclick="IE_JUMP('www.ken3.org/cgi-bin/group/vba_ie.asp')"><br>
取り出したINPUTの.Valueがvalue="IE操作解説"か判断してみます
ボタンの名称が(.Valueが) IE操作解説のボタンを押すサンプル
For Each objINPUT In objIE.Document.all.tags("INPUT")でINPUTを抜き出して、ボタンの名称をobjINPUT.Value = "IE操作解説"で判断して、見つかったらそのオブジェクトをobjINPUT.Clickしました。
|
余談:間違っても客先や派遣先で名前がわからないからって、胸の大きいな女性に説明しましたとか、とんでもない発言を客先担当者(納品先の課長)に言っちゃイケマセンよ(あの頃は若かったなぁ それで次の仕事が来なかったのか って、誰の失敗談だよ) じゃなくて、少々パターン違いの 逆にName=砂糖さん と名前が同じ場合もあったり、過去のメルマガ → [No.176 VBAからIE操作 NAMEが同じフォームの項目へデータをセットする] も参考にしてください。※逆の立場で自分が派遣で来ているデブ プログラマーとか社員さん達に言われたらと思うとかなり反省(オイオイ)
まだまだ、書かないといけないForm操作 プロパティやメソッドなどの組み合わせがあるのですが、このあたりで逃げるように失礼します(オイオイ)。更新が遅いけど温かく見守ってください 更新中 まだまだ書きかけ
いろいろな表現があって、かえって迷ってしまうかもしれませんが、数をこなすと見えてくるので、私のサンプルだけじゃなく、いろいろなサンプルを探して見てください。[番外編 GoogleでoIE,objIE,WebBrowserをKeyWordにして検索]にお勧めのキーワード検索方法を載せてます
ここまでのサンプル Formのデータ登録サンプル:[IE起動とデータセットのサンプル 20080527_IE_Form.zip]←Excel VBAです
保存後、解凍して、テストしてみてください。
せっかくホームページに来ていただいたのに、検索の紹介 ぉぃぉぃ
サイト指定や期間の指定を組み合わせて実行してみてください。
ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOPへ)] / [VBAで楽しく] / [記事一覧] |
カスタム検索
|