Ошибка веб-запроса: импорт currenturl не соответствует ни одному экспорту.Вы пропустили ссылку на модуль? - PullRequest
0 голосов
/ 12 декабря 2018

Я использую следующий код.

Sub HREF_Web()

Dim doc As HTMLDocument
Dim output As Object

Range("A1:C10000").Clear

' delete all queries
Dim pq As Object
For Each pq In ThisWorkbook.Queries
    pq.Delete
Next

' delete all connections
Dim cn As Object
For Each cn In ThisWorkbook.Connections
    cn.Delete
Next


Set ie = New InternetExplorer
ie.Visible = True
ie.navigate Worksheets("Sheet1").Range("L1") ' getting url from the worksheet

Do
'DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE

Set doc = ie.document
Set output = doc.getElementsByTagName("a")


For Each link In output
    Debug.Print link.innerHTML
    If link.innerHTML Like "*" & "Data Corrections" & "*" Then
        link.Click

        currenturl = ie.LocationURL

            ActiveWorkbook.Queries.Add Name:="Table 0", Formula:= _
            "let" & Chr(13) & "" & Chr(10) & " Source = Web.Page(Web.Contents(currenturl))," & Chr(13) & "" & Chr(10) & "    Data0 = Source{0}[Data]," & Chr(13) & "" & Chr(10) & "    #""Promoted Headers"" = Table.PromoteHeaders(Data0, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & "    #""Changed Type"" = Table.TransformColumnTypes(#""Promoted Headers"",{{""Data Notice Page"", type any}, {""eMBS Inc"", type any}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "   " & _
            " #""Changed Type"""
        ActiveWorkbook.Worksheets.Add
        With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
            "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""Table 0"";Extended Properties=""""" _
            , Destination:=Range("$A$1")).QueryTable
            .CommandType = xlCmdSql
            .CommandText = Array("SELECT * FROM [Table 0]")
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .ListObject.DisplayName = "Table_0"
            .Refresh BackgroundQuery:=False
        End With

        Cells.Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Range("A2").Select

    End If

Next

MsgBox "Done!"

End Sub

Ошибка в этой строке:

.Refresh BackgroundQuery:=False

Переменная 'currenturl' исходит из недавно открытого окна IE.Может быть, это не тот способ, но я думал, что это сработает.По сути, я хочу просмотреть все теги HREF в родительском элементе, найти теги, содержащие «исправления данных», щелкнуть эти ссылки, перейти к этим дочерним URL-адресам (их 4) и импортировать данные из объекта «Таблица 0»..

Вот изображение ошибки.

enter image description here

1 Ответ

0 голосов
/ 13 декабря 2018

Я думаю, что сообщение об ошибке, полученное вами от Power Query.

Ваша переменная currenturl определена в VBA, но не в Power Query (эти две функции являются отдельными, и Power Query не знает о вашейПеременные VBA или что они могут содержать).

Таким образом, когда ваш код M вычисляется, он знает, что вы хотите передать некоторые Expression, называемые currenturl, в качестве аргумента функции Web.Contentsно он не может найти currenturl, определяемый / назначаемый где-либо (в пределах его собственной цепочки оценки).

Я думаю, что ваши варианты:

  • Вместо "...Web.Contents(currenturl)...", попробуйте "...Web.Contents(""" & currenturl & """)..." (т. е. пусть VBA оценивает currenturl и передает его фактическое значение в Power Query, а не передает Power Query выражение, которое происходит из-за пределов его цепочки / области оценки).Это может быть самым быстрым решением, хотя URL должен быть заключен в " с каждой стороны, чтобы Power Query оценивал его как текст / строку - и могут быть и другие вещи, на которые следует обратить внимание.

  • Используйте более чистый подход, т. Е. Либо все в VBA, либо все в M / Power Query (возможно, больше работы для вас, но это означает, что вам не нужно, чтобы VBA общался с PowerЗапрос или наоборот).

  • Сделайте так, чтобы ваш код VBA сбрасывал все currenturl s (из всех итераций цикла) в определенный диапазон / столбец, затем Power Query просматривал этот конкретныйдиапазон, вернуть таблицу M для каждого currenturl, затем объединить и загрузить как одну таблицу на лист Excel.Технически, после того как вы сделали запрос, вам нужно будет только обновить его (это можно сделать из VBA), но для выполнения запроса потребуется знание M или Power Query GUI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...