VBA でWeb上のボタンをクリックするスクリプトが上手く書けません。
対象となるサイトは下記のソースの
この「終業打刻」ボタンをクリックするスクリプトが上手くかけません。
HTML
1<table class="PS_dataLine table2" width="400"> 2<tbody><tr> 3<th colspan="2" class="th_1" width="35%" id="today">2019年08月01日 (木) 13:43</th> 4</tr> 5<!-- 日付データ --> 6 7</td> 8</tr> 9<tr height="50"> 10<!-- 打刻終了時間:ボタン --> 11<th class="th_2" id="timeCloseButton"> 12<input type="button" name="btTimePunchEnd" value="終業打刻" onclick="execClose()"> 13</th> 14<!-- 打刻終了時間:表示 --> 15<td class="td_time_punch" id="timeClose"> 16 17 18</td> 19</tr> 20<tr height="30"> 21<td class="td_1_center" colspan="2" id="message"> 22 23</td> 24</tr> 25</tbody></table>
以下のコード1~4は↑のページにたどり着くためのコードで、
コード5として「終業打刻」をしたいと思っています。
VBA
1Sub 終業打刻() 2' 3' 就業打刻 Macro 4'---コード1|インターネットに接続してブラウザを開く--- 5 Dim objIE As InternetExplorer 6 Set objIE = CreateObject("InternetExplorer.Application") 7 objIE.Visible = True 8 9'---コード2|インターネットの特定のページを開く--- 10 objIE.navigate "https://jkap2.ffpri.go.jp/UPDSTMG/package/auth/view/Login.html" 11 Call IEWait(objIE) 'IEを待機 12 Call WaitFor(1) '1秒停止 13 14 15 16'---コード3|自動でログイン--- 17 18 Dim htmlDoc As HTMLDocument 19 Set htmlDoc = objIE.document 20 21 With htmlDoc 22 .getElementById("txtAccount").Value = "******" 'ユーザー名を指定 23 .getElementById("txtPassword").Value = "****" 'パスワードを指定 24 .getElementById("fm:idLoginButton").Click 25 End With 26 27 Call WaitFor(1) '1秒停止 28 29 30 31'---コード4|ウェブ上のボタンを自動でクリックして次へ--- 32 objIE.document.Script.setTimeout "javascript:setPermaLink('/UPDSTMG/package/view/Site.html?psSite=TMG_INP')", 1 33 34 Call WaitFor(3) '1秒停止 35 36'---コード5|終業打刻--- 37 38objIE.document.getElementsByName("btTimePunchEnd")(0).click 39 40 41End Sub
試したこと
以下を試しましたが、ダメでした。
VBA
1objIE.document.getElementsByName("btTimePunchEnd")(0).click
↑「オブジェクトはこのプロパティまたはメソッドをサポートしていません」と出てしまいます。
VBA
1objIE.document.getElementById("timeCloseButton").getElementsByTagName("input")(0).click
↑「オブジェクト変数またはwithブロック変数が設定されていません」と出てしまいます。
VBA
1objIE.navigate "javascript:execClose();"
VBA
1objIE.document.Script.setTimeout "execClose();", 1 2
↑この2つはエラーメッセージは出ませんが、何も起きません。
ご教授のほど、よろしくお願いします。
コード4のところの遷移画面です。
HTML
1 2<TABLE><TBODY> 3<TR> 4<TD onclick="javascript:setPermaLink('/UPDSTMG/package/view/Site.html?psSite=TMG_INP')" class=PS_siteLinkDesc style="CURSOR: pointer; BACKGROUND: url(/UPDSTMG/package/component/images/icon_personalSite.gif) no-repeat left 50%"> 5<DL> 6<DT class=PS_siteLink><A href="javascript:setPermaLink('/UPDSTMG/package/view/Site.html?psSite=TMG_INP')">就業入力サイト</A> 7<DT>あなたの就業実績情報を入力できます</DT></DL></TD> 8<TD onclick="javascript:setPermaLink('/UPDSTMG/package/view/Site.html?psSite=TMG_PERM')" class=PS_siteLinkDesc style="CURSOR: pointer; BACKGROUND: url(/UPDSTMG/package/component/images/icon_talentManagement.gif) no-repeat left 50%"> 9<DL> 10<DT class=PS_siteLink><A href="javascript:setPermaLink('/UPDSTMG/package/view/Site.html?psSite=TMG_PERM')">就業承認サイト</A> 11<DT>承認者・代理承認者用サイトです</DT></DL></TD> 12<TD class=PS_siteLinkDesc> </TD> 13<TD class=PS_siteLinkDesc> </TD></TR></TBODY></TABLE>
そもそもgetElementsByName()で指定のElementはとれていますか?
あとコードはマークダウンのcode機能を利用してご提示ください。
https://teratail.com/help#about-markdown
1番目2番目のパターンで正常に動きました。
問題点を明らかにするため、該当コード全体を載せることはできるでしょうか?
コメントありがとうございます。
修正、追記いたしました。
よろしくお願いします。
setPermaLink() では画面遷移が発生しているのでしょうか?
出張につき返信が遅れました。
setPermaLink() では画面遷移があります。
コード3でログイン画面でログインをして現れる画面で、コード5で終業ボタンを押すための画面の間に1画面あるため、終業ボタンを押す画面へ移行するボタンをクリックしています。
画面遷移があるのであれば、
Call IEWait(objIE) 'IEを待機
をそのあとにも追加してみたらどうなるでしょうか?
x_x様
ありがとうございます。
特に変化はありませんでした。これまでも Call WaitFor(3)で3秒おいてみていました。
その後これも追加で
Set htmlDoc = objIE.document
何度もコメントありがとうございます。
確認ですが、コード4の Call WaitFor(3) を
Call IEWait(objIE) 'IEを待機
Set htmlDoc = objIE.document
に置き換える、ということでよろしいでしょうか?
しかし、残念ながら当初と同様のエラーが出てしまいます。
setPermaLink の内容を提示できるでしょうか?
コメントありがとうございます。
すいません、「setPermaLink の内容を提示」とはどういうことでしょう?
画面遷移のところのHTMLを載せておきます。
コード4で就業入力サイトをクリックして、コード5のページに移行します。
すみません、htmlDoc は使ってなくて関係なかったですね。
現状、setPermaLink() で画面遷移している方法が不明なので、どのように待ったらいいかわかりません。
最初に提示されている HTML が Site.html ですか?
コメントありがとうございます。
はい、最初に提示しているHTMLが打刻するサイトの打刻ボタンがある周辺のHTMLです。