Excel VBA заполнить текстовое поле с автозаполнением в IE11 - PullRequest
0 голосов
/ 30 августа 2018

Как заполнить текстовое поле, использующее 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 прослушивателей событий - размытие, dblclick, focus, keydown и нажатие клавиш из javascript. Я попытался найти 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 на «размытие», «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 голосов
/ 05 сентября 2018

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

Еще одна вещь, которую я хотел бы изменить в этом ответе до его совершенства, - заменить приложение. Время ожидания более надежной строкой. Попытка кода ниже не сработала. Любые идеи, как я могу сказать Excel VBA ждать завершения загрузки JavaScript, прежде чем продолжить?

While IE.Busy Or IE.ReadyState <> 4: DoEvents: Wend 
0 голосов
/ 05 сентября 2018

Используя sendkeys, я смог заполнить поле ввода, дождаться появления предложенного ввода в раскрывающемся списке, а затем имитировать нажатие клавиши «Ввод» для регистрации ввода. Я обнаружил, что Application.SendKeys «Enter» не работает, и мне пришлось импровизировать. Я подозреваю, что клавиша «Ввод» может быть связана с событием javascript Keypress.

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 я нажму на другое окно. Я надеюсь, что кто-то найдет более надежное решение.

...