Excel VBA在IE11中使用自动完成填充文本框

Posted

技术标签:

【中文标题】Excel VBA在IE11中使用自动完成填充文本框【英文标题】:Excel VBA fill textbox with autocomplete in IE11 【发布时间】:2018-08-30 04:37:47 【问题描述】:

如何填充使用 javascript 的文本框以使用 Excel VBA 建议可用条目?手动填写文本框,我会开始输入几个字母,我可以选择的可用输入列表将出现在文本框下方。我需要用鼠标单击或使用箭头键在 javascript 下拉框中导航到我想要的条目,然后单击 Enter。

这是与其他常规输入框的主要区别。如果我只是在输入框中输入文本并继续下一个输入框而不从下拉框中选择条目,则输入不会注册。所以我不能简单地找到输入框的元素并改变它的值。我相信我需要执行激活下拉框的 javascript,然后我必须从中选择。

输入文本框的 html 代码是:

<td id="input2" class="createInputField" colspan="0" valign="middle"
  <input value="" id="" name="docTypeDisplay" title="Document Type" size="18" type="text">
  <input value="" name="docType" type="hidden">
  <input value="" name="docTypeID" type="hidden">                                    

上面代码的第一个输入标记行上有 5 个事件侦听器 - 来自 javascript 的 blur、dblclick、focus、keydown 和 keypress。我尝试查找 javascript,但它不容易理解并且是 H-U-G-E!所以考虑到这个限制,这就是我尝试过的:

IE.Document.getElementById("input2").getElementsByTagName("input")(0).Value = "Monthly Report"
Set objEvent = IE.Document.createEvent("HTMLEvents")
objEvent.initEvent "change", False, True
IE.Document.getElementById("input2").getElementsByTagName("input")(0).dispatchEvent objEvent

通过将 objEvent.initEvent 中的第一个参数更改为“blur”、“dblclick”、“focus”、“keydown”和“keypress”。我没有收到任何错误,并且输入没有注册。

那我试过了:

IE.Document.getElementById("input2").getElementsByTagName("input")(0).Value = "Monthly Report"       
IE.Document.getElementById("input2").getElementsByTagName("input")(0).FireEvent ("onchange")

也试过了:

IE.Document.getElementById("input2").getElementsByTagName("input")(0).Focus  
IE.Document.getElementById("input2").getElementsByTagName("input")(0).Value = "Monthly Report"
IE.Document.getElementById("input2").getElementsByTagName("input")(0).Blur

没有任何效果。

有人可以帮忙吗?我想我已经筋疲力尽了谷歌寻找解决方案。

【问题讨论】:

我猜没有网址可以分享?您是否尝试过组合事件?有时你需要一个特定的顺序来模仿你的键盘动作。我有时会发现 SendKeys down 和 tab 可能是有用的技巧。 @QHarr,你是对的,抱歉没有可分享的 URL。我尝试以不同的顺序和组合调用 javascript 事件,但没有任何效果。这是大海捞针,因为我什至不确定每个事件应该做什么。我会说我已经能够激活表单中的下拉输入框: Set objEvent = IE.Document.createEvent("HTMLEvents") objEvent.initEvent "change", False, True IE.Document.getElementById("DropdownInput" ).dispatchEvent objEvent 【参考方案1】:

使用 sendkeys,我可以填写输入框,等待建议的输入出现在下拉框中,然后模拟“Enter”键来注册输入。我发现 Application.SendKeys "Enter" 不起作用,所以我不得不即兴发挥。我怀疑“Enter”键可能与 Keypress javascript 事件有关。

IE.Document.getElementById("input2").getElementsByTagName("input")(0).Focus
Application.SendKeys "Monthly Report"
Application.Wait (Now + TimeValue("0:00:05"))   'Wait for javascript to fire and suggest an input
Application.SendKeys "~"    'This simulates an "Enter" keypress on the first suggested input

如果在 Excel VBA 执行期间的任何时候单击另一个窗口,此脚本将失败。我希望有人会提出更可靠的解决方案。

【讨论】:

【参考方案2】:

是的!我终于在不使用 SendKeys 的情况下通过反复试验找到了一些东西。感谢@QHarr 建议尝试组合事件,这让我朝着正确的方向前进。所以这对我有用:

'First fill the input box with text
IE.Document.getElementById("input2").getElementsByTagName("input")(0).Value = "Monthly Report"

'Fire the keypress event to start the javascript to suggest an input
Set objEvent = IE.Document.createEvent("keyboardEvent")
objEvent.initEvent "keypress", True, False
IE.Document.getElementById("input2").getElementsByTagName("input")(0).dispatchEvent objEvent

'Wait for a few seconds for the javascript to complete creating the dropdown box
Application.Wait (Now + TimeValue("0:00:05"))

'Select the first suggested input from the dropdown box. I noticed a new element was created when the dropdown box appeared, which I simulated a click on.
IE.Document.getElementById("suggest_input2").getElementsByClassName("object")(0).Click

在完美之前,我只想用这个答案改变一件事,那就是用更健壮的行替换 application.wait time。尝试下面的代码没有用。有什么想法可以告诉 Excel VBA 在继续之前等待 javascript 完成加载吗?

While IE.Busy Or IE.ReadyState <> 4: DoEvents: Wend 

【讨论】:

以上是关于Excel VBA在IE11中使用自动完成填充文本框的主要内容,如果未能解决你的问题,请参考以下文章

VBA Excel - 自动填充方法超出范围类错误

在excel 2013中自动填充范围内的特定文本

根据单选按钮选择组合(VBA Excel)用可变文本填充文本框

使用excel VBA仅引用一个数字来自动填充日期

自动填充 Application.Countifs.Formula VBA Excel

Excel / VBA:粘贴数据后自动调整列宽