前提・実現したいこと
VBAでjavascript要素をクリックしようとしていろいろ調べたのすが、うまくできなくて投稿しました。
ご教授宜しくお願い致します。
#発生している問題・エラーメッセージ
該当箇所に
該当箇所
<a href="#" onclick="return execproc('Main.jsp');"
試したコード
objIE.navigate "JavaScipt:return execproc('Main.jsp');"
selecter
body>form>table:nth-child(2)>tbody>tr:nth-child(2)>td:nth-child(1)>a
xpath
/html/body/form/table[1]/tr[2]/td[1]/a
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
onclickの処理なので、.navigateでは無理でしょう。
「execproc('Main.jsp')」 というプロシージャを動かしたいなら、直接
その関数を呼んだほうがてっとり早いです。具体的には
objIE.document.parentWindow.execScript ("execproc('Main.jsp')")
でよいかと。
【参考】
Webページのスクリプトを実行するVBAコード
https://officevba.info/vbaexecscript/
投稿2021/03/19 02:09
総合スコア505
0
ベストアンサー
MSXML2.DOMDocumentなりでXMLパースしても、
それを生のObjectと結びつける手段がないとClickできないんですよね。
とりあえず自力でXPathのElementを取り出すFunctionを作ってみました。
これでどうでしょう? (ただしエラー処理など一切なしです テストでGoogle検索は成功)
VB
1Sub ボタン1_Click() 2 Dim objIE As Object 3 Dim elemTarget As Object 4 Dim sURL As String 5 Dim sXPath As String 6 7 sURL = "http://..." 8 sXPath = "/html/body/form/table[1]/tbody/tr[2]/td[1]/a" '※ tbodyが必要 9 10 'テスト用 Googleで検索ワード'teratail'をいれるまでのURL 11 sURL = "https://www.google.com/?q=teratail" 12 ' Googleの検索ボタンXPath 13 sXPath = "/html/body/div[1]/div[3]/form/div[1]/div[1]/div[3]/center/input[1]" 14 15 'ページ読込 16 Set objIE = CreateObject("Internetexplorer.Application") 17 objIE.Visible = True 18 objIE.navigate sURL 19 20 '読込待機 21 Do 22 If Not objIE.Busy Then Exit Do 23 If objIE.readyState = tagREADYSTATE.READYSTATE_COMPLETE Then Exit Do 24 Application.Wait Now() + TimeValue("00:00:01") 25 Loop 26 27 'XPathでElementを取得 28 Set elemTarget = getElementByXPath(objIE.document.body, sXPath) 29 If Not elemTarget Is Nothing Then 30 elemTarget.Click 31 End If 32End Sub 33 34'注意! Body配下限定:信頼性&汎用性=おそろしく低い(テストゼロ同然で不明) 35Function getElementByXPath(elemParent As Object, sXPath As String, Optional sHerePath As String = "") As Object 36 Dim sSibling As String 37 Dim sTag As String 38 Dim sNewPath As String 39 Dim elem As Object 40 41 If sHerePath = "" Then 42 sHerePath = "/html/body" 43 sXPath = Replace(sXPath, "[1]", "") 44 End If 45 For Each elem In elemParent.Children 46 sTag = LCase(elem.tagName) 47 sSibling = sSibling & "<" & sTag & ">" 48 sNewPath = sHerePath & "/" & sTag & getSiblingIdxStr(sSibling, sTag) 49 If sNewPath = sXPath Then 50 Set getElementByXPath = elem 51 Exit Function 52 End If 53 Set getElementByXPath = getElementByXPath(elem, sXPath, sNewPath) 54 If Not getElementByXPath Is Nothing Then Exit Function 55 Next 56 Set getElementByXPath = Nothing 57End Function 58 59Function getSiblingIdxStr(sSibling As String, sSelfTag As String) As String 60 Dim iCount As Integer 61 iCount = (Len(sSibling) - Len(Replace(sSibling, sSelfTag, ""))) / Len(sSelfTag) 62 If iCount > 1 Then getSiblingIdxStr = "[" & CStr(iCount) & "]" 63End Function
投稿2021/03/19 07:32
総合スコア496
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/19 11:06
2021/03/22 06:08