这是一个更大的工作簿的简化版本,它展示了我所拥有的问题;
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)
答案 0 :(得分:0)
如果您不需要为隐藏行执行查找,则可以将objValues
和objResult
的范围设置为仅包含范围内的可见单元格,然后执行查找过滤范围中的每个单元格:
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。