如何使用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在寻找解决方案。
答案 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