Excel VBA – невозможно запустить событие ng-change

Я новичок в VBA и пытаюсь что-то автоматизировать, но застрял на части fireEvent.

В основном я хочу вызвать событие раскрывающегося списка, но я не могу понять, как это сделать.

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

Ошибка времени выполнения: 5 Недопустимый вызов процедуры или аргумент

Пожалуйста, я был бы очень признателен, если кто-то может помочь мне найти решение для этого.

Мой код Excel VBA:

Sub Auto2()
    Dim ie As New InternetExplorer
    
    With ie
        .Visible = True
        .navigate ""
            
        While .Busy Or .readyState < 4: DoEvents: Wend
    
        ie.document.getElementsByClassName("input-group-addon")(0).Click
        ie.document.getElementsByClassName("today day")(0).Click
    
        While .Busy Or .readyState < 4: DoEvents: Wend

        ie.document.querySelector("select[name='tipoRecibo']").Value = "string:R"
        ie.document.querySelector("select[name='tipoRecibo']").fireEvent "ng-change"
    
    End With
End Sub

Веб-код:

<div class="col-md-4 col-xs-12">
    <lf-dropdown
        class="ng-isolate-scope"
        lf-model="$ctrl.formParameters.tipoRecibo"
        lf-label="Tipo"
        name="tipoRecibo"
        lf-empty-option="true"
        lf-disabled="$ctrl.isTipoDisabled()"
        lf-change="$ctrl.pfChange(model)"
        lf-options="$ctrl.getTipos()"
    >
        <div class="form-group form-group-sm">
            <label title="" class="ng-binding" ng-attr-data-toggle="{{$ctrl.lfHelp ? 'tooltip' : undefined }}"> Tipo<!-- ngIf: $ctrl.lfHelp --> </label>

            <select
                name="tipoRecibo"
                class="form-control ng-pristine ng-untouched ng-valid ng-empty"
                ng-disabled="$ctrl.lfDisabled({model: $ctrl.lfModel})"
                ng-model="$ctrl.lfModel"
                ng-init="$ctrl.lfOptions\[0\]"
                ng-options="option.value as option.text for option in $ctrl.lfOptions"
                ng-change="$ctrl.lfChange({model: $ctrl.lfModel})"
            >
                <!-- ngIf: $ctrl.lfEmptyOption -->

                <option class="ng-pristine ng-untouched ng-valid ng-scope ng-empty" value="" ng-if="$ctrl.lfEmptyOption" ng-model="$ctrl.lfModel"></option>

                <!-- end ngIf: $ctrl.lfEmptyOption -->

                <option value="string:R" label="Fatura-Recibo">Fatura-Recibo</option>
                <option value="string:FTR" label="Fatura">Fatura</option>
            </select>

            <div class="opcional-label ng-binding"></div>
            <span class="help-block"></span>
        </div>
    </lf-dropdown>
</div>


person Hayley W    schedule 27.10.2020    source источник
comment
ng-change не является HTMLEvent, следовательно, ваша ошибка. Есть ли общедоступный URL для этого? Это может быть так же просто, как присоединить и отправить событие изменения html.   -  person QHarr    schedule 28.10.2020
comment
@QHarr должен войти в систему, чтобы получить доступ к этой странице, поэтому не может поделиться URL-адресом. Не уверен, что это поможет, но вот скриншот того, с чем я имею дело: gyazo.com/2979355b82f37d833363db98887359e2   -  person Hayley W    schedule 28.10.2020
comment
Вы пытались прикрепить событие изменения html к родительскому выбору и отправить это событие в элемент выбора после установки вашего параметра?   -  person QHarr    schedule 28.10.2020


Ответы (1)


Я думаю, что событие не ng-change, я думаю, что это только change. Fireevent сегодня в большинстве случаев не работает. Как писал QHaar, попробуйте прикрепить и отправить событие.

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

Попробуйте следующее:

Sub Auto2()
  
  Dim ie As New InternetExplorer
  Dim nodeDropdown As Object
  
  ie.Visible = True
  ie.navigate ""
  While .Busy Or ie.readyState < 4: DoEvents: Wend

  ie.document.getElementsByClassName("input-group-addon")(0).Click
  ie.document.getElementsByClassName("today day")(0).Click

  While .Busy Or .readyState < 4: DoEvents: Wend

  Set nodeDropdown = ie.document.querySelector("select[name='tipoRecibo']")
  nodeDropdown.Value = "string:R"
  Call TriggerEvent(ie.document, nodeDropdown.Value, "change")
End Sub

И эта процедура для запуска событий:

Private Sub TriggerEvent(htmlDocument As Object, htmlElementWithEvent As Object, eventType As String)

  Dim theEvent As Object

  htmlElementWithEvent.Focus
  Set theEvent = htmlDocument.createEvent("HTMLEvents")
  theEvent.initEvent eventType, True, False
  htmlElementWithEvent.dispatchEvent theEvent
End Sub
person Zwenn    schedule 28.10.2020
comment
Большое спасибо. Пришлось внести несколько изменений в этот код, но благодаря ответу, который вы связали, мне удалось это понять. :) - person Hayley W; 29.10.2020