Excel 以相同名称的网页元素为目标
简短版本: 我需要一种方法来使用Excel的VBA脚本与页面上的下拉列表小部件交互,该页面上有许多这样的小部件,每个小部件都具有相同的类名 长版本: 我正在尝试编写一个vba脚本,该脚本将提供指向以下站点文档的链接: 上面的链接是针对单个产品的。 显然,我希望脚本能够获得任何产品的文档 我遇到的问题是,我需要与嵌套在文档中较远位置的下拉列表交互。 我可以创建一个循环来定位页面中的列表:Excel 以相同名称的网页元素为目标,excel,vba,Excel,Vba,简短版本: 我需要一种方法来使用Excel的VBA脚本与页面上的下拉列表小部件交互,该页面上有许多这样的小部件,每个小部件都具有相同的类名 长版本: 我正在尝试编写一个vba脚本,该脚本将提供指向以下站点文档的链接: 上面的链接是针对单个产品的。 显然,我希望脚本能够获得任何产品的文档 我遇到的问题是,我需要与嵌套在文档中较远位置的下拉列表交互。 我可以创建一个循环来定位页面中的列表: 'Dim NamePeek Set ie = New InternetExplorer ie.Visible
'Dim NamePeek
Set ie = New InternetExplorer
ie.Visible = 1
ie.navigate "https://support.industry.siemens.com/cs/products/6es7516-3an01-0ab0/cpu-1516-3-pn-dp-1mb-prog-5mb-data?pid=578298&mlfb=6ES7516-3AN01-0AB0&mfn=ps&lc=en-WW"
Set Divs = ie.document.getElementsByTagName("div")
For Each Div In Divs
'NamePeek = Div.className
If Div.className = "productfilter mfn" Then
Trigger01 = True
Trigger02 = False
Trigger03 = False
End If
If Div.className = "filtertitle" Then
Trigger02 = True
Trigger03 = False
End If
If Div.className = "dropdown" Then
Trigger03 = True
End If
If Trigger01 And Trigger02 And Trigger03 Then
'This is where the list I'd like to interact with is located.
'Div.selectedIndex = 2
Trigger01 = False
Trigger02 = False
Trigger03 = False
End If
Next Div
我知道'Div.selectedIndex=2将不起作用,因为在Excel中加载网站数据的HtmlLevel对象没有可用的.selectedIndex方法
我尝试用一个下拉列表创建一个简单的测试网页,并使用以下方法成功地与之交互:
Dim target As MSHTML.IHTMLSelectElement
Set ie = New InternetExplorer
ie.Visible = 1
ie.navigate "file:///C:/xxxxxx/dropdowntestwebsite.html"
Set target = ie.document.getElementById("DDList")
target.selectedIndex = 3
因此,我想知道是否可以使用IHTMLSelectElement与Siemens站点上的下拉列表交互,因为没有ID,而且IHTMLSelectElement对象不支持.getElement ByTagName方法。Siemens站点看起来像是在使用某种jquery插件来控制其元素。widgets是addin吗?选择框不是硬编码的,所以不能像简单的选择框那样控制它们,比如说like
ie.getelementbyid("selectbox_div").selectedindex = 2.
您必须找到删除并填充下拉列表的javascript命令,然后通过vba发出该命令,如
Call IE.document.parentWindow.execScript("nameofFunctionHere()", "JavaScript")
我在使用加载项“Select2”作为下拉框的网站上遇到了类似的问题。我刚刚花了几个星期试图使用Select2下拉框修复一个网页,所以我知道您正在经历什么。我不知道MSHTML不能使用getelementbyTagname。也许你应该试着换一种方式。下面是我用来控制打开的网页的代码。当然,页面必须已经在MSIE中打开,并且您必须至少知道文档标题的一部分 下面的代码将为您设置它,然后您可以使用getElementByTagName。有时,您可以将所需元素的父元素作为parentsID.firschild
Sub getSiemensBrowserAlreadyOpen()
Set objShell = CreateObject("Shell.Application")
Set objAllWindows = objShell.Windows
Boolean_indicator = False
Do While Not Boolean_indicator
For Each ow In objAllWindows
If (InStr(1, ow, "Internet Explorer", vbTextCompare)) Then
Set objIterator = CreateObject("Shell.Application")
For x = 0 To objIterator.Windows.Count
On Error Resume Next
current_title = objIterator.Windows(x).Document.Title
current_url = objIterator.Windows(x).Document.Location
If InStr(1, current_title, "Industry Support Siemens") > 0 Then 'is this my webpage?
Set IE = objIterator.Windows(x)
MsgBox "IE was properly set"
GoTo startProcess
Boolean_indicator = True
Exit For
End If
Next x
End If
Set objIterator = Nothing
Next ow
Boolean_indicator = True
Loop
MsgBox "Webpage was not found."
Exit Sub
startProcess:
Set myDoc = IE.Document
'****************************************
' Your operative code here
'****************************************/
Set objShell = Nothing
Set myDoc = Nothing
Set IE = Nothing
End Sub
好的,我将查找javascript函数。代码中的链接正确地选择了所需的产品代码。我在西门子网站上更改了几个其他选择框,然后复制了新的url。当我把它粘贴到一个新标签页时,它打开了页面,显示了我的新更改。也许您可以使用url来选择需要选择的内容。尝试选择单个项目所需的所有内容,然后复制该url。您应该能够找出url的哪一部分控制哪些选择框。找出url代码并将您的选择插入其中可能更容易。我也注意到了这一点。然而,url中有一部分几乎不可能按程序确定:…/cpu-1516-3-pn-dp-1mb-prog-5mb-data?pid=578298。。。我当然可以使用url来选择某些框,但这种方法的问题是试图选择一个算术产品。我不知道这个简单的英语描述会是什么。