ここから本文です

【VBA】IEのbuttonタグの操作について 閲覧ありがとうございます。 掲題の件に...

tat********さん

2020/5/2816:47:29

【VBA】IEのbuttonタグの操作について

閲覧ありがとうございます。
掲題の件についてご教授下さい。

■やりたいこと
①yahooトップの検索のテキストボックスに文字を入力
②テキストボックスの右の検索ボタンを押下し、検索結果を表示

■質問内容
上記①の時点ではブラウザ上に文字がちゃんと入るのですが、
②でボタンを押下すると、空文字での検索となってしまいます。

しかし、yahooではなく、googleの検索であれば出来ました。
yahooとgoogleの違いを確認したところ、ボタンのタグに
以下の通り違いがありました。

yahoo :<button ~中略~ type="submit" ~
google:<input ~中略~ type="submit" ~

以下のソースのどこを直せば、yahooでも動作するように
なるかご教授下さい。
宜しくお願い致します。

==================================
Option Explicit

Sub yahoo_search()

'-- インターネットに接続してブラウザを開く---
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True

'-- インターネットの特定のページを開く---
objIE.navigate "https://www.yahoo.co.jp/"
Call IEWait(objIE) 'IEを待機
Call WaitFor(3) '3秒停止

'-- IEに自動で文字入力して情報検索する---
Dim s As String '検索文字列
s = "検索" '検索文字列を設定
Dim objtag, objsubmit As Object

'①検索のテキストボックスに検索文字列を設定
For Each objtag In objIE.document.getElementsByTagName("input")
If InStr(objtag.outerHTML, """search""") > 0 Then
objtag.Value = s
Exit For
End If
Next

'②検索ボタン押下
For Each objsubmit In objIE.document.getElementsByTagName("button")
If InStr(objsubmit.outerHTML, """submit""") > 0 Then 'yahoo=submit:google=btnK
objsubmit.Click
Call WaitFor(3)
Exit For
End If
Next

'-- IEを閉じる---
objIE.Quit
Set objIE = Nothing

End Sub

'-- IEを待機する関数---
Function IEWait(ByRef objIE As Object)
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
End Function

'-- 指定した秒だけ停止する関数---
Function WaitFor(ByVal second As Integer)
Dim futureTime As Date

futureTime = DateAdd("s", second, Now)

While Now < futureTime
DoEvents
Wend
End Function
==================================

閲覧数:
14
回答数:
2
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

ten********さん

2020/5/2910:45:06

> ボタンを押下すると、空文字での検索となってしまいます
ということで、
https://search.yahoo.co.jp/
が開きます。
そういう「挙動」になっているので、sas***さんのご回答のように、最初からそのページで操作したらいかがですかということになります。

========================================

さて、tat***さんが、単に yahoo検索を自動化なさりたいということなら、下記は不要な回答になりますが、「VBA の IE操作を勉強中である」などの別の用途でご質問されているのでしたら、ご参考までに...。

----------------------------------------

> ボタンのタグに以下の通り違いがありました。
とのことで、yahoo のサイトの場合は、
objsubmit.Click
のところでクリックしているのは [button タグ] になります。

ここで [button タグ] を Click した場合には、前述の「挙動」になるということですが、これは、Script の組み方などのサイトの作りに大いに左右されますので、(サイトごとに)その都度、動くコードを考えるしかありません(ゴリゴリとコードを書いていくということです)。


Yahoo のサイトの場合は、「検索ボタン」周りのコードは、
<form action="https://search.yahoo.co.jp/search" name="sf1" method="get" role="search">
・・・<button ・・・ type="submit">・・・検索・・・</button>・・・</form>
となっています。

そこで、お示しの回答を弄るとすれば、
For Each objsubmit In objIE.document.getElementsByTagName("button")
If InStr(objsubmit.outerHTML, """submit""") > 0 Then 'yahoo=submit:google=btnK
objsubmit.Click

For Each objsubmit In objIE.document.getElementsByTagName("form")
If InStr(objsubmit.outerHTML, """sf1""") > 0 Then 'yahoo=submit:google=btnK
objsubmit.Submit
に変えるだけで動く様になるかと存じます。・・・「button」を「form」に、「"submit"」を「"sf1"」に、「Click」を「Submit」に変えただけです。

----------------------------------------

しかし、ページのソース全体を覧ると、[form タグ] も「name="sf1"」も1つしかありません。
なので、「②検索ボタン押下」の7行のコード、
For Each objsubmit In objIE.document.getElementsByTagName("button")
~ Next

objIE.document.getElementsByTagName("form")(0).Submit
Call WaitFor(3)
あるいは、
objIE.document.getElementsByName("sf1")(0).Submit
Call WaitFor(3)
に変えるだけでも動かすことは出来ます。

また、これは余談ですが、同様に、「①検索のテキストボックスに検索文字列を設定」の6行のコード、
For Each objtag In objIE.document.getElementsByTagName("input")
~ Next

objIE.document.getElementsByName("p")(0).Value = s
に変えるだけでも動きます。

----------------------------------------

> ゴリゴリとコードを書いていく
と書きましたのは、例えば、サイトの仕様が変更されたときに、
objIE.document.getElementsByTagName("form")(0).Submit
の「(0)」を「(1)」に変えてみたり、「②検索ボタン押下」の7行のコードの、
「"input"」を「"form"」に、「"search"」を「"sf1"」に変えてみたり...ということです。

ということで、VBA で「InternetExplorer.Application」を扱う際には、サイトのページソースに書かれているタグやその構成に慣れていくことがとても大切になるというこです。

----------------------------------------

最後に、もう1点。
お示しのコード内に、「Dim objIE As InternetExplorer」と書かれていますので、「Microsoft HTML Object Library」・「Microsoft Internet Controls」あたりに参照設定していらっしゃると存じますが、この場合は、
Set objIE = CreateObject("InternetExplorer.Application")
と書くのは不適切で、
Set objIE = New InternetExplorer
と書くべきかな...です。
参考)https://sites.google.com/site/compositiosystemae/home/vbaworld/uppe... (CreateObject関数を使用する場合の注意点)

で、むしろ、参照設定(事前・アーリー バインディング)した方が良いですね。
参考)https://excel-ubara.com/excelvba4/EXCEL227.html (事前バインディングの利点)

  • 質問者

    tat********さん

    2020/5/2911:06:29

    To:ten********さん

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

    「VBA の IE操作を勉強中」であったので、参考情報が
    とても役に立ちました。ありがとうございます。
    ※formをsubmitするという部分が特に。

    追加の質問で大変恐縮ですが、buttonタグのクリックに
    よる該当formのsubmitは不可能ということでしょうか?

  • その他の返信(1件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2020/5/29 15:35:28

ten********さんをベストアンサーとさせていただきます。

sas********さんもご回答いただき、ありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

sas********さん

2020/5/2820:05:21

こんな感じでどうでしょうか?
URLをこっちに変えました「https://search.yahoo.co.jp/

Option Explicit

Sub yahoo_search()

'-- インターネットに接続してブラウザを開く---
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True

'-- インターネットの特定のページを開く---

objIE.navigate "https://search.yahoo.co.jp/"
Call IEWait(objIE) 'IEを待機
Call WaitFor(3) '3秒停止

'-- IEに自動で文字入力して情報検索する---
Dim s As String '検索文字列
s = "検索" '検索文字列を設定

objIE.document.getElementsByName("p")(0).Value = s
objIE.document.getElementsByTagName("INPUT")(8).Click

objIE.Quit
Set objIE = Nothing

End Sub

'-- IEを待機する関数---
Function IEWait(ByRef objIE As Object)
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents

Loop
End Function

'-- 指定した秒だけ停止する関数---
Function WaitFor(ByVal second As Integer)
Dim futureTime As Date

futureTime = DateAdd("s", second, Now)


While Now < futureTime
DoEvents

Wend
End Function

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる