简短版本:
我需要一种方法来使用Excel的VBA脚本与一个页面上的下拉列表小部件进行交互,该页面上有许多这样的小部件,每个小部件都有相同的类名。
长版:
我正在尝试编写一个vba脚本,该脚本将提供指向以下站点的文档的链接:
上面的链接适用于单个产品。 显然,我希望脚本能够获得任何产品的文档。
我遇到的问题是我需要与嵌套列表进行交互,该列表嵌套在文档中。 我可以创建一个循环来定位页面中的列表:
'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不起作用,因为HTMLDivElement对象没有.selectedIndex方法可以将网站数据加载到Excel中。
我尝试使用一个简单的下拉菜单制作一个简单的测试网页,并使用以下内容成功与之互动:
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与西门子站点上的下拉列表进行交互,因为没有ID且IHTMLSelectElement对象不支持.getElement(s)ByTagName方法。
答案 0 :(得分:0)
西门子网站看起来好像正在使用某种jquery插件来控制它的元素。小部件是一个插件吗?选择框不是硬编码的,因此您无法像简单的选择框那样控制它们,比如说
ie.getelementbyid("selectbox_div").selectedindex = 2.
你必须找到删除并填充下拉列表的javascript命令,然后通过vba发出该命令,例如
Call IE.document.parentWindow.execScript("nameofFunctionHere()", "JavaScript")
我在网站上遇到类似的问题,使用插件" Select2"用于下拉框。
答案 1 :(得分:0)
我花了几周时间尝试使用select2 dropin修复网页,所以我知道你正在经历什么。我不知道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