Я получаю сообщение об ошибке 1004 при попытке выполнить Vlookup / Index-Match в своем коде VBA, или нет результатов вообще - PullRequest
0 голосов
/ 04 января 2019

Я работаю над длинным макросом, чтобы автоматизировать процедуру. К сожалению, часть кода просто не работает - я говорю о поиске. Я попытался использовать vlookup и Index / match внутри цикла While.

Я использовал в основном один и тот же цикл во многих других моих макросах без каких-либо проблем. Я попытался отрегулировать форматы (даже с помощью Painter Format) безуспешно.

Я выделил значения для поиска в новом файле и выполнил только часть поиска, но она все еще не работает.

Обратите внимание, когда я делаю Vlookup или index.Match вручную в Excel, это работает без проблем.

Код:

  Sub lookup()

 'Variables for the Vlookups
 Dim newRow As Long
 Dim newCL As String

 newRow = 7

 Dim rn As Range
 Set rn = Worksheets("trysheet").Range("C:C")
 Dim mrange As Range
 Set mrange = Worksheets("trysheet").Range("A:A")

 On Error Resume Next
 'lookups
 Do While Worksheets("test").Cells(newRow, 4).Value <> ""
 newCL = Worksheets("test").Cells(newRow, 4).Value
 Worksheets("test").Cells(newRow, 5) = Application.Index(rn, 
 Application.Match(newCL, mrange, 0))
 newRow = newRow + 1
 Loop

End Sub

Я пытался использовать Application.WorksheetFunction вместо просто Application. но затем я получаю либо ошибку 1004 - «Невозможно получить свойство Match / Vlookup класса WorksheetFunction», либо ошибка, определенная приложением.

Я был бы очень признателен за любую помощь, я не могу обернуть голову вокруг нее, и это, вероятно, что-то глупое ...

Я также могу отправить файл Excel, если кто-то хочет посмотреть, так как я не могу опубликовать его здесь.

EDIT: Кстати, я достиг требуемого результата, используя традиционную функцию vlookup (с помощью записи макросов и изменения моего цикла):

Sub lookup()

'Variables for the Vlookups
Dim newRow As Long

newRow = 7

Dim rn As Range
Set rn = Worksheets("trysheet").Range("C:C")
Dim mrange As Range
Set mrange = Worksheets("trysheet").Range("A:A")

On Error Resume Next
'
'Get Employee
Do While Worksheets("test").Cells(newRow, 4).Value <> ""
 Worksheets("test").Cells(newRow, 5).FormulaR1C1 = "=VLOOKUP(RC[-1], trysheet!C[-4]:C[-2],3,0)"
 newRow = newRow + 1
Loop

End Sub

Я обычно стараюсь избегать этого метода и придерживаюсь application.WorksheetFunction или application.Vlookup (пример), потому что я считаю его более чистым и автоматически удаляет формулу, но в этом случае делает свою работу. Тем не менее, если кто-нибудь может помочь мне понять, почему метод приложения не работает здесь, я буду благодарен, потому что это происходит со мной в первый раз.

yytsunamiyy дал несколько хороших предложений ниже, но все еще не завершен.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Если вы просто хотите преобразовать формулу в значение, вы можете сделать что-то вроде этого.

Do While Worksheets("test").Cells(newRow, 4).Value <> ""
 Worksheets("test").Cells(newRow, 5).FormulaR1C1 = "=VLOOKUP(RC[-1], trysheet!C[-4]:C[-2],3,0)"
 Worksheets("test").Cells(newRow, 5).Value = Worksheets("test").Cells(newRow, 5).Value
 newRow = newRow + 1
Loop

другие способы

 Sub lookup()

     'Variables for the Vlookups
    Dim newRow As Long
    Dim newCL As String
    Dim Mrange As Range
    Dim rn As Range
    newRow = 7
    Set rn = Worksheets("trysheet").Range("C:C")

    Set Mrange = Worksheets("trysheet").Range("A:C") '<~~ A ~ C

    With Worksheets("test")
       Do While .Cells(newRow, 4).Value <> ""
           newCL = .Cells(newRow, 4)
           .Cells(newRow, 5).Value = WorksheetFunction.VLookup(newCL, Mrange, 3, 0)
        newRow = newRow + 1
       Loop
    End With
End Sub
0 голосов
/ 04 января 2019

В формуле индекса отсутствует ссылка на столбец, попробуйте:

Worksheets("test").Cells(newRow, 5) = Application.Index(rn, Application.Match(newCL, mrange, 0),1)

после обсуждения ниже моего решения:

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

Public shTest As Worksheet
Public shTrySheet As Worksheet

Sub run_lookups()

    Call defineVars
    Call lookup_newrow

End Sub

Sub defineVars()

    Dim sh As Worksheet

        For Each sh In ThisWorkbook.Sheets
            Select Case sh.CodeName
                Case "Test"
                    Set shTest = sh
                Case "TrySheet"
                    Set shTrySheet = sh
            End Select
        Next sh

End Sub

Sub lookup_newrow()

    'Variables for the Vlookups
     Dim newRow As Long
     Dim newCL As String

        newRow = 7

    Dim rn As Range
        Set rn = shTrySheet.Range("C:C")
    Dim mrange As Range
        Set mrange = shTrySheet.Range("A:A")

 'On Error Resume Next
 'lookups
    Do While shTest.Cells(newRow, 4).Value <> ""
        newCL = shTest.Cells(newRow, 4).Value
        shTest.Cells(newRow, 5).Value = Application.WorksheetFunction.Index(rn, Application.Match(newCL, mrange, 0), 1)
        newRow = newRow + 1
    Loop

End Sub

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

Public shTest As Worksheet
Public shTrySheet As Worksheet

Sub run_lookups2()

    Call defineVars2
    Call lookup_values

End Sub

Sub defineVars2()

    Dim sh As Worksheet

        For Each sh In ThisWorkbook.Sheets
            Select Case sh.CodeName
                Case "Test"
                    Set shTest = sh
                Case "TrySheet"
                    Set shTrySheet = sh
            End Select
        Next sh

End Sub

Sub lookup_values()
   Dim rLookupResults As Range
   Dim sName As String

    sName = shTrySheet.Name 'Sheet is referenced through codename, which is unlikely to get changed, but for fomula displayed sheetname is used

    With shTest

        Set rLookupResults = .Range(.Cells(7, 5), .Cells(.Cells(.Rows.Count, 4).End(xlUp).Row, 5))

        'enter LOOKUP() Formula in Lookup Rsult Rang
        rLookupResults.FormulaR1C1 = "=IFERROR(LOOKUP(RC[-1]," & sName & "!C[-4]," & sName & "!C[-2]),"""")"

        'if fixed values are need copy and pastespecial
            rLookupResults.Copy
            rLookupResults.PasteSpecial xlPasteValues
    End With

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