Нажмите кнопку или выполните функцию JavaScript с VBA - PullRequest
3 голосов
/ 14 июля 2010

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

<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), но не знаю, как это сделать, не используя метод "click".

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

Ответы [ 3 ]

10 голосов
/ 08 января 2011

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

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

Но сначала вам нужно будет включить библиотеку объектов Microsoft HTML в разделе «Ссылки» («Инструменты»> «Ссылки»)

2 голосов
/ 08 января 2011

Вы можете циклически проходить через все входные теги и идентифицировать соответствующий, проверяя «наиболее идентифицирующий» атрибут (идентификатор, имя, тип, 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

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

  • Док .... объект HTML DOM
  • Tag .... тег, над которым вы хотите работать (обычно input, image, a, ...)
  • Attrib .... атрибут, значение которого вы хотите сопоставить
  • Match .... соответствующее значение для атрибута
  • Действие ..... если "/ C /" выполняется действие .Click () над соответствующим тегом, в противном случае значение действия помещается в атрибут значения тега

Если вы хотите подключить любой атрибут, содержащий код JavaScript (например, «onclick»), не забывайте, что код, который вы видите в исходном коде 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

0 голосов
/ 14 июля 2010

Как это:

ie.window.exportData(ie.document.forms.workOrderSearchForm)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...