IE11中具有自动完成功能的Excel VBA填充文本框

时间:2018-08-30 04:37:48

标签: javascript excel vba excel-vba internet-explorer-11

如何使用Excel VBA填充一个使用javascript建议可用条目的文本框?手动填充文本框后,我将开始输入几个字母,然后在文本框下方显示可供选择的可用输入列表。我需要用鼠标单击或使用箭头键导航至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的模糊,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

,没有任何效果。

有人可以帮忙吗?我想我已经用尽了google在寻找解决方案。

2 个答案:

答案 0 :(得分:0)

使用sendkey,我能够填充输入框,等待建议的输入出现在下拉框中,然后模拟“ 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执行过程中的任何时候我单击另一个窗口,该脚本都将失败。我希望有人会提出更可靠的解决方案。

答案 1 :(得分:0)

Y-E-S!我终于找到了在不使用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时间。尝试下面的代码不起作用。有什么想法可以告诉Excel VBA等待javascript完成加载然后继续吗?

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