Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
「Microsoft Web Browser」コントロールでの操作2
投稿日時: 21/10/19 13:20:09
投稿者: コンギョ

いつもありがとうございます。
 
Microsoft Web Browserコントロールを配置してwebページを操作しようとしています。
件名:「Microsoft Web Browser」コントロールでの操作の続きです。
https://www.moug.net/faq/viewtopic.php?t=80983
 
前の質問で開いたページで今度はボタンでは無く、青い文字のリンクをクリックしたいのですが名前やIDがない為どうしたらいいかわかりません。
 
<A class=cateName href="javascript:window.open('EventId=sks550')">topix </A>
 
また手動でクリックすると、IEが立ち上がってしまい、別のウィンドウで起動してしまいます。
これをもう1つのMicrosoft Web Browserコントロールに表示して出てきた画面を操作したいです。
 
どうぞよろしくお願いいたします。

投稿日時: 21/10/20 09:09:06
投稿者: コンギョ

いつもありがとうございます。
 
別のウィンドウで開く件は、解決したので残る問題は下記になります。
またリンクのHTMLも変わりました。
 
青い文字のリンクをクリックしたいのですが名前やIDがない為どうしたらいいかわかりません。
  
<a href="javascript:parent.mf.pfind();" shape="">pfind</a>
  
どうぞよろしくお願いいたします。

回答
投稿日時: 21/10/22 13:23:15
投稿者: hatena
投稿者のウェブサイトに移動

下記が参考になるかと。
 
VBAでIE操作「aタグ(ハイパーリンク)をクリックする」【エクセルマクロ】 | VBA Create https://vba-create.jp/vba-ie-hyperlink-a-click/

投稿日時: 21/10/25 09:50:08
投稿者: コンギョ

hatena様
 
ありがとうございます。
 
早速試しましたが、対象のwebページがjavascriptで開いているせいか、aタグを見つけることができません。
 
Debug.Print Me.webView.Object.Document.body.innerHTML
 
としても、目的のwebページのタイトル行のようなものしか表示されないので、HTMLを解析できません。
なので、aタグ検索をしても1回もループしないで終わってしまいます。
「Microsoft Web Browser」コントロールではjavascriptで開いたページの操作は無理なのでしょうか。
このあと、aタグで開いたページを読み取るまでがゴールなのですが、開いたページのデータを取得ってそもそもVBAでできますでしょうか。
 
よろしくお願いします。

回答
投稿日時: 21/10/25 09:57:25
投稿者: hatena
投稿者のウェブサイトに移動

コンテンツが動的に生成されるページの場合は、生成されるまで、待機する必要がありますね。
APIのSleep関数で待機させるといいでしょう。
Sleep関数に関しては検索すればサンプルコードはすぐ見つかります。
 
さらに、aリンクが見つからない場合は、見つかるまで、少し待機して繰り返すとというループ処理にすればより確実です。

投稿日時: 21/10/25 15:30:54
投稿者: コンギョ

hatena様
 
いつもありがとうございます。
 
そもそも.Navigate で表示しているURLから移動できていないことがわかりました。
いろいろ調べてやってみたのですが
Dim htmlDoc as HTMLDocument
Set htmlDoc = Me.webView.Object.Document
***ページに入力→クリック→待つ***
Set htmlDoc = Nothing
Set htmlDOc = Me.webView.Object.Document
 
Debug.Print htmlDoc.documentElement.innerHTML ←最初のまま
 
試しにIEでやってみましたが、切り替えができていました。
 
「Microsoft Web Browser」コントロールではできないのでしょうか。
 
よろしくお願いします。

投稿日時: 21/11/01 23:22:53
投稿者: コンギョ

いつもありがとうございます。
 

引用:
コンテンツが動的に生成されるページの場合は、生成されるまで、待機する必要がありますね。
APIのSleep関数で待機させるといいでしょう。

何秒待機させてもコンテンツが動的に生成されることはありませんでした。
 
いろいろ試した結果、コンテンツが動的に生成される直前のクリックのすぐ後に「DoEvents」を入れることですんなり解決しました。(ここまでたどり着くのにすごい時間かかりましたが。。)
 
For Each element In Me!webView.Document.all
    If element.getAttribute("className") = "button" Then
        element.Click
    DoEvents '←ここに入れるだけ
        Exit For
    End If
Next
 
Sleep関数はページの生成が遅い場合に有効なので、必要な場合に使用したいと思います。
 
どうもありがとうございました。