2016-11-11 4 views
2

Я надеюсь, что кто-то может помочь. Я пытаюсь ускорить процесс заполнения веб-формы, которая должна быть заполнена десятками или сотнями раз с информацией, хранящейся в excel.VBA-Excel: заполнение форм в окне IE

Для этого мне нужна одна кнопка, чтобы открыть окно IE и перейти на страницу входа определенного веб-сайта (я понял, что это бит). Затем пользователь может войти в систему и перейти к форме, которая должна быть заполнена. Затем я хочу, чтобы пользователь мог вернуться на страницу Excel, нажать другую кнопку, которая автоматически заполнит несколько выпадающих списков и текстовых полей.

В Excel у меня уже есть код, позволяющий пользователю искать конкретный набор информации, который нужно отправить в форму, поэтому все, что им нужно сделать, это нажать кнопку, чтобы перенести ее. Первый бит кода только это:

Public IE As Object 

Public Sub OpenIE() 
    Set IE = CreateObject("InternetExplorer.Application") 
    IE.Visible = True 
    IE.Navigate "loginpage url" 
End Sub 

Где у меня возникают проблемы, однако, имеющих различный доступа к функциям и то же окно IE, когда пользователь вошел в систему и переходите к форме. Сейчас у меня есть это:

Sub FillMacro() 

     Dim sh As Object, oWin As Object 

Set sh = CreateObject("Shell.Application") 

For Each oWin In sh.Windows 
    If TypeName(oWin.document) = "HTMLDocument" Then 
     Set IE = oWin 
     Exit For 
    End If 
Next 

    IE.Visible = True 
    Application.Wait (Now + TimeValue("00:00:01")) 
    IE.document.getElementById("idec").Value = "John" 
    Application.Wait (Now + TimeValue("00:00:01")) 
    IE.document.getElementById("idee").Value = "Smith" 
End Sub 

Большинство, что я получил от других сообщений на этом форуме, и пока я немного новичок в этом, проблема, кажется, что для некоторых Причина VBA не может найти текстовые поля с идентификатором LastName или FirstName. Более того, IE.Visible = True не возвращает окно IE на передний план, поэтому я пытаюсь найти подходящую строку для этого. Когда я пытаюсь запустить код, я получаю сообщение «Требуется объект» ошибка по адресу:

IE.document.getElementById("idec").Value = "John" 

Я попытался найти этот сайт и будет продолжать искать, но любая помощь в то же время было бы весьма признателен!

На странице Internet Explorer, вот строка для первого текстового поля я пытаюсь заполнить:

<input name="componentListPanel:componentListView:1:component:patientLastNameContainer:patientLastName" class="input300" id="idec" type="text" maxlength="60" value=""> 
+2

Любые фреймы/фреймы на этой странице? –

+0

Не могли бы вы предоставить фактический URL веб-формы? Кроме того, вы можете попытаться использовать XHR вместо автоматизации IE, вам нужно просто изучить запрос на вкладке сети инструментов разработчика IE после подачи руководства и воспроизвести его. – omegastripes

+0

Форма находится в iframe на самом деле. Что касается URL-адреса, вам нужно войти в систему, чтобы просмотреть форму, поэтому я не уверен, могу ли я это сделать, или как – WK145

ответ

0

Почему бы не автоматизировать процесс регистрации, а? Вход может храниться в Excel и его значение считывается макросом из ячейки.

Как говорит Тим ​​Уильямс, если есть Iframe на веб-сайте, использовать (для меня это работает только с contentwindow включены):

IE.document.getElementById("iFrameIdHere").contentwindow.document.getEleme‌ntById("idec").Value = "John" 

Вместо Application.Wait использования:

Do Until IE.ReadyState = 4 And IE.Busy = False 
    DoEvents 
Loop 

Это сэкономит вы много времени, когда страница загружается быстро и предотвращает ошибки при загрузке, превышает время ожидания. Используйте его ТОЛЬКО после перезагрузки страницы (что означает после навигации или что-то, что вызывает перезагрузку страницы, особенно .click на HTML-элементах.

Используйте раннее связывание, это немного быстрее, чем создание объектов. Это может увеличить производительность на несколько процентов на основе страницы скорость загрузки, тем быстрее загружаются страницы, тем больше увеличение.

Set IE = New InternetExplorer 

Наконец, вы можете переключать загрузки изображений, в зависимости от того, нужно ли загружать изображения с веб-сайта.

Public Sub ShowPictures(ByVal EnabledStatus As Boolean) 

Public ScrapingCancelled as Boolean 
Dim obj_Shell 
Dim v_Result As Variant 
Set obj_Shell = CreateObject("WScript.Shell") 

'Reads the registry key that determines whether 'Show pictures' Internet Explorer advanced setting is enabled 

v_Result = obj_Shell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Display Inline Images") 

Select Case v_Result 
    Case "yes" 'Pictures are displayed 
      If EnabledStatus = False Then _ 
      obj_Shell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Display Inline Images", "no", "REG_SZ" 
    Case "no" 'Pictures are not displayed 
      If EnabledStatus = True Then _ 
      obj_Shell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Display Inline Images", "yes", "REG_SZ" 
    Case Else 
      ScrapingCancelled = True 
End Select 

End Sub 

Нет изображения, загруженные:

ShowPictures (0) 

Изображения загружены:

ShowPictures (1) 

Хорошая практика, чтобы установить значение 1 в конце макрокоманды.

+0

Спасибо! В том числе contentwindow сделал это и для меня. Что касается автоматизации входа в систему, то действительно не было причин не включать его, поэтому я добавляю, что теперь, когда основные части были успешно обработаны. – WK145