【问题标题】:Using Vlookup In VBA With Filter Conditions在具有过滤条件的 VBA 中使用 Vlookup
【发布时间】:2017-04-23 18:12:17
【问题描述】:

我在这里想要完成的是

1) 是迭代 O 列中的值以及那些不为空的值 - 过滤标题为 DATA 的工作表以仅显示列 B = X 的值并使用 VLOOKUP() 将查找值返回到相应的行在 P 列
2) 如果 O 列为空,则过滤标题为 DATA 的工作表以仅显示 B 列 X 的值,并使用 VLOOKUP() 将查找值返回到 P 列中的相应行。

我尝试了下面的语法,但我收到了一个错误

对象“_Worksheet”的方法“Rarnge”失败

我需要在下面的代码中做些什么不同的事情来获得返回我想要的值的语法?

Dim destSheet As Worksheet: Set destSheet = Sheets("Main")

For i = Range("A" & Rows.Count).End(3).Row To 2 Step -1
    If Not IsEmpty(Cells(i, "O").Value) Then
        Sheets("Data").Select
        Selection.AutoFilter
        ActiveSheet.Range("$A:$C").AutoFilter Field:=2, Criteria1:="<>"
        Sheets("Main").Select
        Application.CutCopyMode = False
        form2 = "=IFERROR(VLOOKUP(RC[-15],Lookup!C[-15]:C[-13],3,FALSE),"""")"
        destSheet.Range("P:P" & lr).Formula = form2
    Else
        Sheets("Data").Select
        Selection.AutoFilter
        Sheets("Main").Select
        Application.CutCopyMode = False
        form3 = "=IFERROR(VLOOKUP(RC[-15],Lookup!C[-15]:C[-13],3,FALSE),"""")"
        destSheet.Range("P:P" & lr).Formula = form3
    End If
Next i

【问题讨论】:

    标签: vba excel excel-2013


    【解决方案1】:

    对我来说有点难以理解你想要做什么,如果我理解错了,请纠正我。

    首先,在运行宏时选择工作表不是首选方法,除非您有意这样做,因此请避免这样做。

    其次,您不需要过滤任何内容,您可以通过检查代码中的条件来控制它。你不做物理上的事情,你在你的代码中理论上做它们,并显示输出。 查看此代码,并在需要帮助的地方询问。

    Sub VLookups()
    
    Dim destSheet As Worksheet: Set destSheet = Sheets("Main")
    Dim i As Long
    Dim myVal As Variant
    
    Set lookupRange = Sheets("Data").Range("$A:$C") 'This is your lookup range
    
    For i = 2 To Range("O" & Rows.Count).End(xlUp).Row 'Iterate from 2nd row till last row
        myVal = Application.VLookup(destSheet.Cells(i, "A").Value, lookupRange, 2, False)
        If IsError(myVal) Then GoTo Skip 'If searched value not found then skip to next row
    
        If Not IsEmpty(Cells(i, "O").Value) Then 'If Cell in Column O not empty
            If myVal = "YOUR X VALUE FOR COLUMN B" Then 'If Your Column B X value exists
                destSheet.Cells(i, "P").Value = Application.VLookup(destSheet.Cells(i, "A").Value, _
                lookupRange, 3, False) 'Column P Cell is populated by Data Sheet Column C Cell
            End If
        Else 'If Cell in Column O empty
            If myVal <> "YOUR X VALUE FOR COLUMN B" Then 'If Your Column B X value not exists
                destSheet.Cells(i, "P").Value = Application.VLookup(destSheet.Cells(i, "A").Value, _
                lookupRange, 3, False) 'Column P Cell is populated by Data Sheet Column C Cell
            End If
        End If
    Skip:
    Next i
    End Sub
    

    【讨论】:

    • 如果 A 列中的值只包含一次,这将起作用。似乎如果 A 列中的值存在两次,它只会查找第一个值?
    • vlookup 会自然地找到第一个值。如果你想要第 n 个结果,这是一个不同的问题,你可以开始挖掘 here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多