Мне нужно написать скрипт VBA в Excel для автоматического ввода значений в таблицу на веб-странице.
Веб-страница имеет определенные JavaScript-динамические действия, так как при нажатии на ячейку таблицы таблицы эта ячейка станет текстовым вводом. Как показано на этом рисунке:
слева до нажатия, а справа после нажатия
,
Мой вопрос: в моем коде VBA, как я могу имитировать щелчок по ячейке, чтобы пробудить ввод текста?
Я пробовал все это, но без ответа:
theDocument.getElementById("column-inPunch-Row-5").Click
theDocument.getElementById("column-inPunch-Row-5").parentElement.Click
theDocument.getElementById("column-inPunch-Row-5").FireEvent "onclick"
theDocument.getElementById("column-inPunch-Row-5").parentElement.FireEvent "onclick"
И я попробовал это, но «Ошибка: объект не поддерживает это свойство или метод»:
theDocument.getElementById("column-inPunch-Row-5").MouseDown
HTML-код ячейки сетки приведен ниже:
<div id="jqxGrid0" ng-class="{tcProject: gridModel.watchers.viewType === 'PROJECT', tcHourly: gridModel.watchers.viewType === 'HOURLY'}" options="options" grid-model="gridModel" state-model="gridModel.stateModel" gridindex="0" krn-on-columnresized="kcolumnresized(krnEvent)" krn-on-cellclick="cellclick(krnEvent)" krn-on-columnclick="kcolumnclick(krnEvent)" krn-on-cellselect="cellselect(krnEvent)" class="jqx-grid jqx-reset jqx-rc-all jqx-widget jqx-widget-content tcHourly jqx-grid-bluefin jqx-reset-bluefin jqx-rc-all-bluefin jqx-widget-bluefin jqx-widget-content-bluefin" role="grid" align="left" style="width: 100%; height: 376px;">
<!-- other divs ... -->
<div role="gridcell" style="left: 338.66978px; z-index: 736; width:48.111630000000005px;" class="jqx-grid-cell jqx-grid-cell-bluefin jqx-item jqx-item-bluefin jqx-grid-cell-alt jqx-grid-cell-alt-bluefin">
<div id="column-outPunch-Row-5" class="cell-wrapper can-edit">
<div style="overflow: hidden; text-overflow: ellipsis;" data-toggle="tooltip" title="15:09" class="cell-center no-exceptions no-comments">
<span></span>15:09
</div>
</div>
</div>
<!-- other divs ... -->
</div>
После нажатия текст HTML-кода для ввода будет:
<div style="overflow: hidden; border-radius: 0px; z-index: 1736; top: 126px; left: 340px; position: absolute; display: block; width: 46px; height: 26px;" id="templateeditorjqxGrid0outPunch">
<input class="punch-editor-input jqx-widget-content jqx-widget-content-bluefin jqx-input jqx-input-bluefin jqx-widget jqx-widget-bluefin jqx-rc-all jqx-rc-all-bluefin" id="jqxWidgetb3e271ff" role="textbox" aria-autocomplete="both" aria-disabled="false" aria-readonly="false" aria-multiline="false" placeholder="" style="width: 44px; height: 24px;" aria-expanded="false" data-value="15:09" data-label="15:09">
</div>
Когда я использую monitorEvent в Chrom для захвата события щелчка, оно оказывается событием «выбора», что приводит к путанице:
select
Event {isTrusted: true, type: "select", target: input#jqxWidgetb4540521.punch-editor-input.jqx-widget-content.jqx-widget-content-bluefin.jqx-input.j…, currentTarget: body#timecardApp.ng-scope, eventPhase: 3, …}
bubbles:true
cancelBubble:false
cancelable:false
composed:false
currentTarget:null
defaultPrevented:false
eventPhase:0
isTrusted:true
path:(16) [input#jqxWidgetb4540521.punch-editor-input.jqx-widget-content.jqx-widget-content-bluefin.jqx-input.j…, div#templateeditorjqxGrid0inPunch, div#contenttablejqxGrid0, div.jqx-grid-content.jqx-widget-content.jqx-grid-content-bluefin.jqx-widget-content-bluefin, div#contentjqxGrid0.jqx-clear.jqx-overflow-hidden.jqx-position-absolute.jqx-border-reset.jqx-backgro…, div#wrapperjqxGrid0.jqx-clear.jqx-max-size.jqx-position-relative.jqx-overflow-hidden.jqx-background-…, div.jqx-clear.jqx-border-reset.jqx-overflow-hidden.jqx-max-size.jqx-position-relative, div#jqxGrid0.jqx-grid.jqx-reset.jqx-rc-all.jqx-widget.jqx-widget-content.jqx-grid-bluefin.jqx-reset-…, div.timecardGrids.ng-scope, div#tcGrids.jqx-widget-content.jqx-splitter-panel.jqx-reset.jqx-widget-content-bluefin.jqx-splitter-…, div#splitterDiv.jqx-reset.jqx-splitter.jqx-widget.jqx-widget-content.jqx-reset-bluefin.jqx-splitter-…, div#mainWidgetContent.row-fluid.ng-scope, body#timecardApp.ng-scope, html, document, Window]
returnValue:true
srcElement:input#jqxWidgetb4540521.punch-editor-input.jqx-widget-content.jqx-widget-content-bluefin.jqx-input.jqx-input-bluefin.jqx-widget.jqx-widget-bluefin.jqx-rc-all.jqx-rc-all-bluefin
target:input#jqxWidgetb4540521.punch-editor-input.jqx-widget-content.jqx-widget-content-bluefin.jqx-input.jqx-input-bluefin.jqx-widget.jqx-widget-bluefin.jqx-rc-all.jqx-rc-all-bluefin
timeStamp:442527.19999995315
type:"select"
__proto__:Event