【问题标题】:VBA Automation - How To Access Date Picker ElementsVBA 自动化 - 如何访问日期选择器元素
【发布时间】:2020-02-12 18:53:41
【问题描述】:

我正在开发一些 VBA 自动化,它从 Excel 电子表格中获取数据,并将该数据输入到 Intranet 站点。

在 Intranet 站点上有一个小的 datepicker 工具(带有开始日期和结束日期),可让您选择日期(请参阅 datepicker html 代码的 html 摘录):

<input type="text" id="startdate" name="startdate" value="" class="form-control" size="30">    
<button class="pika-button pika-day" type="button" data-pika-year="2019" data-pika-month="8" data-pika-day="2">2</button>
<button class="pika-prev" type="button">Previous Month</button>

<input type="text" id="enddate" name="enddate" value="" class="form-control" size="30">
<button class="pika-button pika-day" type="button" data-pika-year="2019" data-pika-month="8" data-pika-day="2">2</button>
<button class="pika-prev" type="button">Previous Month</button>

有关日期选择器功能,另请参阅下面的 JavaScript 代码:

<script>
    var startDate,
    endDate,
    updateStartDate = function() {
        startPicker.setStartRange(startDate);
        endPicker.setStartRange(startDate);
        endPicker.setMinDate(startDate);
    },
    updateEndDate = function() {
        startPicker.setEndRange(endDate);
        startPicker.setMaxDate(endDate);
        endPicker.setEndRange(endDate);
    },
    startPicker = new Pikaday({
        field: document.getElementById('startdate'),
        minDate: new Date(2016, 1, 1),
        maxDate: new Date(2050, 12, 31),
        onSelect: function() {
            startDate = this.getDate();
            updateStartDate();
        }
    }),
    endPicker = new Pikaday({
        field: document.getElementById('enddate'),
        minDate: new Date(2016, 1, 1),
        maxDate: new Date(2050, 12, 31),
        onSelect: function() {
            endDate = this.getDate();
            updateEndDate();
        }
    });
    _startDate = startPicker.getDate();
    _endDate = endPicker.getDate();
    if (_startDate) {
        startDate = _startDate;
        updateStartDate();
    };
    if (_endDate) {
        endDate = _endDate;
        updateEndDate();
    };
</script>

我最初有这段代码,它将正确的日期字符串推送到表单,但在运行自动化后,日期选择器中的日期选择器元素没有被选中(它们默认为今天的日期)(参见下面的代码:)。

IE.document.all("startdate").Value = Format$(ThisWorkbook.Sheets("Legends").Range("b7").Value, "yyyy-mm-dd")
IE.document.all("enddate").Value = Format$(ThisWorkbook.Sheets("Legends").Range("b8").Value, "yyyy-mm-dd")

这是我运行自动化后发生的情况,请查看带有推送日期的图片:Intranet site with date

这是我单击 datepicker 元素时的样子:Datepicker defaulting to today's date

在网上阅读了一些东西后,似乎您必须单击“startdate”元素,然后单击日期选择器中的其他元素(我在下面成功完成了:)。

IE.document.querySelector("startdate").Click

但是我无法弄清楚如何单击其他元素(上个月和当天)来完成这部分自动化。

任何帮助将不胜感激!

【问题讨论】:

  • 您使用的是哪种 Datepicker 插件?你能分享相关的代码来重现问题吗?我使用您的代码创建了一个示例(没有添加 datepicker 引用),代码在我这边运行良好,我可以将日期填充到 TextBox 控件中。所以,这个问题可能与 Datepicker 插件有关。
  • 感谢您的帮助!我已经为 datepicker 插件添加了 javascript 代码!

标签: vba internet-explorer automation datepicker


【解决方案1】:

您可以尝试使用 SendKeys 方法输入日期,请​​参考以下代码:

Sub Test()
    Dim IE As Object

    Dim startDateText As Object, endDateText As Object

    Set IE = CreateObject("InternetExplorer.Application")
    With IE
        .Visible = True
        .Navigate "<the website url>"

        While IE.ReadyState <> 4
            DoEvents
        Wend

        'find the startdate textbox and focus
        Set startDateText = IE.document.all("startdate")
        startDateText.Focus
        'using sendkeys method to enter the date.
        SendKeys Format$(ThisWorkbook.Sheets("Legends").Range("b7").Value, "yyyy-mm-dd")
        'Waiting the date value enters (1 second)
        Application.Wait (Now + TimeValue("0:00:1"))

        Set endDateText = IE.document.all("enddate")
        endDateText.Focus
        SendKeys Format$(ThisWorkbook.Sheets("Legends").Range("b8").Value, "yyyy-mm-dd")

        Application.Wait (Now + TimeValue("0:00:1"))
        IE.document.all("startdate").Click

    End With
    Set IE = Nothing
End Sub

【讨论】:

  • 感谢您的帮助!它奏效了!我能够在 Intranet 站点上发送正确的日期(使用 datepicker)!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 2017-05-01
  • 2018-09-03
  • 2018-04-21
  • 2017-05-11
  • 2018-03-08
相关资源
最近更新 更多