Выберите дату из HTML datepicker с VBA

Дорогие,

С помощью приведенного ниже кода я пытаюсь изменить дату datepicker, но получаю сообщение об ошибке. Если вы можете предложить какое-либо решение / исправление, я буду счастлив.

@QHarr Я пытаюсь последовать примеру, который вы дали раньше, чем через несколько месяцев.

Большое спасибо за внимание.

Sub Download_Historical_Data()

Dim DateToUse As String, ChampionName As String

Dim IE As InternetExplorer, doc As HTMLDocument, games As Object
Dim i As Long, j As Long

'Loop until you reach the day before today
Do Until wsControl.Range("B1").Value = Format$(Date - 1, "DD-MM")
    'Initialize project. Check the LastDate and if it is null we use "2018 - 01 - 01" and import the it in wsControl.Range("B1").Value
    If wsControl.Range("B1").Value = "" Then
        DateToUse = Format$("01-01-2018", "DD-MM")
        wsControl.Range("B1").Value = DateToUse
    Else
        DateToUse = Format(wsControl.Range("B1").Value + 1, "DD-MM")
    End If

    'Open Browser and download data
    Set IE = New InternetExplorer

    With IE
        .Visible = True
        .Navigate ("https://www.xscores.com/soccer/livescores/" & DateToUse)

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

        Set doc = .document

    End With

    Set games = doc.getElementsByClassName("game_table")

    IE.Quit
    Set IE = Nothing

Loop

End Sub

Предположение: doc.querySelector("#datepicker * [value = " & DateToUse & "]").Click

Siddharth Rout 02.10.2018 12:34

@Siddharth Rout благодарит за быстрый ответ. Я использовал эту строку кода раньше и получаю сообщение об ошибке. «Не удалось завершить операцию из-за ошибки 8070000c»

Error 1004 02.10.2018 12:45
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
2
1 440
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Длинный метод:

Эта часть перемещается, щелкая по месяцам (стрелка назад) и датам (циклически перебирая даты в календаре и выбирая подходящую дату).

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

Option Explicit  
Public Sub DateSelection()
    'Max past date is 2 weeks prior to today's date
    Dim dateToUse As String, lastSundayPriorMonth As Long, numberOfIndicesToIgnore As Long
    dateToUse = "2018-09-28"

    If Not IsDateValid(dateToUse) Then
        MsgBox "Please select a date between " & Format$(DateAdd("ww", -2, Date) + 1, "yyyy-mm-dd") & " and " & Format$(Date, "yyyy-mm-dd")
        Exit Sub
    End If

    lastSundayPriorMonth = GetLastSunday(DateAdd("m", -1, CDate(dateToUse)))
    numberOfIndicesToIgnore = Abs(CDate(dateToUse) - lastSundayPriorMonth) '<==Dates from prior month to ignore on displayed calendar

    Dim dates As Object, ie As InternetExplorer, i As Long
    Set ie = New InternetExplorer

    With ie
        .Visible = True
        .navigate "https://www.xscores.com/soccer/livescores"

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

        With .document

            Dim numberOfMonthsInPast As Long

            numberOfMonthsInPast = GetNumberOfMonthsBack(dateToUse)

            .querySelector(".dateDetails").Click

            If numberOfMonthsInPast > 0 Then               
                For i = 1 To numberOfMonthsInPast 'navigate back the required number of months
                    .querySelector(".calendar-prev").Click
                    While ie.Busy Or ie.readyState < 4: DoEvents: Wend
                Next
            End If

            Set dates = .querySelectorAll(".calendar-dates [class^=date]") '<== All dates in selected month view

            For i = numberOfIndicesToIgnore To dates.Length - 1
                If CInt(dates.item(i).innerText) = Day(dateToUse) Then
                    dates.item(i).querySelector("a").Click 
                    While ie.Busy Or ie.readyState < 4: DoEvents: Wend
                    Exit For
                End If
            Next
            'other code
        End With
        Stop                                     '<==Delete me later
        .Quit
    End With
End Sub

Public Function GetLastSunday(ByVal dateString As String) As Long
    Dim d As Date
    d = DateSerial(YEAR(dateString), Month(dateString) + 1, 1) - 1
    GetLastSunday = d - Weekday(d) + 1
End Function

Public Function IsDateValid(ByVal dateString As String) As Boolean
    IsDateValid = (DateDiff("ww", dateString, Date) >= 0 And DateDiff("ww", dateString, Date) <= 2)
End Function

Public Function GetNumberOfMonthsBack(ByVal dateString As String) As Long
    GetNumberOfMonthsBack = DateDiff("m", dateString, Date)
End Function

Предпочтительно:

Мне кажется, что я все еще могу получить более старые даты, просто используя dd-mm в URL-адресе, но я ценю, что это дает вам переменные результаты (часто по умолчанию используются последние данные).

Option Explicit
Public Sub test()
    Dim ie As New InternetExplorer
    With ie
        .Visible = True
        .navigate "https://www.xscores.com/soccer/livescores/19-09"

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

        Stop '<== Delete me later
        .Quit
    End With
End Sub

Данные за сегодня 2018-10-03 (верхние строки):

Дата ручного выбора на 2018-09-19 (верхние строки):

Результат выполнения кода за 19.09.2018:


Взломать:

Option Explicit
Public Sub DateSelection()
    'Max past date is 2 weeks prior to today's date
    Dim dateToUse As String, lastSundayPriorMonth As Long, numberOfIndicesToIgnore As Long
    dateToUse = "2018-09-18"

    lastSundayPriorMonth = GetLastSunday(DateAdd("m", -1, CDate(dateToUse)))
    numberOfIndicesToIgnore = Abs(CDate(dateToUse) - lastSundayPriorMonth) '<==Dates from prior month to ignore on displayed calendar

    Dim dates As Object, ie As InternetExplorer, i As Long
    Set ie = New InternetExplorer

    With ie
        .Visible = True
        .navigate "https://www.xscores.com/soccer/livescores"

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

        With .document

            Dim numberOfMonthsInPast As Long

            numberOfMonthsInPast = GetNumberOfMonthsBack(dateToUse)

            .querySelector(".dateDetails").Click

            If numberOfMonthsInPast > 0 Then
                For i = 1 To numberOfMonthsInPast 'navigate back the required number of months
                    .querySelector(".calendar-prev").Click
                    While ie.Busy Or ie.readyState < 4: DoEvents: Wend
                Next
            End If

            Set dates = .querySelectorAll(".calendar-dates [class^=date]") '<== All dates in selected month view

            For i = numberOfIndicesToIgnore To dates.Length - 1
                If CInt(dates.item(i).innerText) = Day(dateToUse) Then
                    If Not IsDateWithin2Weeks(dateToUse) Then
                        With dates.item(i)
                            .outerHTML = Replace(dates.item(i).outerHTML, " disabled", vbNullString)
                            Set dates = ie.document.querySelectorAll(".calendar-dates [class^=date]") '<== All dates in selected month view
                        End With
                    End If
                    dates.item(i).querySelector("a").Click

                    While ie.Busy Or ie.readyState < 4: DoEvents: Wend
                    Exit For
                End If
            Next
            'other code
        End With
        Stop                                     '<==Delete me later
        .Quit
    End With
End Sub

Public Function IsDateWithin2Weeks(ByVal dateString As String) As Boolean
    IsDateWithin2Weeks = (DateDiff("ww", dateString, Date) >= 0 And DateDiff("ww", dateString, Date) <= 2)
End Function

Уважаемый @QHarr, я также приступил к добавлению даты в конце URL-адреса и не работает.

Error 1004 02.10.2018 13:48

ссылки, которые вы публикуете выше, работают нормально. но когда я использую это: .Navigate ("xscores.com/soccer/livescores" & Format (DateToUse, "DD-MM")) дата, указанная в шансе выбора даты, показывает сегодняшние игры вместо 01.01.2018.

Error 1004 02.10.2018 13:55

@Harr Я отредактировал приведенный выше код. Это мое последнее исправление, и сборщик данных по-прежнему показывает правильную дату (как DateToUse), но результаты сегодня.

Error 1004 02.10.2018 14:13

Позвольте нам продолжить обсуждение в чате.

Error 1004 02.10.2018 14:16

Другие вопросы по теме