Динамический веб-запрос Excel к конкретным данным из таблицы и транспонирование результата с помощью кода VBA

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь написать макрос в Excel для веб-запроса нескольких сайтов для извлечения конкретных данных из таблицы. Веб-запрос берет данные из столбца A и отображает результаты в столбце C. Дело в том, что таблица отображается в нескольких строках, а мне нужны только две (дата и цена); остальные должны быть удалены. Результаты должны быть транспонированы в столбцы B и C. (обновляться каждый час). Как запрос мог бы обеспечить извлечение требуемых данных, а также выполняться в цикле для других строк в столбце A и отображаться на C и D. Помощь и поддержка приветствуются, поскольку я новичок в VBA

 A     B      c        D
Site    Date/Time  Price
74156    xxx          yyy
85940
....
....
  

код выглядит следующим образом

 Sub test1()
Dim qt As QueryTable

Set qt = ActiveSheet.QueryTables.Add(Connection:= _
    "URL;http://www.petro-canada.ca/en/locations/4085.aspx?MODE=DTSamp;ID=" amp; Range("A2").Value, Destination:=Range("c2"))


With qt
    .Name = "Regular, Posted, Self serve"
    .WebSelectionType = xlSpecifiedTables
    .WebTables = "20"    ' Regular table
    .WebFormatting = xlWebFormattingNone
    .EnableRefresh = True
    .RefreshPeriod = 60   'Unit in minutes
    .Refresh     'Execute query
End With
  

End Sub

Ответ №1:

Разместите свой веб-запрос на другой странице, затем добавляйте нужные данные в свой список при каждом обновлении. Вот пример.

 Sub GetPrices()

    Dim rCell As Range
    Dim lIDStart As Long
    Dim qt As QueryTable

    Const sIDTAG = "amp;ID="

    Application.EnableEvents = False

    Set qt = Sheet1.QueryTables(1)

    'loop through site IDs
    For Each rCell In Sheet2.Range("A2:A3").Cells
        'find the id parameter in the web query connection
        lIDStart = InStr(1, qt.Connection, sIDTAG)

        'if found, change the ID
        If lIDStart > 0 Then
            qt.Connection = Left$(qt.Connection, lIDStart - 1) amp; sIDTAG amp; rCell.Value
        Else 'if not found, add the id onto the end
            qt.Connection = qt.Connection amp; sIDTAG amp; rCell.Value
        End If

        'refresh the query table
        On Error Resume Next
            qt.Refresh False

            'if the web query worked
            If Err.Number = 0 Then
                'write the date
                rCell.Offset(0, 1).Value = Sheet1.Range("A2").Value
                'write the price
                rCell.Offset(0, 2).Value = Sheet1.Range("A4").Value
            Else 'if there was a problem with the query, write an error
                rCell.Offset(0, 1).Value = "Invalid Site"
                rCell.Offset(0, 2).Value = ""
            End If
        On Error GoTo 0
    Next rCell

    Application.EnableEvents = True

End Sub
  

Пример можно найти по адресу http://www.dailydoseofexcel.com/excel/PetroWeb.xls

Комментарии:

1. Спасибо за ваш быстрый ответ. Хорошая идея поместить запрос на другой лист. Как насчет выполнения запросов для последующих строк, нужно ли удалять предыдущий запрос? Я пробовал ваш пример, но выдает ошибку времени выполнения 9. Куда мне нужно поместить URL веб-сайта в коде. Еще раз спасибо за поддержку

2. У вас есть только один запрос, и вам не нужно его удалять. Код просто изменяет этот один запрос для каждой строки. В какой строке вы получаете ошибку? У моих листов были кодовые имена Sheet1 и Sheet2, поэтому убедитесь, что ваши совпадают, или измените код. Для URL создайте запрос вручную на другом листе для первого сайта — URL будет сохранен в запросе, и он вам не понадобится в коде.

3. Привет, Дик, сделал, как вы упомянули, получил ошибку во второй строке. не могли бы вы прислать мне свой лист Excel. Большое спасибо

4. Спасибо, Дик. Моя проблема решена. Я перевернул лист, вот почему он не работал, теперь все в порядке. Вы великолепны. Большое спасибо