HTML select标记中的Excel VBA更改选项

时间:2017-08-30 14:48:56

标签: html excel-vba drop-down-menu vba excel

最近,我发布了问题vbscript capture text in the HTML select option tag。这对我在Internet Explorer平台上的帮助很大。但是,我有一个新项目,网站有点复杂。该网站有多个嵌套表格,其格式设置为容纳$(document).ready(function(){ $('#device_select').change(updateURL); $('#face_select').change(updateURL); $('#position_select').change(updateURL); }); 个元素。我和我的团队已经找到了如何在大多数元素中获取和设置数据,除了下拉框(function listenForChanges(){ $('#device_select').change(updateURL); $('#face_select').change(updateURL); $('#position_select').change(updateURL); } 标记)。我们可以从下拉列表中获取文本,但我们无法更改该值。相反,所有选项都被清除,整个下拉列表都是空白的。

这里是网站代码的修订版,因为涉及的代码要多得多,但只显示了相关的代码:

document.ready

为了能够从下拉列表中获取文本,我们在查找包含下拉列表的表中的节点后使用$(document).ready(listenForChanges); 名称form。此代码将为我们提供下拉列表中的完整列表:

select

我已尝试更改" { - 1}}下拉菜单的值 - 选择用户 - "使用以下代码到列表中的一个名称:

<html xmlns="http://www.w3.org/1999/xhtml"> <head>...</head> <body> <form id="form1" action="AssignOFS.aspx" method="post"> <div class="aspNetHidden">...</div> <div class="aspNetHidden">...</div> <table width="100%" align="center" cellspacing="0"> <tbody> <tr> <td> <table width="100%" align="center" cellspacing="0">...</table> </td> </tr> <tr> <td> <table width="100%" align="center" cellspacing="0"> <tbody> <tr>...</tr> <tr>...</tr> <tr class="tr_data">...</tr> <tr> <td align="center"> <div id="pnlBtn1">...</div> <div id="pnlView"> <table width="100%" align="center" cellspacing="0"> <tbody> <tr>...</tr> <tr>...</tr> <tr class="tr_data"> <td align="center">...</td> <td valign="top">...</td> <td valign="top">...</td> <td valign="top">...</td> <td nowrap="" valign="top">...</td> <td align="left">...</td> <td align="center">...</td> <td align="center"> <select name="user" class="txt_input1" id="user" onchange="javascript:addUser(227);"> <option value="">--Select User--</option> <option value="0123">Amy Jones (000456321)</option> <option value="0432">Brian Wyatt (000745632)</option> <option value="0345">Carl Lister (000874563)</option> <option value="0654">Daniel Michaels (000987456)</option> <option value="0567">Elizabeth Sweeny (001456321)</option> <option value="0876">Fran Tarris (001745632)</option> <option value="0789">Gail McMurphy (001874563)</option> <option value="1098">Hannah Barisce (001987456)</option> </select> </td> </tr> </tbody> </table </div> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </form> </body> </html>

这导致空白下拉。如果我将结尾更改为class,则只删除&#34; - 选择用户 - &#34;从被显示。它仍然没有将价值改为&#34; Carl Lister&#34;。在嵌套表格中txt_input1下拉列表中选择objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).innerText时,我们是否会遗漏某些内容?

2 个答案:

答案 0 :(得分:2)

对于select元素,更改显示值的最佳方法是&#34;选择&#34;其中一个option元素是菜单的一部分。为此,您可以像这样更改代码:

objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).childNodes(x).selected = true

上面的代码将在索引option处选择子节点(x元素)并以编程方式选择它,以便该值将显示在select元素中。选项的索引从0开始,因此x = 0选择第一个选项(在本例中为Amy Jones)。

您还可以将上述代码简化为:

objIE.Document.getElementsByClassName("txt_input1")(0).childNodes(x).selected = true

或者您甚至可以id执行此操作,因为您已为该菜单分配了ID:

objIE.Document.getElementById("user").childNodes(x).selected = true

如果您想从下拉列表中选择员工姓名,您可以遍历现有选项并找到正确的选项(代码改编自this question中的VBA代码):

Dim el As IXMLDOMNode
Dim childNode As IXMLDOMNode

el = objIE.Document.getElementById("user")

For Each childNode in el.ChildNodes
    If InStr(childNode.innerText, emplName) Then
        childNode.selected = true
        Exit For
    End If
Next childNode

在此示例中,emplName是您要选择的员工。

(我的VBA有点生疏,所以如果任何语法都关闭,我会道歉。)

答案 1 :(得分:2)

谢谢@freginold,感谢您的帮助。我和我的团队提出了一个解决方案,扩展了我们已经开发的解决方案。

tdNode = 64
i = 0

For Each objOption In objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Options
    Q(i) = objOption.Text & "-" & objOption.Value
    QNm = QNm & "|" & Q(i)
    i = i + 1
    If objOption.Selected Then
     strWQ = objOption.Text
    End If

    If i > 53 Then
       MsgBox "stuck"
       SetEverythingToNothing
    End If

Next

QNm = QNm & "|=" & strWQ

a = 1
MyArray = Split(QNm, "|")

For a = LBound(MyArray) To UBound(MyArray)
    If InStr(MyArray(a), UserName) Then
        strWQ = MyArray(a)
    End If
Next

SelQ = Mid(strWQ, InStr(strWQ, "-") + 1, Len(strWQ) - InStr(strWQ, "-"))

For Each objOption In objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Options
    If objOption.Value = SelQ Then
        objOption.Selected = True
        objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).OnChange
    Else
        objOption.Selected = False
    End If
Next