html - Excel VBA 更改 HTML 选择标记中的选项

标签 html excel drop-down-menu vba

最近,我发布了问题 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>

为了能够从下拉列表中获取文本,在找到保存下拉列表的表中的节点后,我们使用了名称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 = "卡尔·李斯特"

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

最佳答案

对于 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 有点生疏,所以如果有任何语法错误,我深表歉意。)

关于html - Excel VBA 更改 HTML 选择标记中的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45963540/

相关文章:

html - 移动设备上的 Bootstrap 网格布局

button - 具有 'paste date' 功能的命令按钮位于其下一个左侧单元格

c# - 在下拉选择中禁用 MenuStrip 自动隐藏

java - 将 setOnItemSelectedListener 和 onNothingSelected 与微调器一起使用

javascript - angularjs View 在 Controller 完成之前加载

html - 如何相对于固定的导航和页脚移动主要内容

html - 输入标签搞乱对齐

excel - 使用 VBA 通过 Word 控制 Excel 时遇到问题;后期绑定(bind)和早期绑定(bind)不起作用

excel - 是否可以使用 Microsoft Power Query 查询 Google Analytics API?

drop-down-menu - 带有 Mechanize 的复选框和文本区域