无法将文本从 Excel 复制到网站,显示 运行-time 错误
Unable to copy text from Excel to website, showing Run-time error
我目前在尝试将文本插入网站“www.skyvector.com”时遇到问题。我一直在尝试在“路线”字段中粘贴一些文本,该字段出现在左上角的灰色框中(通常在单击 'Flight Plan' 之后)。
这是我到目前为止的代码,它适用于其他网站,但奇怪的是不适用于 SkyVector:
Sub test1()
Dim IE As Object
Dim doc As HTMLDocument
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate "http://www.skyvector.com/"
Do While IE.Busy
Application.Wait DateAdd("s", 1, Now)
Loop
Set doc = IE.document
doc.getElementsById("sv_planEditField").Value = "test"
End Sub
不幸的是,当此行设置为 运行:
时会出现错误
doc.getElementsById("sv_planEditField").Value = "test"
错误是“运行-时间错误‘438’:对象不支持此属性或方法”。
我一直在绞尽脑汁寻找解决方案,但我在这里也找不到任何解决方案,特别是对于像 SkyVector 这样工作的网站。我不确定那个网站和任何其他网站之间有什么区别。非常感谢您的宝贵时间!
元素 sv_planEditField
不是普通的文本框。在浏览器中打开它并使用开发人员工具检查它(按 F12)。在填充之前和之后都这样做。您会注意到这与标准输入完全不同。重新创建已填充控件的 html 结构或重新创建表单提交。查看 createElement 和 appendChild 了解更多信息。
首先,方法名不是getElementsById()
。名称是 getElementById()
,没有复数形式的 s
。原因是,一个 ID 只能在 html 文档中使用一次,它是唯一的。
但是如果您使用正确的名称,您将收到没有对象的错误。原因是,没有 ID 名为 sv_planEditField
.
的元素
那你能做什么?您可以使用另一种称为 getElementsByClassName()
的方法,因为有问题的 html 行是
<input autocomplete="false" spellcheck="false" class="sv_search" autocorrect="off">
方法getElementsByClassName()
建立节点集合。因此它使用 s
表示复数。具有相同 class 名称的元素可以有任意多个开发人员想要的。您可以通过它的索引获取特定元素,就像将它与数组一起使用一样。 clss 名称 sv_search
仅在文档中使用过一次。节点集合的第一个索引总是 0
。因此,您必须使用下面的 vba 代码行,而不是您的:
doc.getElementsByClassName("sv_search")(0).Value = "test"
编辑
再次阅读您的问题并理解它之后 ;-) 并且基于 Sam 的回答,这里是您可以解决问题的方法。您需要的是一个新的文本节点和(我认为)触发正确的事件以使输入适用于页面。用原始数据试试。
Sub test1()
Dim IE As Object
Dim textToEnter As Object
Dim nodeToAppendText As Object
Dim nodeText As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate "http://www.skyvector.com/"
Do While IE.Busy
Application.Wait DateAdd("s", 1, Now)
Loop
'Open overlay to enter data
IE.document.getElementsByClassName("sv_topbarlink")(0).Click
'Click textfield to hide helptext and place curser
IE.document.getElementsByClassName("svfpl_helpmessage")(0).Click
'Create a text node which belongs to the document
Set textToEnter = IE.document.createTextNode("Test")
'Get the node you want to append the new text node
Set nodeToAppendText = IE.document.getElementById("sv_planEditField")
'Append the new text node
Set nodeText = nodeToAppendText.appendChild(textToEnter)
'Not sure if it is necessary to trigger an event
'But there are two events in question:
' First one is input
' Second one is keypress
'You must try how it works
Call TriggerEvent(IE.document, nodeToAppendText, "input")
End Sub
如果需要使用此方法触发任何事件:
Private Sub TriggerEvent(htmlDocument As Object, htmlElementWithEvent As Object, eventType As String)
Dim theEvent As Object
htmlElementWithEvent.Focus
Set theEvent = htmlDocument.createEvent("HTMLEvents")
theEvent.initEvent eventType, True, False
htmlElementWithEvent.dispatchEvent theEvent
End Sub
我目前在尝试将文本插入网站“www.skyvector.com”时遇到问题。我一直在尝试在“路线”字段中粘贴一些文本,该字段出现在左上角的灰色框中(通常在单击 'Flight Plan' 之后)。
这是我到目前为止的代码,它适用于其他网站,但奇怪的是不适用于 SkyVector:
Sub test1()
Dim IE As Object
Dim doc As HTMLDocument
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate "http://www.skyvector.com/"
Do While IE.Busy
Application.Wait DateAdd("s", 1, Now)
Loop
Set doc = IE.document
doc.getElementsById("sv_planEditField").Value = "test"
End Sub
不幸的是,当此行设置为 运行:
时会出现错误doc.getElementsById("sv_planEditField").Value = "test"
错误是“运行-时间错误‘438’:对象不支持此属性或方法”。
我一直在绞尽脑汁寻找解决方案,但我在这里也找不到任何解决方案,特别是对于像 SkyVector 这样工作的网站。我不确定那个网站和任何其他网站之间有什么区别。非常感谢您的宝贵时间!
元素 sv_planEditField
不是普通的文本框。在浏览器中打开它并使用开发人员工具检查它(按 F12)。在填充之前和之后都这样做。您会注意到这与标准输入完全不同。重新创建已填充控件的 html 结构或重新创建表单提交。查看 createElement 和 appendChild 了解更多信息。
首先,方法名不是getElementsById()
。名称是 getElementById()
,没有复数形式的 s
。原因是,一个 ID 只能在 html 文档中使用一次,它是唯一的。
但是如果您使用正确的名称,您将收到没有对象的错误。原因是,没有 ID 名为 sv_planEditField
.
那你能做什么?您可以使用另一种称为 getElementsByClassName()
的方法,因为有问题的 html 行是
<input autocomplete="false" spellcheck="false" class="sv_search" autocorrect="off">
方法getElementsByClassName()
建立节点集合。因此它使用 s
表示复数。具有相同 class 名称的元素可以有任意多个开发人员想要的。您可以通过它的索引获取特定元素,就像将它与数组一起使用一样。 clss 名称 sv_search
仅在文档中使用过一次。节点集合的第一个索引总是 0
。因此,您必须使用下面的 vba 代码行,而不是您的:
doc.getElementsByClassName("sv_search")(0).Value = "test"
编辑
再次阅读您的问题并理解它之后 ;-) 并且基于 Sam 的回答,这里是您可以解决问题的方法。您需要的是一个新的文本节点和(我认为)触发正确的事件以使输入适用于页面。用原始数据试试。
Sub test1()
Dim IE As Object
Dim textToEnter As Object
Dim nodeToAppendText As Object
Dim nodeText As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate "http://www.skyvector.com/"
Do While IE.Busy
Application.Wait DateAdd("s", 1, Now)
Loop
'Open overlay to enter data
IE.document.getElementsByClassName("sv_topbarlink")(0).Click
'Click textfield to hide helptext and place curser
IE.document.getElementsByClassName("svfpl_helpmessage")(0).Click
'Create a text node which belongs to the document
Set textToEnter = IE.document.createTextNode("Test")
'Get the node you want to append the new text node
Set nodeToAppendText = IE.document.getElementById("sv_planEditField")
'Append the new text node
Set nodeText = nodeToAppendText.appendChild(textToEnter)
'Not sure if it is necessary to trigger an event
'But there are two events in question:
' First one is input
' Second one is keypress
'You must try how it works
Call TriggerEvent(IE.document, nodeToAppendText, "input")
End Sub
如果需要使用此方法触发任何事件:
Private Sub TriggerEvent(htmlDocument As Object, htmlElementWithEvent As Object, eventType As String)
Dim theEvent As Object
htmlElementWithEvent.Focus
Set theEvent = htmlDocument.createEvent("HTMLEvents")
theEvent.initEvent eventType, True, False
htmlElementWithEvent.dispatchEvent theEvent
End Sub