VBA:Filtered Range上的Application.VLookup在第一个筛选行之后返回相同的值

时间:2015-12-22 14:40:57

标签: excel vba excel-vba

这是一个更大的工作簿的简化版本,它展示了我所拥有的问题;

VBA Filtered vLookup Example.xlsm

Sub LookupMonths()
    Set objValues = ThisWorkbook.Sheets("Lookup Results").Range("A2", "A13")
    Set objResult = ThisWorkbook.Sheets("Lookup Results").Range("B2", "B13")
    Set objSource = ThisWorkbook.Sheets("Lookup Source").Range("A1", "B13")
    objResult.Value = Application.VLookup(objValues, objSource, 2, False)
End Sub

由于原始工作簿有数千行,我选择使用范围作为第一个参数(lookup_value)。如果数据未经过滤,这可以正常工作。但是我有许多行我不想更新,因此根据其内容过滤掉这些行。在这个例子中,我已经手动过滤了第3,8和11个月。正如您所看到的,这导致仅在1月/ 2月返回的数月。

我尝试根据 xlCellTypeVisible 创建过滤范围(如下所示),但这似乎没有任何影响。

Set objFilteredResult = objResult.SpecialCells(xlCellTypeVisible)
objFilteredResult.Value = Application.VLookup(objValues, objSource, 2, False)

1 个答案:

答案 0 :(得分:0)

如果您不需要为隐藏行执行查找,则可以将objValuesobjResult的范围设置为仅包含范围内的可见单元格,然后执行查找过滤范围中的每个单元格:

Set objValues = ThisWorkbook.Sheets("Lookup Results").Range("A2", "A13").SpecialCells(xlCellTypeVisible)
Set objResult = ThisWorkbook.Sheets("Lookup Results").Range("B2", "B13").SpecialCells(xlCellTypeVisible)
Set objSource = ThisWorkbook.Sheets("Lookup Source").Range("A1", "B13")

For Each c In objResult
    c.Value = Application.VLookup(c.Offset(0, -1), objSource, 2, False)
Next

编辑:请注意,在这种情况下,您根本不需要设置objValues。