どなたかご教示ください。
Webサイトのセレクトボックスを操作するコードを記述しようとしています。
Elementを取得するためのコードを試しているのですが、
Webページの途中までのElementしか取得できません。
getElementsByTagName、~Name、all~など色々試してみましたが、
表の「決算期」以下の行のセレクトボックスを取得しません。
htmlソースを確認してもタグは全く同様に記述されています。
確認しているコードは以下の通りです。
大変恐縮ですが、なにとぞよろしくお願いいたします。
-----------------------------------------------------------------------------------------------
Sub sample()
Dim objIE As InternetExplorer
Dim htmlDoc As Object
Dim strUrl As String
Dim slt As Object '検索日付設定用
Set objIE = CreateObject("Internetexplorer.Application")
strUrl = "https://www2.tse.or.jp/tseHpFront/JJK010010Actio … 'ページのURL
objIE.navigate strUrl
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
Set htmlDoc = objIE.document
'決算期より下の行が取得できない・・・
For Each slt In htmlDoc.getElementsByTagName("select")
Debug.Print slt.outerHTML
Next
MsgBox "終わり"
End Sub
No.3ベストアンサー
- 回答日時:
No2です
>で詳細検索画面を開いてElement取得を試みてダメでした
ご提示のコードで詳細画面は開くと思いますが、そのまま要素の取得をしようとすると失敗するはずです。
なぜなら、ajaxなどの処理を行っているとするならば、クリックしてからブラウザはサーバと通信して内容を書き換えるという手順を踏んでいるはずなので、クリック直後にはまだ求める内容が存在しないからです。
最初にブラウザを表示する時の
DoEvents
の表宇待ちのようなルーチンが必要になります。
仕組みを確認してはいませんのでわかりませんが、ajaxなどの場合はドキュメントが書き換わるわけではありませんので、objIEのstatusをチェックするのではうまくいかないはずです。
何らかの要素の状態を監視すれば良いのかもしれませんし、あるいは、単純に求める要素が追加されるのを待つというロジックでも良いかも知れません。
あるいは、javascriptを解析すれば、直接VBAからサーバにリクエストして表示するという方法もあり得るかも知れません。(サーバサイドのチェック内容にもよりますが)
「詳細検索」クリック後に、DoEventsで待機を入れることで解決しました。
ajax/javascriptが原因なら諦めるところでしたが、何とか理解できる原因でよかったです。
心より感謝・お礼申し上げます。
表の上半分(簡易検索部分)のセレクトやチェックはできていたものの、
更新された画面が表示できていなかったのでおかしいなとは思っていたのですが。
これも同じ原因だったんですね、①上半分の処理(OK)、②下半分のElement取得(空振り)、
の後で詳細検索画面が更新されていた...ということなんですね。
63歳で初めてプログラミングを勉強して1年ちょっとの初心者です。
改めまして、感謝感謝感謝です、ありがとうございました。
No.4
- 回答日時:
No3です
例えば、通信終了まで固定時間待つというものなら簡単に作成できます。
(ただし、固定時間という点が柔軟性にかけますが・・・)
No2に以下のコードに追加して、新しいセレクト要素をピックアップしてみました。
(ウェイトは固定で3秒程度にしてあります)
For i = 1 To 3
Application.Wait Now() + TimeValue("00:00:01")
DoEvents
Next i
Set htmlDoc = objIE.document
For Each slt In htmlDoc.getElementsByTagName("select")
Debug.Print slt.Name
Next
この結果、以下の14個のセレクト要素が取得されます。
(要素のName属性を列挙)
kssnHpuYtiDayFrmDayPd
kssnHpuYtiDayToYearPd
kssnHpuYtiDayToTskPd
kssnHpuYtiDayToDayPd
eqnsskKaisiDayFrmYearPd
eqnsskKaisiDayFrmTskPd
eqnsskKaisiDayFrmDayPd
eqnsskKaisiDayToYearPd
eqnsskKaisiDayToTskPd
eqnsskKaisiDayToDayPd
zmkkKjnKkPd
jirissPd
kizkKguZntCukPd
shiEqnsJkuPd
ホントにありがとございます。
作っておいた以下のサブを呼び出してうまくいきました。
Sub 待機()
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
End Sub
いただいたコードも勉強させていただきます。
ありがとうございました。
No.2
- 回答日時:
No1です
>詳細検索」画面のhtmlソースで「決算期」より下の<select>や<option>タグが確認
>できるのに、何故か「8タグしか」拾ってこないという現象です。
別途に開いて確認したつもりになるのではなく、実際にVBAが開いている画面を確認なさった方が確実です。
・・・で、多分、実際に開いているのはNo1に添付したページと同じものだと想像します。
コード内で(最初のうちに)、
objIE.Visible = True
としておけば、IEが表示されるはずです。(ご提示の内容だと非表示のまま)
ご提示のサイトの仕組みはきちんと調べていませんが、詳細検索ボタンをクリックするとjavascriptの「changeTab()」関数が呼び出されています。
その先の確認はしていませんが、元のソース内にそれらしきHTMはなさそうなので、ajax等でタブ切り替えをして表示しているのかも知れません。
仕組みを調べなくとも手っ取り早く表示するには、手操作を模して当該ボタンをクリックすることで、この方法でもお求めの画面は表示されるはずです。
例えば、単純に当該ボタンをクリックする例を以下にご参考までに。
Sub sample_2()
Dim objIE As Object, htmlDoc As Object
Const strUrl = "https://www2.tse.or.jp/tseHpFront/JJK010010Actio …
Set objIE = CreateObject("Internetexplorer.Application")
objIE.Visible = True
objIE.navigate strUrl
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
Set htmlDoc = objIE.document
htmlDoc.querySelector("div.pagecontents > form > ul > li:nth-child(2) > a").Click
End Sub
No.1
- 回答日時:
こんにちは
ご指定のページは添付図の様な内容です。
「決算期」とあるのは中央の表の最下行に当たると思いますが、それ以降にはフッターくらいしか記述されていません。
>'決算期より下の行が取得できない・・・
ご提示のコードを実行すると、以下の8つのセレクト要素が取得できます。
最後の2個が表中の決算期の行にあるセレクトですね。
これより下の行にはセレクト要素は存在しないと思いますけれど…?
<select name="dspJnKmkMiPd">
<select name="dspJnPd">
<select name="dspSsuPd">
<select name="hnsShzitPd">
<select name="gyshKbnPd">
<select name="bibiTniPd">
<select name="kssnKiPd">
<select name="kssnKi2Pd">
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAで NHK NEWSの NEWSデータ内容取得が できない 1 2023/04/09 12:26
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) outlook マクロが終了しません。 1 2022/09/02 11:14
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VBA/HTML】特定のタグ要素に...
-
bxSliderで動画をスライドごと...
-
パイソンでのカッコ
-
マイページはどこを開くの
-
デジタル時計の時刻合わせの方...
-
エクセルのシート上に別のシー...
-
ウインドウを毎回同じ位置、大...
-
Excelでワードアートや図を常に...
-
[Java] Edgeでのアドレスバー非...
-
Javascript_submit()完了後に処...
-
Yahoo地図でマーカーを表示した...
-
スクリプトって、何ですか?ど...
-
エクセルでポップアップを出し...
-
scrollTopについて
-
一定時間おきにアラームやポッ...
-
PDFを(htmlのように)無限に縦...
-
「Cancel = True」とはどういう...
-
Excel VBAでの右クリックのポッ...
-
ポップアップウィンドウがブロ...
-
window.openで新しいページを後...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VBA/HTML】特定のタグ要素に...
-
ajax
-
(VBS) テキストファイル読込で...
-
JQuery、セレクトボックスをル...
-
VC++のデバッガでvectorの要素...
-
JavaScriptでクリップボードの...
-
WebサイトのHTMLオブジェクトの...
-
VBA HTTPを用いたWEB画面の取...
-
【VB.NET】HTML要素を取得しよ...
-
スプレッドシートのチェックボ...
-
PL/Iについて、教えてください。
-
no confilict で value値が取れな
-
javascriptを一つのjsファイル...
-
エクセルでタグの内容が取得で...
-
マウスの入って来た方向を検出...
-
マイページはどこを開くの
-
デジタル時計の時刻合わせの方...
-
ウインドウを毎回同じ位置、大...
-
エクセルのシート上に別のシー...
-
一定時間おきにアラームやポッ...
おすすめ情報
該当のWebサイトのページはこちらです。
https://www2.tse.or.jp/tseHpFront/JJK010010Actio …
fujillinさま、ご回答誠にありがとうございます。
説明不足な点がございました、大変申し訳ございません。
事象の発生した画面は「詳細検索」をクリックし、
「詳細検索」画面を表示した状態です、画面添付します。
※自分はVBAコードに埋めたリンクで「詳細検索」画面を開きますが、
何度かボタンで開いているためCookieに保存されているせいでしょうか。
申し訳ございませんがURLの「jsessionid~」のため簡易検索になると思います。
「詳細検索」画面のhtmlソースで「決算期」より下の<select>や<option>タグが確認できるのに、
何故か「8タグしか」拾ってこないという現象です。
「簡易検索」「詳細検索」の境目が原因と考えては見たのですが、
htmlソースを見る限り、境目に特別な記述は見られません。
お手数をおかけいたしますが、よろしくお願いいたします。
fujillinさま、何度もありがとうございます。
>実際にVBAが開いている画面を確認....
今回の確認用コードでは考えが及んでいませんでした、未熟です。
但し、現象を認知した元のプロシージャでは以下のコード
For Each objLink In objIE.document.Links
If InStr(objLink.outerHTML, "詳細検索") > 0 Then
objLink.Click
Exit For
End If
Next
で詳細検索画面を開いてElement取得を試みてダメでした。
>javascriptの「changeTab()」関数が呼び出されて....
当初からjavascriptは疑いましたが何分知識がなく、諦めます..
ご回答心より感謝申し上げます。