dポイントプレゼントキャンペーン実施中!

ie操作です。宜しくお願いいたします。

郵便局の再配達の依頼をvbaで行おうとしているのですが
ラジオボタンにチェックする方法がわかりません。

「簡易・記録」にチェックを入れたいです。

https://trackings.post.japanpost.jp/delivery/del …
のソースを見ると、
<DIV><FONT class="explain_font_normal">
<input type="radio" name="mailTypeCode" value="13">簡易・記録
</FONT></DIV>
となっているので

Sub test1()
Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate "https://trackings.post.japanpost.jp/delivery/del …
objIE.Visible = True

Do While objIE.Busy = True
DoEvents
Loop
Do While objIE.document.ReadyState <> "complete"
DoEvents
Loop

objIE.document.forms(0).elements("mailTypeCode") = 13
objIE.document.all("mailTypeCode").Value = 13
objIE.document.all.forms(0)("mailTypeCode").Value = 13

Set objIE = Nothing

End Sub

としてみましたが、どれもダメでした。
宜しくお願いいたします。

A 回答 (3件)

#直接のご回答は #1 さんがお書きですので、こちらをご覧になる他の方々のためにも、お節介かも知れない回答をお一つ。



>としてみましたが、どれもダメでした。
 WEBページは、1つ1つ、すべて違う作りになっています。
 したがって、IEを扱うコードを書くときには、そのページに相応しいコードを書かなければ、目的のデータを拾うことはできません。


●objIE.document.forms(0).elements("mailTypeCode") = 13
 「objIE.document.forms(0).elements("mailTypeCode")」をウォッチ式に追加して、このコードの時点でブレイクしてみると、
この配下に「Item」が19個あるのが判ります。
 つまり、「お知らせ郵便物等の選択」にあるラジオボタンのすべてが「~.elements("mailTypeCode")」になっているようです。

>のソースを見ると、・・・ name="mailTypeCode"・・・となっているので
よいところに目を付けていらっしゃるのですが、ソース全体を検索して、目的の「"mailTypeCode"」が何番目かを探ってみてください。

 結果的には、3番目になりますので、前述の「Item」から申せば「Item 3」がそれに当たります。


【解説】
 したがって、
objIE.document.forms(0).elements("mailTypeCode").Item3 = 13
としたいところですが、これでは「オブジェクトは、このプロパティまたはメソッドをサポートしません。」と叱られてしまいます。

 こういう場合は、決まって「~("mailTypeCode")(3)」というように、「Item」のインデックスを指定してやることになっています。
 ここで注意しなければならないのは、「Item 3」のインデックスが「3」ではないということです。
 前述のように19個の「Item」がある訳ですが、イミディエイトウィンドウに
? objIE.document.forms(0).elements("mailTypeCode")(19)
と入力して [Enter] すると、「オブジェクト変数または With ブロック変数が設定されていません。」と叱られてしまいます。
 あるいは、ウォッチウィンドウに「objIE.document.forms(0).elements("mailTypeCode")(19)」を追加してみると、「値」が「Nothing」になっています。
 逆にインデックスを「0」としてみると、ウォッチウィンドウの「値」は「"[object]"」に変わり、イミディエイトウィンドウの値も「[object]」になります。

 まぁ、これは初歩的な説明ですが、要するに、普通は「配列のインデックス(添字)の最小値は0である」ということです。


 前置きが長くなりましたが、
objIE.document.forms(0).elements("mailTypeCode")(2) = 13
でイケます。。。
と申したいところですが、これでは全然ダメです。

 「13」というのは、当該の html で「簡易・記録のラジオボタン」に割り当てられた「値」で、同ページの [次へ進む] ボタンをクリックしたときに、「次ページ」に遷移するために「CGI」に渡される「値」です。

 というように、Excel でIEを扱うときには、VBAの知識だけではなく、htmlコード の意味ぐらいは、少し勉強なさった方がよいかも知れませんが、「Perl」や「CGI」まで勉強する必要はありません。


【本題】
 さて、本題にもどりますが、「ラジオボタンをクリック」するには、#1 さんがお書きの [Checked プロパティ] を「TRUE」に設定します。
 ということで、
objIE.document.forms(0).elements("mailTypeCode")(2).Checked = True
になります。

 あるいは、[Click メソッド] を使って
objIE.document.forms(0).elements("mailTypeCode")(2).Click
でもイケます。


●objIE.document.all("mailTypeCode").Value = 13
 上記と同様に考えていくと
objIE.document.all("mailTypeCode")(2).Checked = True
objIE.document.all("mailTypeCode")(2).Click
になります。

 ただし、この場合のインデックス「2」は「objIE.document.all」の中で「"mailTypeCode"」という「name」または「id」が施されているものの「3つ目」の要素という意味になりますので、「objIE.document.forms(0)」の中での「3つ目」とは、厳密には意味が異なります。


●objIE.document.all.forms(0)("mailTypeCode").Value = 13
 こちらは、ウォッチウィンドウでご確認いただければお分かりになることですが、「objIE.document.all」配下には、「constructor」・「ie8_length」・「length」・「Item 1」・・・・ というプロパティしかありませんので、通用しません。

 ウォッチウィンドウでは、「objIE.document.all.forms(0)("mailTypeCode").Value」の「値」は「<オブジェクトは、このプロパティまたはメソッドをサポートしていません。>」となっています。


【まとめ】
 以上のように、WEBページのフォームエレメントを特定するには、
・まず、当該のページの html ソースを読んで、使えそうなエレメントを探す。
・ウォッチウィンドウにいろいろと入力してみて、特定できる要素を突き止める。
ということが基本になります。

 今回の場合は、上記
objIE.document.forms(0).elements("mailTypeCode")(2)
objIE.document.all("mailTypeCode")(2)
の他にも、
objIE.document.forms(0)(8)
objIE.document.forms(0)("mailTypeCode")(2)
objIE.document.getElementsByTagName("input")(7)
objIE.document.getElementsByName("mailTypeCode")(2)
のそれぞれについて、
~.Checked = True
~.Click
で目的の操作を完了できます。

 今回のように、html ソースの中で「name="~~"」で指定されている場合は
objIE.document.all.mailTypeCode(2)
objIE.document.forms(0).mailTypeCode(2)
というような使い方もできますが、「"~~"」の中にスペースが入っている場合はこの限りではありません。

 なお html ソースの中に「id="~~"」というな指定がある場合は、
objIE.document.getElementById("~~")
も使えます。
    • good
    • 0
この回答へのお礼

objIE.document.forms(0).elements("mailTypeCode")
をウォッチウインドウで見たら19個ありますね。
このItem3なのですか。

自分もいつもvbaさんに叱られます泣

ソースはvalue="13">になっていますが
ココは無視した方が良いようですね。13にとらわれ過ぎました。

まとめの情報、以後使って行こうと思います。

お礼日時:2013/01/25 20:05

.Checked = True でも通ります。



objIE.document.all("mailTypeCode")(2).Checked = True
あるいは
objIE.document.getElementsByName("mailTypeCode")(2).Checked = True

インデックスが解らない場合はFor文で回して探ってみます。
For Each itm In objIE.document.all("mailTypeCode")
If itm.value = 13 Then
itm.Click
Exit For
End If
Next
    • good
    • 0
この回答へのお礼

沢山の方法があるのですか、
役に立ちました。

お礼日時:2013/01/25 20:05

下記で試してください。


objIE.document.all("mailTypeCode")(2).Click
あるいは
objIE.document.getElementsByName("mailTypeCode")(2).Click
    • good
    • 0
この回答へのお礼

どちらでも動きました。
ソースがname="mailTypeCode"となっているから
getElementsByNameでnameを取得して、
インデックスが0から始まるから3つめの2という事ですね。

お礼日時:2013/01/25 20:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!