Ошибка 424: требуется объект для использования Vlookup в цикле

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

Я получаю сообщение об ошибке в своем цикле j при использовании строки Datatype в vlookup. Я намерен вернуть значение, которое будет использоваться для заполнения моего URL-адреса.

Dim Last1 As Integer: Last1 = W.Range("A1000").End(xlUp).Row
Dim Last2 As Integer: Last2 = W.Range("XFD1").End(xlToLeft).Column
Dim IE As SHDocVw.InternetExplorer
Dim html As HTMLDocument
If Last = 1 Then Exit Sub
Dim Symbols As String
Dim DataType As String
Dim URLParameters As String
Dim i, j As Integer


    For i = 2 To Last1
        Symbols = Symbols & Worksheets("Stock Prices").Range("A" & i).Value & "+"
    Next i

    Symbols = Left(Symbols, Len(Symbols) - 1)

    Debug.Print Symbols

    For j = 2 To Last2

        DataType = DataType & Worksheets("Stock Prices").Cells(1, j).Value

        URLParameters = Application.WorksheetFunction.VLookup(DataType, Worksheets("URL Info").Range("URL_DataInfo"), 2).Value

    Next j
    Debug.Print DataType
    Debug.Print URLParameters

Set IE = CreateObject("InternetExplorer.Application")

'Tells IE where to pull
IE.navigate "https://download.finance.yahoo.com/d/quotes?s=" & Symbols & "&f=" & URLParameters
IE.Visible = True

'Wait until IE is done loading page
Do While IE.readyState <> READYSTATE_COMPLETE
Application.StatusBar = "Pulling data..."
DoEvents
Loop
'show text of HTML document returned
Set html = IE.document
'MsgBox html.DocumentElement.innerHTML
'close down IE and reset status bar
Set IE = Nothing
Application.StatusBar = ""

'Remove HTML tags
Dim info As String
info = cook_tags(CStr(html.DocumentElement.innerHTML))

'Split the results into cells
Call split_data(info)

End Sub

person Simple    schedule 26.09.2016    source источник
comment
Почему вы продолжаете добавлять информацию к DataType? Это может быть тем, что вам нужно сделать, но это выглядит странно и, безусловно, объясняет, почему вы получаете ошибки (после исправлений кода, упомянутых в текущих ответах) от VLookup, не соответствующих данным, переданным в Это.   -  person YowE3K    schedule 27.09.2016
comment
Я пытаюсь создать цикл, который использует vlookup из того, что было получено в строке DataType, и сопоставляет его в параметрах URL, чтобы конкретизировать URL-адрес. Мысли?   -  person Simple    schedule 27.09.2016
comment
Таким образом, если первый поиск выполняется для чего-то вроде ABC, то следующий поиск будет для ABCXYZ, а следующий поиск будет для ABCXYZGHJ и т. д. Это то, что вам нужно? Или вы ищете ABC, затем XYZ, а затем GHJ?   -  person YowE3K    schedule 27.09.2016
comment
@Jeeped решил мой вопрос. Я хотел связать бит URL-адреса на основе того, что DataType перебирал и сопоставлял с соответствующей добавкой URL-адреса. Например, если бы было 10 частей, все они были бы связаны вместе ABCDEFGHIJ.   -  person Simple    schedule 27.09.2016


Ответы (2)


Ваш текущий код запрашивает функцию VLOOKUP для приблизительного совпадения. Данные должны быть отсортированы в порядке возрастания, чтобы это работало даже удаленно.

Используйте вариантный тип, чтобы принять возвращаемое значение и избавиться от объекта WorksheetFunction. . Если вы используете объект приложения Excel отдельно, вы можете возвращать ошибки к варианту.

Вы не возвращаете свойство Range.Value, а просто функцию ВПР. возвращаемое значение.

Dim URLParameters As variant
URLParameters = Application.VLookup(DataType, Worksheets("URL Info").Range("URL_DataInfo"), 2, FALSE)
if IsError(URLParameters) Then
    'no value found
else
    'value found and put in URLParameters
end if
person Community    schedule 26.09.2016
comment
Я пройду через процесс добавления квалификаторов If IsError, но сейчас я просто пытаюсь заставить функцию возвращать значение, чего она не делает точно. Я изменил характер своего vlookup на точное совпадение. Когда я переключаю URLParameters на вариант, я получаю ошибку 2042 и позже конфликтую с моей функцией IE.Navigate. Я бы предпочел сохранить его как строку, если это возможно. - person Simple; 26.09.2016
comment
@Simple - ваша проблема с использованием Variant при переходе к функции IE.Navigate, вероятно, связана с тем, что ваш VLookup ничему не соответствует (см. мой комментарий к самому вопросу, почему он, вероятно, не соответствует ) и, таким образом, возвращает состояние ошибки. Включив предложенный IsError, код мог бы обнаруживать условия несоответствия и выполнять некоторую изящную обработку ошибок, а не сбой дальше в коде. - person YowE3K; 27.09.2016
comment
ХОРОШО. Я вижу, что ты говоришь. Я включил следующий код: If IsError(DataType) Then 'значение не найдено Else' значение найдено и помещено в URLParameters End Если я все еще получаю сообщение об ошибке, указывающее, что объект требуется. Я не просто ищу здесь решение, я хочу понять, что на самом деле не так с логикой... Какой объект требуется для выполнения: URLParameters = URLParameters & Application.VLookup(DataType, Worksheets(URL Info).Range(URL_DataInfo ), 2). Значение, которое не было включено в предыдущие строки кода? - person Simple; 27.09.2016

Формула VLOOKUP возвращает значение из соответствующей ячейки. Пытаться

URLParameters = Application.WorksheetFunction.VLookup(DataType, Worksheets("URL Info").Range("URL_DataInfo"), 2)

Вместо этого (обратите внимание на .Value в конце вызова функции, что неверно):

URLParameters = Application.WorksheetFunction.VLookup(DataType, Worksheets("URL Info").Range("URL_DataInfo"), 2).Value

Вы можете получить дополнительные ошибки, если возвращаемый тип данных функции Vlookup не является строкой (т. е., особенно если это тип ошибки). В этом случае может быть предпочтительнее проверить наличие ошибок и избегать для этого класса WorksheetFunction:

With Worksheets("URL Parameters")
    If Not IsError(Application.VLookup(DataType, .Range("URL_DataInfo"), 2)) Then
        URLParameters = Application.VLookup(DataType, .Range("URL_DataInfo"), 2)
    Else

        '## Here, you'll need some error handling or exit sub early, etc.

    End If
End With
person Jelmer    schedule 26.09.2016
comment
ХОРОШО. Удаление .value избавило от ошибки, требуемой объектом, но не возвращает соответствующую информацию. Вместо того, чтобы возвращать соответствующий контент в именованном диапазоне URL_DataInfo, он возвращает только символ i (которого нет в именованном диапазоне) снова и снова эквивалентно столбцам, прокручиваемым циклом j. - person Simple; 26.09.2016
comment
@DavidZemens - Не лучше ли было бы добавить свой собственный ответ? Сейчас это примерно 20% содержания исходного ответа. - person Comintern; 26.09.2016
comment
@comintern может быть, но я в основном просто улучшал существующий ответ, не чувствовал, что мне нужно добавлять свой собственный - person David Zemens; 27.09.2016