プロが教える店舗&オフィスのセキュリティ対策術

ttp://www.vba-ie.net/form/submit.htmlを参考に、検索対象を「ttp://gihyo.jp」に変更し、以下のコードを実行してみました。
しかし、「田中太郎」とフォームに入力はされ、検索ボタンが押されず、「オブジェクトが必要です」というメッセージが出る状態です。
objForm.submitで検索されないのは何故でしょうか?

稚拙な質問で大変申し訳御座いません。


#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If

Sub sample()

Dim objIE As InternetExplorer
Dim objForm As HTMLFormElement

'InternetExplorerでテスト用フォームページを起動
Call ieView(objIE, "http://gihyo.jp")

'名前のテキストボックスにデータを入力
Call formText(objIE, "query", "田中太郎")

'パスワードボックスにデータを入力
'Call formText(objIE, "pass", "1234")

'テキストエリアにデータを入力
'Call formText(objIE, "textbox", "さわやかです。")

Set objForm = objIE.document.forms("form1")

'submitボタンをクリック
objForm.submit

End Sub

Sub ieView(objIE As InternetExplorer, _
urlName As String, _
Optional viewFlg As Boolean = True)

'IE(InternetExplorer)のオブジェクトを作成する
Set objIE = CreateObject("InternetExplorer.Application")

'IE(InternetExplorer)を表示・非表示
objIE.Visible = viewFlg

'指定したURLのページを表示する
objIE.navigate urlName

'IEが完全表示されるまで待機
Call ieCheck(objIE)

End Sub



Sub ieCheck(objIE As InternetExplorer)

Dim timeOut As Date

'完全にページが表示されるまで待機する
timeOut = Now + TimeSerial(0, 0, 20)

Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Sleep 1
If Now > timeOut Then
objIE.Refresh
timeOut = Now + TimeSerial(0, 0, 20)
End If
Loop

timeOut = Now + TimeSerial(0, 0, 20)

Do While objIE.document.readyState <> "complete"
DoEvents
Sleep 1
If Now > timeOut Then
objIE.Refresh
timeOut = Now + TimeSerial(0, 0, 20)
End If
Loop

End Sub

Sub formText(objIE As InternetExplorer, _
nameValue As String, _
tagValue As String)

'テキストボックス・パスワードボックスにデータを入力
For Each objTag In objIE.document.getElementsByTagName("input")

If objTag.Name = nameValue Then
objTag.Value = tagValue
Exit For
End If

Next

'テキストエリアにデータを入力
For Each objTag In objIE.document.getElementsByTagName("textarea")

If objTag.Name = nameValue Then
objTag.Value = tagValue
Exit For
End If

Next

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

A 回答 (1件)

こんにちは



>「オブジェクトが必要です」というメッセージが出る状態です。
それってエラーメッセージですよね?

想像するところ、エラーの発生個所は
>Set objForm = objIE.document.forms("form1")
ではないかと思いますが、該当するフォーム要素が取得できていないだけではないでしょうか?
VBAなばら、エディタにデバッグツールがあると思いますので、それを利用することで詳細な内容を確認できることと思います。

ご提示のページをざっと眺めたところformは以下の3箇所のようですが、
 ・nameやid属性のないform(右上のもの)
 ・class="inputForm01"となっているform
 ・name、idが"informationForm"となっているform
これらのいずれもコードでご指定のformには該当しません。

docuemnt.formsやgetElementById()、getElementsByTagName()、querySelector()などが利用可能と思いますので、これらを利用して処理なさりたいフォーム要素を適切に取得してあげれば良いだけのように思います。


※ ついでながら、ご提示のコードでは、テキストをセットする際に、指定したフォームとは無関係に文書全体から入力要素を探してセットするようになっていますので、似たようなフォームが複数あるページではどのフォームに値がセットされるか不明確になっていると言えます。

対象とするフォーム要素を取得できれば、その子要素(入力要素)は、form.elementsで取得可能ですので、そのなかから探すようにした方が良さそうに感じられます。
あるいは、querySelectorなどで直接指定するのが良いのかもしれません。
    • good
    • 1
この回答へのお礼

fujillin様

大変詳しい解説を有難う御座います。
フォーム要素取得の方向でデバッグしてみたいと思います。

お礼日時:2016/11/30 17:48

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