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のフォーム操作 Document.Formsを操作する

[三流君VBAでIEを操作・IEの制御]から、Formの操作部分を抜き出しまとめてます。InternetExplorer WebBrowser の Document.Formsを操作してみたいと思います。なかなかのジャジャ馬で制御するのが難しいんだけど・・・

デバック風景

こんな感じ↓で、デバックしていたり(笑)

ソースと簡単な解説は[IE操作 Name=が同じデータを(n)で処理とFormsを指定して処理]を見てください

目次

ページ内が無駄に長いので、ページ内の目次を作りました
説明がヘタなので現物を操作しながら(サンプルを解凍後実行しながら)、IE操作の三流解説を読んでください(百聞は一見に 〜 って感じでお願いします)
Form : データ登録サンプル[IE起動とデータセットのサンプル 20080527_IE_Form.zip]←Excel VBAです

ページ内 目次
操作対象詳細と簡単な説明
<FORM ACTION="test029-2.asp" METHOD="POST" NAME="inputTEST" id="test029">
  <INPUT TYPE="HIDDEN" NAME="NO" VALUE="0">
  <b>メルマガ区分選択:</b><br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="ASP" CHECKED>ASPで遊ぶ、失敗する<br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="VBA" >VBAで楽しく<br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="GUCHI" >愚痴系メルマガ<br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="24H" >コンビニのオモテとウラ<br>
  <b>感想:</b>
  
  <INPUT TYPE="TEXT" NAME="MEMO" SIZE=60 VALUE="VBA IE TEST"><br>
  <br>
  <INPUT TYPE="SUBMIT" NAME="btnSUBMIT" VALUE="書 込">
  <INPUT TYPE="RESET" NAME="btnRESET" VALUE="クリア">
</FORM>

↑みたいな感じで、入力用の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 name="KUBUN">
   <option value="">全てのデータ</option>
   <option value="ASP">ASPのデータ</option>
   <option value="VBA">VBAのコメント</option>
   <option value="GUCHI">愚痴系</option>
   <option value="24H">24Hコンビニ</option>
</SELECT>
ドロップダウン▼の選択 [SELECT OPTION 選択] : FORM SELECT OPTION の攻略(選択)サンプル
[Option .Selected] : 選択なので単純に Optionタグを探しOptionタグ.Selected = Trueをセットしました。
[Select .Value] : もっと素直になって 選択したい値がわかっているのでSELECTタグ.Value = 選択したい値でセットしました。
FORM SELECT Size=n行 Multipleで複数選択が可能なOPTION
<SELECT NAME="KUBUN" SIZE="5" multiple>
 <option VALUE="ASP">ASP 感想(ASP)</option> 
 <option VALUE="VBA">VBA 感想(VBA)</option> 
 <option VALUE="24H">コンビニ系(24H)</option> 
 <option VALUE="GUCHI">愚痴系(GUCHI)</option> 
</SELECT><br>
リストボックス複数選択 [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操作方法(プロパティやメソッド)の入り口として何かの参考・お役に立てれば幸いです。


[#Document_Froms][ページ内のTOPへ戻る]

HTML入力フォームをさわる(FORMオブジェクトにアクセス)

はじめに(あいさつ?):インターネットエクスプローラーの操作と一口に言ってもイロイロな操作があると思います。
そのうちの一つが、あるホームページ(URL)を表示して、入力フォームにデータをセットして登録ボタンを押す、この一連の流れをVBA上から行いたい・・・と日本語で書くのは簡単なんだけど、この流れをプログラムで記述してみたいと思います

初めの一歩・とっかかりとして、隣のメルマガ([ASPで遊ぶ])の宣伝を兼ねて(オイオイ) ASPとMDBで作ったデータ入力フォームにデータをセットしてみたいと思います。


[#Look_Form_SRC][ページ内のTOPへ戻る]

事前準備

VBAから、IEの入力フォームを操作する・・・と簡単に書いてますが、どこから手を付けるか、、、ですよねぇ。
まずは敵(ターゲット)を知る 事前準備からかな。
深呼吸して心を落ちつかせます(別にもともと落ち着いてるって?)
自動化の前に手動で、操作したいホームページを自分で(手作業で)操作して、処理のイメージをつかみます。
今回のターゲット → [http://www.ken3.org/cgi-bin/test/test029-2.asp]を開いて、手動でデータを入力したり、ボタンを押して、動きをチェックします

手動で操作のイメージを軽く頭に入れたら、
次に、文章(htmlなど)のソースを表示して<form>の中身を確認します。
いきなり、中身とかソースとか言われてもなぁ・・・頭の中?だらけだよ。
あっ、すいません、自分だけわかってて相手のこと考えて無くて。
目的の入力フォームの構造が知りたいので、
目的のページを表示後、
表示--ソースとするとhtmlやcgiの中身を手作業ですが確認できます。
[ソースの確認画面イメージ] ← 単純にIEのメニューから表示させているだけですが
※↑フレームやJavaScriptで細工されたページ、文字コードが違って化け文字になっている・・・など簡単に表示できない場合もありますが

繰り返すと、
・手作業で自動化したい操作を行ってみる。
・ソースを表示して、入力フォームや構造のチェックに使う準備をする
まずは、この2点です。


[#Document_Forms_Submit][ページ内のTOPへ戻る]

データセットとデータ送信(Submitボタン)のサンプル

今回は、よくあるデータ登録で、テキストボックスにデータを入力して、データ送信(Submitボタン)処理を行ってみます。

Formのデータ登録サンプル:[IE起動とデータセットのサンプル 20080527_IE_Form.zip]←Excel VBAです
↑保存後、実行しながら下記の解説を読んでみてください。

今回のターゲット(操作場所)は [http://www.ken3.org/cgi-bin/test/test029-2.asp] です。下記のような単純な入力フォームです。
データを入力して下さい。
感想を書き込んでください。
メルマガ区分選択:
ASPで遊ぶ、失敗する
VBAで楽しく
愚痴系メルマガ
コンビニのオモテとウラ
感想:


↑実際に入力したり、まずは手動で動かしてみてください。
←のソース↓下記、ターゲットの文章(test029-2.asp)から抜き出した<form>の中身(ソース)です。
  <FORM ACTION="test029-2.asp" METHOD="POST" NAME="inputTEST" id="test029">
  <INPUT TYPE="HIDDEN" NAME="NO" VALUE="0">
  <b>メルマガ区分選択:</b><br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="ASP" CHECKED>ASPで遊ぶ、失敗する<br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="VBA" >VBAで楽しく<br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="GUCHI" >愚痴系メルマガ<br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="24H" >コンビニのオモテとウラ<br>
  <b>感想:</b>
  
  <INPUT TYPE="TEXT" NAME="MEMO" SIZE=60 VALUE="VBA IE TEST"><br>
  <br>
  <INPUT TYPE="SUBMIT" NAME="btnSUBMIT" VALUE="書 込">
  <INPUT TYPE="RESET" NAME="btnRESET" VALUE="クリア">
  </FORM>

↑みたいな感じで、入力用のFORMが作られています。
この入力フォームに対して、操作(データをセット)してみたいと思います。

箇条書きの仕様書 流れを書く

最近の若者は仕様書くれとうるさいので(オイオイ)
手作業の操作をただ箇条書きにした流れを書いて渡してあげた(架空の話です、現実では通用しないのでくれぐれもマネなどせぬように...)

手動で操作した時の操作を今一度思い出してください。
まず、コンピュータの電源を入れて、ログインする(ここからやるの?)
・インターネットエクスプローラーを起動して、
・URLを入力 目的の文章・ページを表示させる(ショートカットやお気に入りの人も居るかなぁ)
・入力フォーム(画面の表示)を目で確認
・マウスやキーボードを使って入力エリアへデータをセットする。(データの入力)
・書 込(送信ボタン) を 押す
だいたいこんな感じかな。
そんなの言われなくてもわかってんだよ、しつこいなぁ、ハヤク コードの解説始めろよ※クドクてシツコイ男は嫌われるぞ

IEの起動 と ページの表示

最近流行の 高級料亭でも行っている料理の使い回し じゃないけど、解説の使い回しで、
[IEの起動] : CreateObject("InternetExplorer.application")でブラウザを起動させました
[.Navigateで開く] : 次に目的のページを開くために.Navigateメソッドでページを移動しました
上記を参考に(って言っても、URLが変わっただけですが)
Sub ie_test029_open()  'test029-2.aspを開くテスト

    Dim objIE      As Object  'IEオブジェクト参照用
    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test029-2.asp"

End Sub
上記プログラムで、
・インターネットエクスプローラーを起動して、
・URLを入力 目的の文章・ページを表示させる(ショートカットやお気に入りの人も居るかなぁ)
ここまでの操作ができました。


[#Document_ReadyState_Busy][ページ内のTOPへ戻る]

.Busy と .ReadyState を見て 表示の完了を待つ

次は、
・入力フォーム(画面の表示)を目で確認
です。コンピューターに目は付いていないので、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

と、定義されています。このプロパティがREADYSTATE_COMPLETE = 4になるまで待てばいいのかな。objIE.ReadyState <> 4と直接値の4を書いて使っています。(参照設定して objIE.ReadyState <> READYSTATE_COMPLETEと書くときれいですよ)

2つ目の判断材料が.Busyです
MSDNで.Busy プロパティ→[.Busy http://msdn2.microsoft.com/en-us/library/aa752050.aspx]を見ると
True or False なので、
Busy(忙しい?) True→忙しい、動いてる False→ヒマ、止まっている
単純に、objIE.Busy = Trueの間、ループで待ってみますか。

材料がそろったので、調理してみたいと思います。
Sub ie_ReadyState_Busy_TEST()  '表示待ちのテスト

    Dim objIE      As Object  'IEオブジェクト参照用
    
    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test029-2.asp"

    '表示完了を待つ
    While objIE.ReadyState <> 4
        Debug.Print ".ReadyState = " & objIE.ReadyState
        Debug.Print ".Busy = " & objIE.Busy  'デバッグで文字を書く
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    Debug.Print ".ReadyState = " & objIE.ReadyState
    Debug.Print ".Busy = " & objIE.Busy  'デバッグで文字を書く
    
    MsgBox objIE.Document.Forms(0).OuterHTML 'テストでForm(0)のHTMLを表示
    
End Sub
単純に、
While objIE.ReadyState <> 4で4の完了以外を回し(4になるまで回し)
もう一つ内側のループで、While objIE.Busy = True (忙しいあいだ回る?)
で、表示を待ってみました。


[#Input_Text][ページ内のTOPへ戻る]

IEのdocumentオブジェクト formを使ってhtml入力フォームにアクセスする

次の工程は、
・マウスやキーボードを使って入力エリアへデータをセットする。(データの入力)
です
※指定した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にセットすることができます
Sub ie_Forms_DataSET()  'データセットのテスト

    Dim objIE      As Object  'IEオブジェクト参照用
    
    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test029-2.asp"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend

    'データをセットする
    'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する
    objIE.Document.Forms(0).Item("MEMO").Value = "こんな感じでデータセット可能"

End Sub
ポイントは、
Excelなら、アプリ -- ブック(Book) -- シート(Sheet) -- セル(Cells)
のオブジェクト階層が、
アプリ -- html(Document) -- フォーム(Form) -- 入力エリア(A INPUT)
objIE.Document.Forms(0).Item("MEMO").Value
みたいな感じです。


[#Input_Submit][ページ内のTOPへ戻る]

.Submit メソッドを使って フォームの送信動作

次の工程は
・書 込(送信ボタン) を 押す
です
挿入(データをフォームにセット)できたら、次は、送信ボタン(書込や投稿)を押したいですよね・・・
実は、単純に該当フォームを.Submitなんてメソッドで できちゃったりするんですよ。
※オブジェクト.動作(メソッド) ってイメージかなぁ。

objIE.Document.Forms(0).Submit
こんな1行で、送信処理(書込や投稿)ができてしまいます。

データセット後にobjIE.Document.Forms(0).Submitを実行してみます。
Sub ie_Forms_Submit()  'データセット後 Submitボタンを押す

    Dim objIE      As Object  'IEオブジェクト参照用
    Dim strCOMMENT As String  'コメントの入力
    
    '固定文字だとつまらないので、INPUTBOXで感想をもらう
    strCOMMENT = InputBox("何か一言コメントを入れてください")
    If strCOMMENT = "" Then
        MsgBox "何か文字を入れてくださいね"
        Exit Sub  '途中で抜ける
    End If
    Application.WindowState = xlMinimized  '入力後Excelを最小化、下に下げる

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "'http://www.ken3.org/cgi-bin/test/test029-2.asp"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    'データをセットする
    'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する
    objIE.Document.Forms(0).Item("MEMO").Value = strCOMMENT
    
    'フォーム(0番目)を .Submit(送信・投稿) する
    objIE.Document.Forms(0).Submit  '送信処理

End Sub
↑strCOMMENT = InputBox で入力させ、objIE.Document.Forms(0).Item("MEMO").Value = strCOMMENTで代入後に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にして検索]←みたいにして探ってます


[#Document_Forms_Radio][ページ内のTOPへ戻る]

ラジオボタン(INPUT TYPE="RADIO")を選択するサンプル

次は、ラジオボタン(INPUT TYPE="RADIO")を選択してみたいと思います。ラジオボタン選択後、テキストボックスにデータを入力して、書込ボタンを押す、そんな処理を行ってみます。

今回も前回同様(操作場所)は [http://www.ken3.org/cgi-bin/test/test029-2.asp] です。下記のような単純な入力フォームで メルマガ区分の4種類ラジオボタンを選択してみます。
データを入力して下さい。
感想を書き込んでください。
メルマガ区分選択:
ASPで遊ぶ、失敗する
VBAで楽しく
愚痴系メルマガ
コンビニのオモテとウラ
感想:


↑実際に入力したり、まずは手動で動かしてみてください。
←のソース↓下記、ターゲットの文章(test029-2.asp)から抜き出した<form>の中身(ソース)です。
  <FORM ACTION="test029-2.asp" METHOD="POST" NAME="inputTEST" id="test029">
  <INPUT TYPE="HIDDEN" NAME="NO" VALUE="0">
  <b>メルマガ区分選択:</b><br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="ASP" CHECKED>ASPで遊ぶ、失敗する<br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="VBA" >VBAで楽しく<br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="GUCHI" >愚痴系メルマガ<br>
  <INPUT TYPE="RADIO" NAME="KUBUN" VALUE="24H" >コンビニのオモテとウラ<br>
  <b>感想:</b>
  
  <INPUT TYPE="TEXT" NAME="MEMO" SIZE=60 VALUE="VBA IE TEST"><br>
  <br>
  <INPUT TYPE="SUBMIT" NAME="btnSUBMIT" VALUE="書 込">
  <INPUT TYPE="RESET" NAME="btnRESET" VALUE="クリア">
  </FORM>

↑みたいな感じで、入力用のFORMが作られています。
この入力フォームに対して、操作(データをセット)してみたいと思います。

箇条書きの仕様書 流れを書く

最近の若者は仕様書くれとうるさいので(マダ言ってるよいい加減にしろよ)
手作業の操作をただ箇条書きにした流れを書いて渡してあげた(架空の話です、現実では通用しないのでくれぐれもマネなどせぬように...)
※読者からのクレーム(神の声):だったらマネできる仕様書の書き方を教えろ・公開しろって感じなんだけど。(三流作者:クレームは神の声です、検討します(←よく聞く検討しますの逃げ言葉・・・))

手動で操作した時の操作を今一度思い出してください。
・インターネットエクスプローラーを起動して、[IEの起動]
・URLを入力 目的の文章・ページを表示させる(ショートカットやお気に入りの人も居るかなぁ)[.Navigateで開く]
・入力フォーム(画面の表示)を目で確認[.ReadyStateと.Busyで待つ]
・ラジオボタンを選択する。(目的の区分を選択する)※今回の目的
・マウスやキーボードを使って入力エリアへデータをセットする。(データの入力)[Input TEXTにデータをセット]
・書 込(送信ボタン) を 押す[.Submitで送信処理]
だいたいこんな感じかな。
そんなの言われなくてもわかってんだよ、しつこいなぁ、ハヤク コードの解説始めろよ※クドクてシツコイ男は嫌われるぞ


[#Input_Radio][ページ内のTOPへ戻る]

ラジオボタンの攻略方法を紹介する

IEの起動 と ページの表示ができたら、ラジオボタンの選択を行いたいと思います。

ソースを見ると、<INPUT TYPE="RADIO"で名前もNAME="KUBUN"で一緒、VALUE=と値だけが違います。


<INPUT TYPE="RADIO" NAME="KUBUN" VALUE="ASP" CHECKED>ASPで遊ぶ、失敗する<br>
<INPUT TYPE="RADIO" NAME="KUBUN" VALUE="VBA" >VBAで楽しく<br>
<INPUT TYPE="RADIO" NAME="KUBUN" VALUE="GUCHI" >愚痴系メルマガ<br>
<INPUT TYPE="RADIO" NAME="KUBUN" VALUE="24H" >コンビニのオモテとウラ<br>

このINPUT RADIO群をいろいろとさわって、選択状態 Checkedにしてみたいと思います。

準備と確認 FORMの構成要素をFor Eachで1つ1つ取り出してみた

HTML タグなどで表現された文章、タグが階層構造になっているとか言ってました。FORMも文章の一部で、その中(<FORM>〜</FORM>まで)のイロイロなタグによって構成されています。
だから何?
えっと、Formの構成要素を1つ1つ取り出してみます。

For Each objTAG In objIE.Document.Forms(0)で1つ1つ要素をobjTAGに入れて、.Value , .Name を表示させてみました。
Sub ie_Forms_Input_Radio_001()  'Form(0)の下、構成要素を1つ1つ取り出す

    Dim objIE      As Object  'IEオブジェクト参照用

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test029-2.asp"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    'データをセットする
    'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する
    objIE.Document.Forms(0).Item("MEMO").Value = "テスト中"
    
    '※FORM(0)の下 オブジェクトを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)のオブジェクトをFor Each で書き出す
    i = 0
    For Each objTAG In objIE.Document.Forms(0)
        'データをセルへセットする
        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, 256) 'HTML 頭から256文字
        Cells(i + 2, "E") = objTAG.Value  '値
        Cells(i + 2, "F") = objTAG.Name   '名前
        
        i = i + 1   'インクリメント
    Next

End Sub
↑の実行結果↓

.Value と .NAMEが使えそうです。


[#Input_Radio_Checked][ページ内のTOPへ戻る]
ラジオボタン オブジェクトの.Checked = True

オブジェクトをどうにか特定できそうなので、実際にチェックしてみたいと思います。
名前(.NAME) が KUBUN

値(.Value) が VBA
のオブジェクトの.CheckedプロパティをTrueにしてみます。

For Each objTAG In objIE.Document.Forms(0) で回して、単純にIF文で .Name=KUBUN .Value=VBAを判断後、.Checked=Trueにしてみました。
Sub ie_Forms_Input_Radio_Checked()  '見つけたボタンのCheckedにTrueをセット

    Dim objIE      As Object  'IEオブジェクト参照用

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test029-2.asp"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    'HTML Formにデータをセットする
    'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する
    objIE.Document.Forms(0).Item("MEMO").Value = "VBAをCHKする"

    '目的のラジオボタンを探す
    'Form(0)のオブジェクトをFor Each で探る
    Dim objTAG As Object  'タグのオブジェクト格納用
    For Each objTAG In objIE.Document.Forms(0) '構成要素を1つ1つ取り出す
        '名前がKUBUN で 値がVBAのデータを探す
        If objTAG.Name = "KUBUN" And objTAG.Value = "VBA" Then '見つかったか?
            objTAG.Checked = True  '.Checked = True で チェックを付ける
            Exit For               '探し終わったのでループを抜ける
        End If
    Next
    
End Sub
For Each objTAG In objIE.Document.Forms(0)でループを作り、
If objTAG.Name = "KUBUN" And objTAG.Value = "VBA" Thenで該当オブジェクトを特定して、
見つけたオブジェクトの.CheckedプロパティにTrueをセットしただけです。(わかってしまえば意外と簡単?だった)


[#Input_Radio_Click][ページ内のTOPへ戻る]
ラジオボタン オブジェクトを.Clickしてみた

プログラミングの面白さって、同じ結果を得るのにイロイロな書き方があるって所ですよね。まぁ、回答が1つじゃないので個性が出たり、書き方の好き嫌いでもめたりするんだけどね。。。(読者の声:そんな無駄話はいいから、簡単な近道があるなら寄り道しないで教えろよ)

えっと、ラジオボタンの.CheckedプロパティにTrueをセットして選択したのですが、別の方法があって、オブジェクトに対してクリックする、.Clickメソッドを発行する、そんな方法もあります。

簡略仕様書(いつもの使えない箇条書き仕様書)
1.InputBoxで上司・先輩への愚痴を文字列で受け取ります
2.次にIEを起動してWebページを開き
3.フォームの名前がinputTESTのHTML Formに対して以下の処理を行え
 ア..Name(名前)=KUBUN,.Value(値)=GUCHIのオブジェクトを.Click(クリック)
 イ..Name(名前)=MEMOのオブジェクトに入力文字列をセット
 ウ. .Name(名前)=btnSUBMITのオブジェクトを.Click(クリック)
Sub ie_Forms_Input_Radio_Click()  '見つけたオブジェクトをClick

    '1.InputBoxで上司・先輩への愚痴を文字列で受け取ります
    Dim strCOMMENT As String  'コメントの入力
    
    '固定文字だとつまらないので、INPUTBOXで感想をもらう
    strCOMMENT = InputBox("上司や先輩への愚痴は?", "遠慮無く愚痴って", "まともな仕様書書け")
    If strCOMMENT = "" Then
        MsgBox "何か文字を入れてくださいね"
        Exit Sub  '途中で抜ける
    End If

    '2.次にIEを起動してWebページを開く
    Dim objIE      As Object  'IEオブジェクト参照用

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test029-2.asp"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    '3.フォームの名前がinputTESTのHTML Formに対して以下の処理を行え
    ' ア..Name(名前)=KUBUN,.Value(値)=GUCHIのオブジェクトを.Click(クリック)
    ' イ..Name(名前)=MEMOのオブジェクトに入力文字列をセット
    ' ウ. .Name(名前)=btnSUBMITのオブジェクトを.Click(クリック)
    
    Dim objTAG As Object  'タグのオブジェクト格納用
    
    'Form("inputTEST")のオブジェクトをFor Each で探る
    For Each objTAG In objIE.Document.Forms("inputTEST") '構成要素を1つ1つ取り出す
        '名前で分岐
        Select Case objTAG.Name
            Case "KUBUN": 'ア..Name(名前)=KUBUN
                If objTAG.Value = "GUCHI" Then '.Value(値)=GUCHIのオブジェクト?
                    objTAG.Click               '.Value(値)=GUCHIのオブジェクトを.Click(クリック)
                End If
            Case "MEMO"   'イ..Name(名前)=MEMOのオブジェクトに入力文字列をセット
                objTAG.Value = strCOMMENT  '値をセットする
            Case "btnSUBMIT" 'ウ. .Name(名前)=btnSUBMITのオブジェクトを.Click(クリック)
                objTAG.Click
                Exit For   'ボタンを押したので強制的にループを抜ける。
        End Select
    Next
   
End Sub
↑通常は、こんな書き方見かけないと思いますが・・・まぁ、いろいろな表現方法があるってことで、、、
いつもDocument.Forms("0")と0番目とか手抜きでやってましたが、
<FORM ACTION="test029-2.asp" METHOD="POST" NAME="inputTEST" id="test029">
みたいにFORMに名前が付いているなら、Document.Forms("inputTEST")と名前で表すこともできます、こちらの方がみなさんの好みかな。
当然 objIE.Document.Forms(0).Item("MEMO").ValueもobjIE.Document.Forms("inputTEST").Item("MEMO").Valueと書けます。
Form .Submitメソッドでデータを送信できるのですが、ボタンを押す、.Clickメソッド クリック動作でデータを登録することもできます。(ボタンにJavaScriptが貼ってある場合.Clickが有効な場合が多いです)
今回、ループの中でbtnSUBMITボタンを探しましたが objIE.Document.Forms("inputTEST").Item("btnSUBMIT").Clickなんて書き方もOKです。※ボタンの位置がたまたま一番下だったので、ループの中でクリックしてもOKだったけど、ボタンが上にあったらデータセット前に送信ボタンを押してしまいうまくいきませんよ。できたらデータセットとボタンを押すプログラムはわけたほうがいいです。

関連項目:[HTML入力フォーム外側のボタンを押す .Click]
(過去のメルマガ)[No.148 IE ラジオボタン(RADIO)の.Checkedと.Clickの違い]


[#Document_Forms_Select][ページ内のTOPへ戻る]

FORM SELECT OPTION の攻略(選択)サンプル

今回は、データの選択方法でよく見かける SELECT OPTION の選択処理を行ってみます。
リストから1つのOPTIONを選択する場合▼の ドロップダウン パターン

リストからCtrlキーを押して複数選択可能な[SELECT 複数OPTIONの選択] パターン リストボックスのイメージかな?
の2つがあると思います。

まずは、OPTIONを単独で選択する場合を攻略したいと思います。今回のターゲット(操作場所)は [http://www.ken3.org/cgi-bin/test/test092-2.asp] です。下記のような選択(SELECT OPTION)です。
SELECT OPTION の 入力(選択) TEST
表示したい・区分を選択して検索ボタンを押してください

↑実際に入力したり、まずは手動で動かしてみてください。
←のソース↓下記、ターゲットの文章(test092-2.asp)から抜き出した<form>の中身(ソース)です。
<FORM ACTION="test092-2.asp" METHOD="POST">
<font color="blue">SELECT OPTION の 入力(選択) TEST</font><br>
表示したい・区分を選択して検索ボタンを押してください<br>
<SELECT name="KUBUN">
   <option value="">全てのデータ</option>
   <option value="ASP">ASPのデータ</option>
   <option value="VBA">VBAのコメント</option>
   <option value="GUCHI">愚痴系</option>
   <option value="24H">24Hコンビニ</option>
</SELECT>
<INPUT TYPE="submit" VALUE="検索する">
</FORM>

↑みたいな感じで、入力用のFORM 選択(SELECT OPTION)が作られています。
この入力フォームに対して、操作(データをセット)してみたいと思います。


[#Select_Option_Selected][ページ内のTOPへ戻る]

選択なので、素直にオブジェクト .Selected = True にする

手間だけど、Form下のオブジェクトを表示させて探ってみますか。
下記、単純にページを表示させ、手抜きでForm(0)の下、オブジェクトをシートに書き出してみました。
Sub ie_Forms_Input_Select_001()  'Form(0)の下、構成要素を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)の下 オブジェクトを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)のオブジェクトをFor Each で書き出す
    i = 0
    For Each objTAG In objIE.Document.Forms(0)
        'データをセルへセットする
        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文字だけ書く
        Cells(i + 2, "E") = objTAG.Value  '値
        Cells(i + 2, "F") = objTAG.Name   '名前
        
        i = i + 1   'インクリメント
    Next
    
End Sub
↑を実行すると↓の結果が表示されました。

↑あれれ、Optionが見つからないよ。<SELECT>〜</SELECT>の中だからか?

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
※FONTやBRなど名前・値を持たないオブジェクトがあるので注意
↑を実行すると↓の結果が表示されました。

↑For Each objTAG In objIE.Document.Forms(0).All のループだと、OPTIONが取れます※余計な FONT や BR も 付いてくるけど、まぁ、よしとしますか。

For Each objTAG In objIE.Document.Forms(0).All のループで、OPTIONを取り出せたので、値(.Value)がVBAのオブジェクトを選択(.Selected=True)してみます。
Sub ie_Forms_Input_Select_003()  'Form(0).Allの下、.TagName = "OPTION" .Value="VBA" を探し.Select=Trueにする

    Dim objIE    As Object  'IEオブジェクト参照用

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test092-2.asp"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    '※FORM(0).Allの下 オブジェクトを1つ1つ探す
    Dim objTAG As Object  'タグのオブジェクト格納用

    'Form(0).AllのオブジェクトをFor Each で取り出す
    For Each objTAG In objIE.Document.Forms(0).All
        'タグの名前がOPTIONで値がVBAのオブジェクトを探す
        If objTAG.TagName = "OPTION" Then   '初めにOPTIONタグを探す
            If objTAG.Value = "VBA" Then    '次に値がVBAを探す
                objTAG.Selected = True   '.Selected = Trueで選択状態にする
                Exit For                 '見つかったのでループを抜ける
            End If
        End If
    Next

End Sub
↑こんな感じで、タグがOPTION 値がVBAのデータを選択(.Selected=True)できました。


[#Select_Value][ページ内のTOPへ戻る]

もっと素直に<SELECT>タグ .Value に 値をそのままセット

んっ、↑で、Document.Forms(0).All のループで回してとか言ってたけど、その前に<OPTION>は<SELECT>〜</SELECT>の中だからか?なんて言ってたよね。
はい、言ってたよ。それが何か?
何かじゃねぇダロ、選択させる値が<SELECT>〜</SELECT>の中なら初めから、<SELECT>のタグに、.Valueに値をセットしてみたら?<OPTION>を探して.Selected=Trueなんてやってられるか
、、ってことで実際にやってみました。
Sub ie_Forms_Input_Select_004()  'Form(0).Item("KUBUN").Value="24H" と 値をセットする

    Dim objIE    As Object  'IEオブジェクト参照用

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test092-2.asp"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    'Form(0) の アイテム(名前がKUBUN) の 値(.Value) を 24Hにする(24Hを選択する)
    objIE.Document.Forms(0).Item("KUBUN").Value = "24H"

End Sub
↑の1行でできてしまいました・・・あらら。※スミマセン、遠回りさせてしまって。

関連項目:値を直接セットできるなら、(過去のメルマガ)→ [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のこと?(笑))


[#Select_Multiple][ページ内のTOPへ戻る]

FORM SELECT Size=n行 Multipleで複数選択が可能なOPTION の攻略(選択)サンプル

上で単独のOPTION選択を行ったので、次は、SELECT Size=nで複数表示されたリストボックスから、Ctrl+クリックで複数のOPTIONデータを選択する方法を探ってみたいと思います。
今回のターゲット(操作場所)は [http://www.ken3.org/cgi-bin/test/test093-5.asp] です。下記のようなリストボックスで複数選択可能なSELECTタグとOPTIONタグです。
FORM リストボックスの複数選択(selectタグ multiple で VALUE=を個別に作成)
表示したい・区分を選択後、検索ボタンを押してください
Ctrlキーを押しながらクリックすると、複数を選ぶことができます


↑実際に入力したり、まずは手動で動かしてみてください。
←のソース↓下記、ターゲットの文章(test093-5.asp)から抜き出した<form>の中身(ソース)です。
<font color="blue">FORM リストボックスの複数選択(selectタグ multiple で VALUE=を個別に作成)</font><br>
<FORM ACTION="test093-5.asp" METHOD="POST">
表示したい・区分を選択後、検索ボタンを押してください<br>
Ctrlキーを押しながらクリックすると、複数を選ぶことができます<br>
<SELECT NAME="KUBUN" SIZE="5" multiple>
 <option VALUE="ASP">ASP 感想(ASP)</option> 
 <option VALUE="VBA">VBA 感想(VBA)</option> 
 <option VALUE="24H">コンビニ系(24H)</option> 
 <option VALUE="GUCHI">愚痴系(GUCHI)</option> 
</SELECT><br>
<INPUT TYPE="submit" VALUE="検索する">
</FORM>

↑みたいな感じで、入力用のFORM 選択(SELECT OPTION)が作られています。
この入力フォームに対して、複数選択の操作(データをセット)してみたいと思います。


[#Select_Multiple_Selected][ページ内のTOPへ戻る]

Forms(0).All.tags("OPTION")で探したオブジェクトを.Selected = Trueにする

複数でも単独と同様、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で見えているリストの文章を選択するのもアリかなぁ。)
Sub ie_Select_Multiple_001()
    'For Each objTAG In objIE.Document.Forms(0).All.Tags("OPTION")でループさせ
    ' .Value="VBA" と .InnerTEXT="愚痴系(GUCHI)" の2つを探し.Select=Trueにする

    Dim objIE    As Object  'IEオブジェクト参照用

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test093-5.asp"
    
    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    '※FORM(0).Allの下 オブジェクトを1つ1つ探す
    Dim objOPTION As Object  'OPTIONタグのオブジェクト格納用

    'Form(0).All.Tags("OPTION")でOPTIONオブジェクトのみ取り出す
    For Each objOPTION In objIE.Document.Forms(0).All.Tags("OPTION")
        '.Value(値)がVBAのオブジェクトを探す
        If objOPTION.Value = "VBA" Then  '.Valueを見てチェック
            objOPTION.Selected = True    '.Selected = Trueで選択状態にする
        End If
        '.InnerTEXT(表示テキスト)が 愚痴系(GUCHI) のオブジェクトを探す
        If objOPTION.InnerTEXT = "愚痴系(GUCHI)" Then  '.InnerTEXTを見てチェック
            objOPTION.Selected = True    '.Selected = Trueで選択状態にする
        End If
    Next

    'おまけで、 OPTIONの親、SELECTの値をデバックエリアに出力
    Debug.Print "KUBUNの値は[" & objIE.Document.Forms(0).Item("KUBUN").Value & "]です"

End Sub
↑ポイントは、ページ表示後に、
For Each objOPTION In objIE.Document.Forms(0).All.Tags("OPTION")でOPTIONのタグをobjOPTIONに1つ1つ取り出し、
If objOPTION.Value = "VBA" と If objOPTION.InnerTEXT = "愚痴系(GUCHI)" で判断しただけなんですが・・

↑実行結果を見ると、複数の選択はできているのですが、おまけで追加した、親のSELECTタグ 名前KUBUNの値をデバック表示(次の章で使うため)が、VBAと1つだけしか表示されていない・・・検索を手動で押すと無事に2つ検索されるし複数選択はOKなんだけどなぁ、何だろうなぁ、、、何か違うアプローチがあるのかなぁ・・・

できれば、複数選択も値の代入だけですましたかったんだけど・・・これもいつもの調査中で逃げてるって感じですね。(時間を作って、壁に立ち向かわないとダメですね)


[#Form_Input_Checkbox][ページ内のTOPへ戻る]

INPUT TYPE="CHECKBOX" を 操作する

フォームのチェックボックス INPUT TYPE="CHECKBOX"を操作します。
おおまかなタイプは2つあって、NAME="オブジェクト名"が個々に違う場合と、NAME="オブジェクト名"が同じでValue="識別する値"で区別しているパターンです。
読者の声:何言ってるのかわからない、意味不明、日本語でお願いします。。。
日本語かぁ・・・自信がないので下記にHTML言語を書きます(HTML言語で話します)

INPUT TYPE="CHECKBOX"の2パターン
NAME="xxxx"が個々に違う NAME="xxxx"が同じでValue="zzzz"が違う
Formの場所[test093-2.asp]↓入力イメージ
CHECKBOX NAME=を個別に作成 Where句を作成するTEST
表示したい・区分をチェックしてから検索ボタンを押してください
ASP
VBA
コンビニ系
愚痴系

↑の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]
チェックボックス↓入力フォーム
FORM CHECKBOX VALUE=を個別に作成 Where句を作成するTEST
表示したい・区分をチェックしてから検索ボタンを押してください
ASP
VBA
コンビニ系
愚痴系

↑の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"が違うパターンです
見た目は同じでも、中身が違う、そんなパターンです。※中身が違うので操作方法も少し違うんですよ・・・世の中には(Web上には)イロイロな処理方法や表現(Htmlの記述)があって大変です。


[#Form_Input_Checkbox][ページ内のTOPへ戻る]

Name="XXXX"が個別で違う場合

Name="XXXX"が個別に違う場合は、素直に名前で目的のオブジェクトへアクセスできるので、
オブジェクト.Checked = Trueでチェックボックスにチェックを入れてみます

Name="VBA"とName="24H"にチェックを入れてみます。
Sub ie_Input_Checkbox_Checked()    '名前がVBA と 24H の チェックボックスをONにする

    Dim objIE    As Object  'IEオブジェクト参照用

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test093-2.asp"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    '素直に Document.Forms(0).Item("名前")でアクセスする
    objIE.Document.Forms(0).Item("VBA").Checked = True   '.CheckedプロパティにTrueをセット
    objIE.Document.Forms(0).Item("24H").Checked = True   '.CheckedプロパティにTrueをセット

    'データをセットしたら 送信する(ここでは、コメント(非実行)にしたけど)
    'objIE.Document.Forms(0).Submit   '.Submitメソッドで送信処理

End Sub
素直に Document.Forms(0).Item("名前")でオブジェクトが特定できるので、あとは.Checked = Trueで選択状態にしました。


[#Input_Checkbox_Value][ページ内のTOPへ戻る]

Name="XXXX"が同じで、Value=(値)が違う場合

次に、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つにチェックを入れる
Sub ie_Input_Checkbox_Value()
    '名前(.Name)がKUBUN で 値(.Value)がASP,VBA,24H の チェックボックスをONにする

    Dim objIE    As Object  'IEオブジェクト参照用

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test093-4.asp"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    'Form内を1つ1つ調べて、該当するオブジェクトを操作する
    Dim objTAG  As Object  '取り出したタグを入れる変数
    
    For Each objTAG In objIE.Document.Forms(0) 'フォームの下を1つ1つ取り出す
        If objTAG.Name = "KUBUN" Then  '名前が KUBUN のオブジェクトか?
            If objTAG.Value = "ASP" Then objTAG.Checked = True '値がASPならチェックを入れる
            If objTAG.Value = "VBA" Then objTAG.Checked = True '値がVBAならチェックを入れる
            If objTAG.Value = "24H" Then objTAG.Click  '値が24Hならクリックする(おまけのテスト)
        End If
    Next

    'データをセットしたら 送信する(ここでは、コメント(非実行)にしたけど)
    'objIE.Document.Forms(0).Submit   '.Submitメソッドで送信処理

End Sub
ポイントは、ループで回して、名前(.Name)と値(.Value)をチェックして、目的のチェックボックスなら、.CheckedをTrueにしました。※24Hの時、おまけで.Clickメソッドを発行して遊んでみました。(クリック動作でも チェックを付けたりハズしたりできます)


[#Document_getElementsByName][ページ内のTOPへ戻る]

Document.getElementsByName(.Nameがわかるなら名前で素直に探したら?)

上のチェックボックスの判断で、名前(.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を使ってみます
Sub ie_document_getElementsByName()
    '名前(.Name)をgetElementsByNameで探し 値(.Value)がASP,24H,GUCHI の チェックボックスをONにする

    Dim objIE    As Object  'IEオブジェクト参照用

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test093-4.asp"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    '.getElementsByNameで指定した名前のオブジェクトを取り出し、値を見て処理を行う
    Dim objTAG  As Object  '取り出したタグを入れる変数
    
    For Each objTAG In objIE.Document.getElementsByName("KUBUN") '名前がKUBUNのデータを取り出す
        If objTAG.Value = "ASP" Then objTAG.Checked = True   '値がASPならチェックを入れる
        If objTAG.Value = "GUCHI" Then objTAG.Checked = True '値がGUCHIならチェックを入れる
        If objTAG.Value = "24H" Then objTAG.Click  '値が24Hならクリックする(おまけのテスト)
    Next

    'データをセットしたら 送信する(ここでは、コメント(非実行)にしたけど)
    'objIE.Document.Forms(0).Submit   '.Submitメソッドで送信処理

End Sub
オブジェクトを取り出すときに、
For Each objTAG In objIE.Document.getElementsByName("KUBUN")
で、名前指定で取り出す(ここではKUBUNのデータ)ことができるので名前が同じオブジェクトを処理する場合にぜひ使ってみてください。


[#Input_button_Click][ページ内のTOPへ戻る]

HTML入力フォーム外側のボタンを押す(<Form>が無い場合)

次は、<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>

↑こんな感じでFORM無しのINPUT type="button"です。

いままでの例だと 名前が付いていれば objIE.Document.Forms("フォームの名前").Item("ボタンの名前").Click や 名前が無くても番号で objIE.Document.Forms(0).Item(6).Click などFormオブジェクトの下を操作してました。
が、今回の文章(Document)には、<Form>がありません・・・

FORMに属していないので一番上のDocument.all("名前")で指定

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でクリックできるか、テストしてみます。
Sub ie_Input_Button_Click()  'Formが無い(Formに属さない)ボタンを.Click

    Dim objIE      As Object  'IEオブジェクト参照用

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/test/2007/09/post_d21d.html"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend

    '↓デバック用で少し待つ(※これは通常いらないので)
    Application.Wait Time:=Now + TimeValue("00:00:03")  '画面遷移がはやいので3秒間止める

    'htmlドキュメント allの名前がbtopのオブジェクト を クリック(.Click)する
    objIE.Document.all("btop").Click   '単純に名前で指定した対象に.Click
 

End Sub
↑こんな感じで無事 FORM に属さないボタンが押せたと思います。※初めからDocument.all("名前").Clickを教えとけよ・・・と読者の声が聞こえてきたような


[#Input_button_NoNAME][ページ内のTOPへ戻る]

Document.all.tags("INPUT")で抜き出し判断する

ボタンに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しました。
Sub ie_Tags_Input_Button()  'ボタンにName=が無しなので、.tagsでINPUTを抜き .Valueで判断

    Dim objIE      As Object  'IEオブジェクト参照用

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/test/2007/09/post_d21d.html"

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4  'READYSTATE_COMPLETE = 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
    '↓デバック用で少し待つ(※これは通常いらないです)
    Application.Wait Time:=Now + TimeValue("00:00:03")  '画面遷移がはやいので3秒間止める
    
    'htmlドキュメント allのから .tagsでINPUTタグを抜き
    '.Value値(ボタンの名称) が IE操作解説 の オブジェクト を クリック(.Click)する
    Dim objINPUT As Object   'Inputタグ格納用

    For Each objINPUT In objIE.Document.all.tags("INPUT")  'Inputのタグを.allから抜く
        If objINPUT.Value = "IE操作解説" Then '.Value値(ボタンの名称) が IE操作解説 か?
            objINPUT.Click  '見つけたINPUTオブジェクト(ボタン)を.Clickクリックする
            Exit For  '用が済んだので(見つかったので)ループを抜ける
        End If
    Next
    
    '↑上でボタンが見つからなかった時のエラー処理が入っていない手抜きだけど、ご勘弁を
    
End Sub
まぁ、日本語のボタン名称(.Value)を探した方が意外と処理がわかりやすかったり?(ソースを見て何やっているのかわかるかなぁ)

余談:間違っても客先や派遣先で名前がわからないからって、胸の大きいな女性に説明しましたとか、とんでもない発言を客先担当者(納品先の課長)に言っちゃイケマセンよ(あの頃は若かったなぁ それで次の仕事が来なかったのか って、誰の失敗談だよ) じゃなくて、少々パターン違いの 逆にName=砂糖さん と名前が同じ場合もあったり、過去のメルマガ → [No.176 VBAからIE操作 NAMEが同じフォームの項目へデータをセットする] も参考にしてください。※逆の立場で自分が派遣で来ているデブ プログラマーとか社員さん達に言われたらと思うとかなり反省(オイオイ)

Form 終わりの挨拶

まだまだ、書かないといけないForm操作 プロパティやメソッドなどの組み合わせがあるのですが、このあたりで逃げるように失礼します(オイオイ)。更新が遅いけど温かく見守ってください 更新中 まだまだ書きかけ

いろいろな表現があって、かえって迷ってしまうかもしれませんが、数をこなすと見えてくるので、私のサンプルだけじゃなく、いろいろなサンプルを探して見てください。[番外編 GoogleでoIE,objIE,WebBrowserをKeyWordにして検索]にお勧めのキーワード検索方法を載せてます

ここまでのサンプル Formのデータ登録サンプル:[IE起動とデータセットのサンプル 20080527_IE_Form.zip]←Excel VBAです
保存後、解凍して、テストしてみてください。



[ページ内のTOPへ戻る]

ページフッター

Googleで情報を探す

せっかくホームページに来ていただいたのに、検索の紹介 ぉぃぉぃ
サイト指定や期間の指定を組み合わせて実行してみてください。

Google
探す言葉:
ググる。↑VBAなど 気になる単語や,オブジェクト(MailItem),プロパティ(.Body)やメソッド(.Move)などを入れて検索してみてください。

サイト指定:人気QAサイト や 一次情報MS本家を指定する
条件無し WWW 全体から検索も良いけど↓で絞り込むのもおススメです
一次情報・二次情報まとめから探る
一次情報は基本のMSDN含む microsoft.comから
まとめ一次・二次情報 Qiita 知識を記録・共有 qiita.comで個人まとめを参考に
手前味噌の三次情報 三流君メモBlog ken3memo.hatenablogから検索
QAサイトの質問から探る
QAはやっぱり人の多いYahoo知恵袋 chiebukuro.yahoo.co.jpから探る
こちらもどうぞ おしえてgoo! oshiete.goo.ne.jp
15分探して見つからなかったら?回答率90%以上 teratail.com
私も利用中 最近過疎ってる失礼 人力検索 q.hatena.ne.jp
意外と穴場? 2ch 5ch.netから探す
検索実行: ←オプション確認後に検索ボタンを押してください

期間指定:情報の鮮度も大切?
指定なし(全て)※不変の情報を得るには指定無しが一番?
3日以内 最新の更新情報を探す時など。
3ヶ月 これはあまり使わないかも
1年以内の更新なら情報鮮度もOK?バランス型
3年も経てばOfficeもバージョンUP?
検索実行: ←オプション確認後に検索ボタンを押してください

メッセージ送信

ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:


アドレス:に返事をもらいたい
感想や質問↓:


対応速度・緊急度:
(回答・感想は下記のようにしてHPで記事に載せてます) 例:[XXXXさんへ回答例]←みたいに回答していたり...
とても急ぎで連絡がほしい、そんな時は:[twitter三流君DM]に気軽に連絡してください。

[三流君(TOPへ)] / [VBAで楽しく] / [記事一覧]
カスタム検索