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

2023-12-07

最近,我发布了一个问题vbscript 捕获 HTML 选择选项标记中的文本。这对我在 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 name txt_input1在表中找到保存下拉列表的节点后。此代码将为我们提供下拉列表中的整个列表:

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

我尝试过改变的值select使用以下代码从“--选择用户--”下拉到列表中的名称之一:

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

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


For a select元素,更改显示值的最佳方法是“选择”其中之一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

如果您想从下拉列表中选择员工姓名,您可以循环遍历现有选项并找到正确的选项,如下所示(代码改编自 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 有点生疏,所以如果有任何语法错误,我深表歉意。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel VBA 更改 HTML 选择标记中的选项 的相关文章

随机推荐

  • 每次在 getView 中视图都会膨胀。 findViewById(...) 已执行多次。我用过View Holder

    public View getView final int pos View arg1 ViewGroup arg2 ViewHolder holder View view arg1 if arg1 null holder new View
  • 如何使用 python 写回到谷歌文档电子表格中的某个单元格

    所以问题是 我从电子表格中的行的第一列 例如 A2 获取一些信息 然后我将对该信息进行一些检查 之后我想将结果写回该行的下一列 我怎么做 是否有某种功能可以让我指示后面 前面 上面 下面的列 所以我可以在该单元格中写入信息 当然 Pytho
  • python AttributeError:模块“pygame”没有属性“display”

    我开始使用 Python 特别是 pygame 模块 但是当我尝试创建一个窗口时 会发生此错误 gt gt gt import pygame gt gt gt width height 300 200 gt gt gt screen pyg
  • 另一台机器的时间

    在 C 中 当我们使用 DateTime Now 时 属性值是本地计算机的当前日期和时间 如何获取另一台具有IP地址或机器名称的机器的时间 您可以通过编写一个为您提供当前时间的服务来实现吗 或连接到远程计算机并发送一些 wmi 查询 类似问
  • OnDraw() 未触发,surfaceView 中未绘制任何内容 - Android

    你好 我在水平滚动视图中有一个 SurfaceView 我想通过 onDraw 调用来填充图像 然而 什么也没有绘制 我有一个类 其中的绘图是通过线程 CanvasThread 完成的 public class PanelChart ext
  • R read.csv - 带有特定符号(>)的标题

    当我通过 R 读取 csv 文件时 所有特定符号 gt 例如 csv 文件 用户 gt 75 R 显示用户 75 我怎样才能避免这种情况 您可以使用check names FALSE在你的read csv call From read cs
  • 索引如何提高 mongodb 中的查询性能

    我需要了解 mongo 中的索引如何提高查询性能 目前我的数据库没有索引 我如何为现有数据库建立索引 我还需要创建一个仅用于索引的新字段吗 从根本上来说 MongoDB 中的索引与其他数据库系统中的索引类似 MongoDB 支持 Mongo
  • Visual Studio NugetPackageManager 界面中的“版本”列有何意义? (与“已安装”列不同)

    已安装 列已填充 但 版本 列未填充 版本 栏是什么意思 与 已安装 列不同 我熟悉语义版本的概念 所以我确切地知道版本号的概念对于 nuget 包意味着什么 我想知道到底是什么that列于that接口意思 后续关于空白的问题结束了here
  • 蓝鸟承诺范围

    我刚刚开始使用承诺来尝试清理一些 回调地狱 我决定尝试 bluebird 并在浏览器中运行它 但立即遇到了范围界定问题 有没有办法在新的 Promise 中设置 thisArg 下面的示例显示承诺解析器内的 this 值设置为浏览器窗口 但
  • Bitmap.getPixel 始终返回黑色

    我正在创建一个应用程序 其中涉及获取屏幕部分的颜色 为此 我使用 Bitmap getPixel 方法来检索屏幕的指定像素 然后将其转换为 RGB 格式 以便以后更轻松地进行编码 问题是 当我使用 getPixel 方法时 无论屏幕上是什么
  • 使用 cygwin 在 Windows 上安装 GMP

    我是 C 新手 我必须处理大整数 所以我必须通过 Cygwin 安装 GMP 我能找到的有关安装此程序的任何文档都假设您知道自己在说什么 而我确实不知道 无论如何 我有权利 tar或者其他什么 正确提取它 现在我看到的任何网站都说要运行 c
  • 如何修复 java Apache POI 中的 NotOfficeXmlFileException?

    我正在尝试创建一个新的 Excel 文件 其中仅包含 hello 这是我的代码 import java io File import java io FileInputStream import java io FileNotFoundEx
  • 将 html 文本添加到超大 jquery 图像幻灯片

    我只想将 html 文本添加到著名的图像滑块超大的 这是他们的演示页面 http buildinternet com project supersized slideshow 3 2 demo html 该 html 可以正好位于演示中 m
  • 如何在 shell 脚本中使用远程服务器上的带有远程变量的数组?

    这就是我正在尝试做的 bin bash array local 1 2 3 4 5 ssh user server lt lt EOF index remote 1 echo index remote echo array local in
  • 什么有限状态机捕获具有相同数量的“01”和“10”的二进制字符串?

    我需要帮助设计一个有限状态机 该状态机接受包含尽可能多的模式出现的二进制字符串01作为模式的出现10 我有点很难准确理解哪些字符串应该被接受 哪些字符串应该被拒绝 欢迎任何指导 有问题的语言是什么 包含尽可能多的模式出现的二进制字符串01作
  • 如何更新 Azure 通知中心注册中的过期时间?

    我使用 Azure 通知中心已经有一段时间了 然而 我为一个新项目创建了一个新的通知中心 我注意到一些非常奇怪的行为 每当我创建一个注册时ExpirationDate被设定为12 31 9999 7 59 59 因此 对于某些人来说 我认为
  • 导入 .ics 文件时出现 Google 日历错误

    我很难让我的订阅日历与 Google 日历配合使用 以下 URL 可在 Outlook 和 Apple 日历 iCal 中正常工作 但我收到来自 Google 的错误 您提供的地址不包含有效 iCal 或 GData 格式的日历 我的 UR
  • 调试 python 多处理中的错误

    我正在使用Pool的功能multiprocessing模块以便在不同数据上并行运行相同的代码 事实证明 我的代码在某些数据上引发了异常 但没有给出发生这种情况的精确行 Traceback most recent call last File
  • 使用 Apache Spark (Java) 将 CSV 数据加载到 Dataframe 并转换为数组

    我有一个包含以下数据的 CSV 文件 1 2 5 2 4 2 3 我想将它们加载到具有数组字符串模式的数据框中 输出应如下所示 1 2 5 2 4 2 3 这里已经使用 scala 回答了这个问题 Spark 将字符串列转换为数组 我想在
  • Excel VBA 更改 HTML 选择标记中的选项

    最近 我发布了一个问题vbscript 捕获 HTML 选择选项标记中的文本 这对我在 Internet Explorer 平台上的帮助很大 但是 我有一个新项目 其网站稍微复杂一些 该网站有多个嵌套表格 这些表格的格式可容纳form元素