VBA:过滤范围上的Application.VLookup返回第一个过滤行后相同的值

这是一个更大的工作簿的简化版本,它演示了我遇到的问题;

VBA过滤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 

由于原始工作簿有成千上万的行,我select使用范围作为第一个参数(lookup_value)。 这工作正常,如果数据未经过滤。 不过,我有一些行我不想更新,所以这些都是基于他们的内容过滤掉。 在这个例子中,我已经手动过滤了3,8和11个月。正如你所看到的,这只会导致返回1月/ 2月的好几个月。

我已经尝试创build一个基于xlCellTypeVisible的过滤范围(按照下面),但这似乎没有任何影响。

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

如果您不需要对隐藏行执行查找,则可以将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。