【问题标题】:Excel VBA change option in the HTML select tagHTML 选择标记中的 Excel VBA 更改选项
【发布时间】:2017-08-31 21:16:20
【问题描述】:

最近,我发布了问题vbscript capture text in the HTML select option tag。这对我在 Internet Explorer 平台上的帮助很大。但是,我有一个新项目,它的网站有点复杂。该网站有多个嵌套表格,这些表格的格式设置为包含form 元素。我和我的团队已经弄清楚如何在除下拉框(select 标签)之外的大多数元素中获取和设置数据。我们能够从下拉列表中获取文本,但我们无法更改值。相反,所有选项都被清除,整个下拉列表为空白。

这是网站代码的修订版本,因为涉及的代码更多,但仅显示相关代码:

<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 名称 txt_input1。此代码将为我们提供下拉列表中的整个列表:

objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).innerText

我尝试将 select 下拉列表的值从“--Select User--”更改为列表中的名称之一,代码如下:

objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).innerText = "Carl Lister"

这导致了空白下拉菜单。如果我将结尾更改为.Value,它只会从显示中删除“--Select User--”。它仍然没有将值更改为“Carl Lister”。在嵌套表中的 select 下拉列表中选择 option 时,我们是否遗漏了什么?

【问题讨论】:

    标签: html excel drop-down-menu vba


    【解决方案1】:

    对于select 元素,更改显示值的最佳方法是“选择”属于菜单一部分的option 元素之一。为此,您可以像这样更改代码:

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

    上面的代码将选择索引x 处的子节点(option 元素)并以编程方式选择它,因此该值将显示在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 有点生疏,如果有任何语法错误,我深表歉意。)

    【讨论】:

    • 好的,可以这么说,Amy Jones 离开公司,Isabella Martin 被录用。 x = 0 不再是 Amy Jones,而是 Brian Wyatt,但我可能会在 Amy 还在公司时为 Carl Lister 分配一些东西,然后,当她离开时,x = 2 将不再等于 @987654339 @,现在是 Daniel Michaels。有没有办法通过人名而不是索引号进行选择?还是上面的代码就是这样做的,而我读得太多了?
    • 不,肯定有办法做到这一点。这只是找出最佳方法的问题。例如,您的选项的 value 属性都是 4 位数字;这些是唯一的员工识别号吗?如果是这样,您可以更改代码以使用特定数字来定位选项,例如if option.value == '0123'。这样一来,添加或删除员工的顺序就无关紧要了。
    • ... 或者,如果您愿意,也可以按员工姓名进行操作。只需使用innerText 遍历当前存在的名称并选择正确的名称即可。
    • 不,员工 ID 在括号中。我以前在另一个程序中使用过这些值,但那是用于不会改变的信息。员工姓名、ID 以及可能的 option value 可能会发生变化,因此,我希望能够模拟为 Carl Lister 键入“CAR”并让它弹出......这在手动键入时确实有效。
    • 对于员工姓名的循环,我是否需要查看option value="0345" 是否等于Carl Lister?不知道我们是如何设置的,但这是我想去的选项。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      相关资源
      最近更新 更多