プロが教えるわが家の防犯対策術!

VBAでIEの「Web ページからのメッセージ」をクリックする方法を探しています。

検索したところ、解説はたくさんあるのですが、
どうしても理解できないのと、求めている処理とは微妙に違うなどで、
正解にたどり着けません。

やりたい事は、以下の通りです。

************************************

====HTML====

<div id="tourokubuttonbox">
<div id="tourokuid">
<span>確認します</span>
</div>
</div>

====/HTML====

====現在記述しているVBA====

Sub test()
Dim i As Long
Dim objIE As InternetExplorer
Set objIE = CreateObject("Internetexplorer.Application")
objIE.Visible = True
Dim strUrl As String
strUrl = "https://www.■■/"'①「■■」の部分にセル参照でURLを参照したい
objIE.navigate strUrl
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
End Sub

====/現在記述しているVBA====

====サンプルとして見つけたVBA====

Dim obj②不明箇所 As Object
For Each obj②不明箇所 In objIE.Document.getElementsById("tourokubuttonbox")
If InStr(obj②不明箇所.outerHTML, "③不明箇所") > 0 Then
obj②不明箇所.Click
Exit For
End If
Next

====/サンプルとして見つけたVBA====

************************************

まず、上記のHTMLとVBAについて補足します。

(A)HTMLをかなり省略していますが、
  実際には「tourokubuttonbox」のdivがクリックできるようになっています。
(B)そのdivをクリックすると、ダイアログボックスが表示されます。
(C)ダイアログボックスには、「登録しますか?」という確認メッセージが表示されます。
(D)サンプルとして見つけたVBAは、
  HTMLに「tourokubuttonbox」というidがあった時だけ実行されるようになっています。
  (求めているものと合致します)
(E)②と③の「不明箇所」は、サンプルでは下記のように記述されていました。
  ②→objtsugi
  ③→次のページ
  つまり、「次へ」のリンクがあった時だけクリックするコードのようです。

************************************

やりたい事は、下記の通りです。

(1)読み込むHTMLは①のURLをセル参照する。
(2)読み込んだHTMLに「tourokubuttonbox」のdivがあれば、クリックする。
(3)「登録しますか?」というダイアログボックスが表示されたら、
  「OK」をクリックする。

上記3点がやりたい事なのですが、
ダイアログボックスをクリックする解説はたくさんありました。

ですが、冒頭にも書きましたように、どうしても理解できず、
サンプルコードを単体で実行すると正常に処理されるのですが、
それをどのように自分の希望する処理に書き換えればよいか、分かりません。

VBAの知識は、マクロの記録や、
WEBで検索したサンプルコードを試行錯誤しながら変更するレベルです。

「宣言」も含めて、詳細を教えていただけないでしょうか。


恐れ入りますが、どなたかお分かりの方がおられましたら、
ご教授いただけましたら幸いです。

宜しくお願い申し上げます。

質問者からの補足コメント

  • つらい・・・

    >divには実態がないので、span要素のクリックに反応
    div要素をクリックしても反応します。

    >「ダイアログボックス」は同一ページに存在するのか、いわゆる別ウィンドウなのか
    同一ページです。

    >>For Each obj②不明箇所 In objIE.Document.getElementsById("tourokubuttonbox")
    >は間違いとまでは言いませんかが、ナンセンスです。
    該当ページにおいて、「tourokubuttonbox」というIDが有る場合と無い場合があります。
    なので、そのIDがHTMLにある場合のみクリックするという処理をしなければならないので、
    このコードは必要なのです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/04/12 22:06
  • つらい・・・

    お願いします、
    どなたか的確なコードを教えてください。

    本当に困っています。

    どうか、お願いします…

      補足日時:2020/04/13 01:38

A 回答 (4件)

>どなたか的確なコードを教えてください。


ご存知の通り、スクレ―ピングは、対象のHTMLソースコードを解析する必要があります。

ターゲットページを示すなどして頂ければ、共に検証することも出来ますが、、お示しのソースだけでは
判断、代替え案など示す事は難しいですね。

(1)読み込むHTMLは①のURLをセル参照する。は、#2さん回答で

(2)読み込んだHTMLに「tourokubuttonbox」のdivがあれば、クリックする。
 obj②不明箇所.Click で発火するのでしょうか? 
 発火しないなら、#4fujillinさんの回答を参考にしてください。

(3)登録しますか?」というダイアログボックスが表示されたら、
  「OK」をクリックする。
   ダイアログボックスがシステムウィンドウなら#1goold-manさんの回答を参考に成ります。

Dim obj②不明箇所 As Object
なのでObjectとしてobjIE.Document.getElementsById("tourokubuttonbox")から拾って来たいのだと
思いますが、それで良いのかも想像の範疇を超えません。 これに付いては、#2同様に意見です。
基本的には、Idは一意に付けるため、沢山同じIDが存在するターゲットもありますが、、、。
なので
よく?使うのは
Set objbutton = objIE.document.getElementById("tourokuid" )
objbutton.click

>有る場合と無い場合があります。
IFの処理とエラー処理が必要になると思われます。

obj②不明箇所は、 objIE.Document.getElementsById("tourokubuttonbox")の
入れ子(変数)なので名前は解り易ければ任意で良いかと(予約語などを除く) ?変数に関係なくFor Eachでバグらないかな?

InStr(obj②不明箇所.outerHTML, "③不明箇所") > 0  は、<span>確認します</span> なので

"③不明箇所"は、"確認します" で良いと思いますが、、outerHTMLでちゃんと拾っているかも?です。
Objectにname が付いていれば、Object.Name="確認します"でも、、まあ、
Debug.Print などを使い確認しながら行うしかないと思いますね。

ターゲットによっては、スクレ―ピング自体困難な場合もありますので、やはり、的確な回答を得るには、
ターゲットアドレスを表示したほうが、早いかと思います。
    • good
    • 0
この回答へのお礼

正直、かなり悩みましたが、解決しました。
ありがとうございました。

お礼日時:2020/04/19 16:30

No2です



>そのIDがHTMLにある場合のみクリックするという処理をしなければ
>ならないのでこのコードは必要なのです。
他のスクリプトだと要素が存在しない場合はNULLが返さりたりするので、そのまま処理を続けられますが、先ほど試してみたところ、VBAの場合は存在しない要素を取得しようとするとエラーになるようですね。
(Excel 2013 ver15.0の場合)

通常なら要素の有無を判定するのに取得してからIF文で有無を確認できますが、どうやらVBAの場合はエラー処理で判定する必要があるようです。
多分、ご提示のコードも判定はうまくいかないのではないでしょうか?
(いずれにしてもまわりくどい記述であることに変わりはありませんが、そういうのがお好みのようなので、お好きにどうぞ。)


>>「ダイアログボックス」は同一ページに存在するのか、
>>いわゆる別ウィンドウなのか
>同一ページです
であるなら、最初から直接その「OK」ボタンをクリックすることで、ご質問の目的は果たせるのではないかと想像します。
(ページの仕組みが不明のままなので、あくまでも想像ですけれど)
表示/非表示に関わらず、クリックに対応した処理が行われる可能性が高いと思いますので。(表示状態をチェックしている可能性が無いとは言いませんが、そのチェックにあまり意味があるとは思えないので、多分チェックはしていないものと想像しました)
わざわざ「tourokubuttonbox」をクリックする必要などないのでは?

とは言え「OK」ボタンだけクリックしても何も登録していないので、その前にどこかに登録すべき内容を記入するのが一般的だと思いますけれど??(謎)


>どなたか的確なコードを教えてください。
適切な情報が無ければ、的確なコードは(まず)期待できないと思いますよ。


以下、質問者様にとって参考になるのかわかりませんが・・・
・ID、PASSを入力してログインする例
https://oshiete.goo.ne.jp/qa/11570220.html

・ajax対応で、表示要素をクリックしてから新しい内容を取得する例
https://oshiete.goo.ne.jp/qa/11556863.html

※ ちなみに、「ページの仕組み」と言っているのは「○〇を押したら△△が表示される」というような表面上の事象のことではなく、そのページがどのような仕組みでそれを実現しているかということを意味しています。
そのあたりの仕組みに関しての簡単な回答例を以下に
https://oshiete.goo.ne.jp/qa/11501267.html
    • good
    • 0
この回答へのお礼

ありがとうございました。
参考にさせて頂きます。

お礼日時:2020/04/19 16:32

こんにちは



対象になっているページの仕組みを調べて、それに合った方法を取らないとうまくいかない可能性が高いと思われます。

例えば、
>そのdivをクリックすると、ダイアログボックスが表示されます。
ご提示のHTMLが正しいとするならdivには実態がないので、span要素のクリックに反応するようになっているのではないかという疑問があります。
divをクリックしても動作するようになっているのでしょうか?
更には、クリックによって開かれる「ダイアログボックス」は同一ページに存在するのか、いわゆる別ウィンドウなのか等によっても対処方法はまったく変わってきます。

また、ご提示のコードの
>For Each obj②不明箇所 In objIE.Document.getElementsById("tourokubuttonbox")
は間違いとまでは言いませんかが、ナンセンスです。
なぜなら、getElementsByIdで取得するのは単数要素であり、まともなHTMLなら同一IDの要素を複数設けていることはないはずですから。(文法違反なので)
先ずは、対象ページの仕組みをキチンと調べることから始める必要があるでしょう。

Webページに関係なく回答できそうなのは、
>(1)読み込むHTMLは①のURLをセル参照する。
くらいでしょうか。
URLそのものは文字列なので、文字列演算で目的のURLを作成すればすみます。
例えば、
strUrl = "https://www." & Range("対象セル").Text & "/"
とか。
この回答への補足あり
    • good
    • 0

システムウィンドウがWebブラウザ制御(IEブラウザ制御)で出現したら、コードを元に試し、Sub〜~EndSubの本番プログラムの手前に、システム制御を行うためのプログラム記載の準備が必要。


https://nkmrdai.com/231-2/#Web%E3%83%9A%E3%83%BC …
    • good
    • 1

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

このQ&Aを見た人はこんなQ&Aも見ています