2010-07-14 5 views
3

Я пытаюсь заставить мою программу VBA взаимодействовать со страницей, использующей JavaScript, и был успешным в прошлом. После недавнего обновления он больше не работает. В этот момент мне нужно либо A) программно нажать кнопку, либо B) выполнить функцию, которую вызывает кнопка. Трудная часть состоит в том, что кнопка не имеет объявленного имени. На листе, указанном в исходном коде с именами, есть другие, и я могу с ними прекрасно взаимодействовать. Вот код html из источника страницы:Нажмите кнопку или выполните функцию JavaScript с помощью VBA

<input type="button" class="buttonForm" value='Run Report' onclick="exportData(workOrderSearchForm)"/> 

Как вы можете видеть, оно не объявляет имя кнопки. В прошлом работало:

Set ie = CreateObject("InternetExplorer.application") 
ie.document.all(79).Click 

С «79», являющимся индексом номера позиции. Теперь выясняется, что кнопка была изменена на пункт «81», а просто положить в:

ie.document.all(81).Click 

не работает по какой-то причине. Я знаю, какую функцию я хочу выполнить: exportData (workOrderSearchForm), но не знаю, как это сделать за пределами метода «щелчка».

Я искал приличную документацию относительно объекта приложения IE, но не могу найти хороший источник. Есть ли способ выполнить функцию?

ответ

8

Попробуйте это:

Dim CurrentWindow As HTMLWindowProxy: Set CurrentWindow = ie.Document.parentWindow 
Call CurrentWindow.execScript("exportData(workOrderSearchForm)") 

Но сначала вам нужно будет включать библиотеку объектов Microsoft HTML при условии ссылки (Tools> References)

0

Как это:

ie.window.exportData(ie.document.forms.workOrderSearchForm) 
+0

К сожалению, это говорит о том, что это не поддерживаемый метод или свойство. Он также помещает код как таковой "ie.Window.exportData (ie.Document.forms.workOrderSearchForm)", как только я его вставляю. – Michael

+0

Попробуйте 'ie.window.exportData ie.window.workOrderSearchForm' или' ie.window.eval "exportData (workOrderSearchForm)" ' – SLaks

+0

Ни один из них, похоже, не делает этого. Они дают ту же ошибку. – Michael

1

Вы можете цикл через все входные теги и идентифицировать соответствующий, проверяя атрибут «наиболее идентифицирующий» (id, name, type, innerHTML, ... независимо). Вот Sub() Я использую в листе Excel, который автоматически регистрирует на веб-сайте

Sub FormAction(Doc As MSHTML.HTMLDocument, ByVal Tag As String, ByVal Attrib As String, ByVal Match As String, ByVal Action As String) 
Dim ECol As MSHTML.IHTMLElementCollection 
Dim IFld As MSHTML.IHTMLElement 
Dim Tmp As String 

    Set ECol = Doc.getElementsByTagName(Tag) 
    For Each IFld In ECol           ' cycle thru all <[tag]> elements 
     If VarType(IFld.getAttribute(Attrib)) <> vbNull Then  ' does it contain the attribute 
      If Left(IFld.getAttribute(Attrib), Len(Match)) = Match Then 
       If Action = "/C/" Then 
        IFld.Click 
       Else 
        IFld.setAttribute "value", Action 
       End If 
       Exit Sub 
      End If 
     End If 
    Next 
End Sub 

Функция принимает следующие параметры:

  • Doc .... объект HTML DOM
  • Тег .... тег, над которым вы хотите работать (обычно ввод, изображение, a, ...)
  • Attrib .... атрибут, значение которого вы хотите совместить
  • Матч .... совпадение значение для атрибута
  • Действия ..... если «/ C /»() по действию .Нажмите выполняются на совпадающий теге, иначе значение действия помещается в значении атрибут тега

Если вы хотите зацепить любой атрибут, содержащий код JavaScript (например, «щелчок»), не забывайте, что код, который вы видите в источнике HTML является в поместить его анонимной функции, как

function anonymous() 
{ 
onclick="exportData(workOrderSearchForm)"; 
} 

вы должны учитывать это, используя Instr() или аналогичный, если вы хотите подключить, например, "exportData (workOrder".

Также очень важно: уделите достаточно времени для перехода к объекту DOM и его загрузке. Я отмечаю в своей компании, что после изменения страниц время загрузки иногда резко возрастает.

У меня есть хороший успех, это:

Sub MyMainSub() 
Dim Browser As SHDocVw.InternetExplorer 
Dim HTMLDoc As MSHTML.HTMLDocument 
' my other Dim's 

    ' start browser 
    Set Browser = New SHDocVw.InternetExplorer 
    Browser.navigate "http://www.whatever.com" 
    WaitForBrowser Browser, 5   ' wait for browser, but not more than 5 sec 

    ' gain control over DOM object 
    Set HTMLDoc = Browser.document 
    WaitForBrowser Browser, 5   ' wait for browser, but not more than 5 sec 

    ' do actions 
    ' FormAction HTMLDoc, w, x, y, z 

End Sub 


Sub WaitForBrowser(Browser As SHDocVw.InternetExplorer, Optional TimeOut As Single = 10) 
Dim MyTime As Single 

    MyTime = Timer     ' seconds since midnight 
    Do While Browser.Busy Or (Timer <= MyTime + TimeOut) 
     DoEvents      ' go do something else 
    Loop 

    If Browser.Busy Then 
     MsgBox "I waited for " & Timer - MyTime & " seconds, but browser still busy" & vbCrLf & _ 
       "exititing Login sequence now" 
     End 
    End If 
End Sub 

Надежда это вдохновляющий достаточно для того, чтобы создать решение.

Удачи MikeD

Смежные вопросы