Создание оператора If в L oop для Vlookup - PullRequest
1 голос
/ 26 апреля 2020

Попытка создать al oop с помощью оператора if, где я go через каждое имя столбца, затем создает IFERROR with VLOOKUP, который будет извлекать инвентарь этого имени на определенную дату (найден в другой книге). ), и если этот продукт не имеет каких-либо запасов на эту дату, он равен нулю.

Почему-то выдает ошибку, когда я пытаюсь написать VLOOKUP formula, любая помощь будет отличной.

На консолидированной странице названия продукта указаны в столбце B, затем дата - в столбце C, затем я хочу разместить значение в столбце K.

спасибо!

Sub IFTEST()


LR = ActiveSheet.Cells(Rows.Count, "M").End(xlUp).Row

Dim APPLE As Range
Dim GRAPE As Range
Dim RICE As Range
Dim BREAD As Range
Dim PASTA As Range
Dim INVENTORY As Range
Dim cell As Range


Set APPLE = Workbooks("APPLE.xls").Worksheets("APPLE").Range("K:N")
Set GRAPE = Workbooks("GRAPE.xls").Worksheets("GRAPE").Range("K:N")
Set RICE = Workbooks("RICE.xls").Worksheets("RICE").Range("K:N")
Set BREAD = Workbooks("BREAD.xls").Worksheets("BREAD").Range("K:N")
Set PASTA = Workbooks("PASTA.xls").Worksheets("PASTA").Range("K:N")
Set INVENTORY= Workbooks("INVENTORY.xlsm").Sheets("INVENTORY").Range("B2:B" & LR)

Application.ScreenUpdating = False


For Each cell In Inventory
    If cell.Value = "apple" Then

'here is where I get the error in the lookup

        cell.Offset(0, 12).Value = WorksheetFunction.IfError(WorksheetFunction.VLookup(cell.Offset(0, 1).Value, APPLE, 4, False), 0)

    ElseIf cell.Value = "grape" Then

        cell.Offset(0, 12).Value = WorksheetFunction.IfError(WorksheetFunction.VLookup(cell.Offset(0, 1).Value, GRAPE, 4, False), 0)

    ElseIf cell.Value = "rice" Then

        cell.Offset(0, 12).Value = WorksheetFunction.IfError(WorksheetFunction.VLookup(cell.Offset(0, 1).Value, RICE, 4, False), 0)

    ElseIf cell.Value = "bread" Then

        cell.Offset(0, 12).Value = WorksheetFunction.IfError(WorksheetFunction.VLookup(cell.Offset(0, 1).Value, BREAD, 4, False), 0)

    ElseIf cell.Value = "pasta" Then

        cell.Offset(0, 12).Value = WorksheetFunction.IfError(WorksheetFunction.VLookup(cell.Offset(0, 1).Value, PASTA, 4, False), 0)

    Else

         cell.Offset(0, 12).Value = 0



    End If


Next





End Sub

1 Ответ

0 голосов
/ 26 апреля 2020

Здесь у вас есть оба способа - способ избежать вложенной функции рабочего листа и подход без использования пространства, занимающего несколько IF, или их более умная, но медленная замена оператором Select ... Case.

Sub IfTest()
    ' 012

    Dim Wbooks() As String
    Dim Inventory As Range
    Dim Target As Range
    Dim Cell As Range
    Dim Tmp As Variant
    Dim i As Integer

    Wbooks = Split("Apple,Grape,Rice,Bread,Pasta", ",")

    With Workbooks("Inventory.xlsm").Sheets("INVENTORY")
        Set Inventory = .Range(.Cells(2, "B"), .Cells(.Rows.Count, "B").End(xlUp))
    End With

    Application.ScreenUpdating = False
    For Each Cell In Inventory
        Tmp = Cell.Value
        For i = UBound(Wbooks) To 0 Step -1
            If StrComp(Wbooks(i), Tmp, vbTextCompare) = 0 Then
                ' I would reduce the size of this range
                Set Target = Workbooks(Tmp & ".xls").Worksheets(Tmp).Range("K:N")
            End If
        Next i

        If i Then
            On Error Resume Next
            Tmp = WorksheetFunction.VLookup(Cell.Offset(0, 1).Value, Target, 4, False)
            If Err Then Tmp = 0
            On Error GoTo 0
        Else
            Tmp = 0
        End If
        Cell.Offset(0, 12).Value = Tmp
    Next Cell
End Sub

I не решался предположить, что столбцы K: N в целевой книге будут иметь одинаковую длину, но это будет одним из способов избежать предоставления Excel 1,4 миллиона ячеек для поиска каждого VLookup.

...