
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で検索したサンプルコードを試行錯誤しながら変更するレベルです。
「宣言」も含めて、詳細を教えていただけないでしょうか。
恐れ入りますが、どなたかお分かりの方がおられましたら、
ご教授いただけましたら幸いです。
宜しくお願い申し上げます。
No.5ベストアンサー
- 回答日時:
>どなたか的確なコードを教えてください。
ご存知の通り、スクレ―ピングは、対象の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 などを使い確認しながら行うしかないと思いますね。
ターゲットによっては、スクレ―ピング自体困難な場合もありますので、やはり、的確な回答を得るには、
ターゲットアドレスを表示したほうが、早いかと思います。
No.4
- 回答日時:
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
No.2
- 回答日時:
こんにちは
対象になっているページの仕組みを調べて、それに合った方法を取らないとうまくいかない可能性が高いと思われます。
例えば、
>その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 & "/"
とか。
No.1
- 回答日時:
システムウィンドウがWebブラウザ制御(IEブラウザ制御)で出現したら、コードを元に試し、Sub〜~EndSubの本番プログラムの手前に、システム制御を行うためのプログラム記載の準備が必要。
https://nkmrdai.com/231-2/#Web%E3%83%9A%E3%83%BC …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAで NHK NEWSの NEWSデータ内容取得が できない 1 2023/04/09 12:26
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別フォームから戻ったときのイ...
-
VB2005 DataGridView上でクリッ...
-
「Cancel = True」とはどういう...
-
別ページからのタブ切り替えの...
-
Outlookのエラー表示について
-
エクセルのシート上に別のシー...
-
ウインドウを毎回同じ位置、大...
-
デジタル時計の時刻合わせの方...
-
スクリプトって、何ですか?ど...
-
マイページはどこを開くの
-
[Java] Edgeでのアドレスバー非...
-
Outlookでこのような表示がされ...
-
ウィンドウが閉じない
-
ホームページ全体を拡大・縮小...
-
メッセージ
-
Excelでワードアートや図を常に...
-
表示するウィンドウのサイズを...
-
Javascript_submit()完了後に処...
-
一定時間おきにアラームやポッ...
-
自動テストツールを利用してス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「Cancel = True」とはどういう...
-
別フォームから戻ったときのイ...
-
VB2005 DataGridView上でクリッ...
-
excelのタスクバーアイコンが・...
-
エクセル アプリケーションの...
-
Perlで数値(小数点、負の数、...
-
【C#】ラベルのダブルクリック...
-
VB6.0のEnabledをfalseにしても...
-
【ImageMagick】 PDF → JPG 変...
-
MSFlexGrid
-
エクセル:マクロを実行してい...
-
処理終了後のに砂時計が、クリ...
-
vba IE操作で こういう事って...
-
DLLが LoadLibrary() でロー...
-
C# マウスオーバーの記述方法
-
JSPページがダウンロードになっ...
-
フォームの値を取得できません...
-
同一の検索値が複数存在する場...
-
遷移元を知りたい。
-
マウスオーバー時に効果音を鳴らす
おすすめ情報
>divには実態がないので、span要素のクリックに反応
div要素をクリックしても反応します。
>「ダイアログボックス」は同一ページに存在するのか、いわゆる別ウィンドウなのか
同一ページです。
>>For Each obj②不明箇所 In objIE.Document.getElementsById("tourokubuttonbox")
>は間違いとまでは言いませんかが、ナンセンスです。
該当ページにおいて、「tourokubuttonbox」というIDが有る場合と無い場合があります。
なので、そのIDがHTMLにある場合のみクリックするという処理をしなければならないので、
このコードは必要なのです。
お願いします、
どなたか的確なコードを教えてください。
本当に困っています。
どうか、お願いします…