整个列的VBA vlookup

时间:2015-03-30 19:06:05

标签: excel vba vlookup

我对VBA很新,这是我第一次在这里发帖。我试图让一个宏添加两列使用vlookup从另一个工作簿中查找值。最终我希望宏循环通过整个文件夹来处理,所以我不能在同一工作簿上有工作表。

到目前为止,我有:

Range("K1:L1").EntireColumn.Insert
Range("K1") = "Rank"
Range("L1") = "Distance"
Range("K2:K" & Range("A" & Rows.Count).End(xlUp).Row).Formula =  Application.VLookup(Range(ActiveCell.Offset(0, -9)), Workbooks("SOSP.nearestGHCND.simple.xlsx").Worksheets("Sheet1").Range("D:F"), 2, False)

我认为引用有问题,但我很难找到如何在线正确格式化它。还

非常感谢您提供的任何帮助。 非常感谢!

1 个答案:

答案 0 :(得分:0)

在询问'...如何让它更快?'时,尽可能多地包含尽可能多的信息总是一个好主意。将外部工作簿的< table_array> 加载到变量中应该会有所帮助,但是根据行数的不同,它仍然需要一些时间来遍历它们。

    Dim lr As Long, rw As Long, extRNG As Range

    'the following assumes that SOSP.nearestGHCND.simple.xlsx is open
    Set extRNG = Workbooks("SOSP.nearestGHCND.simple.xlsx").Worksheets("Sheet1").Range("D:F")

    lr = Range("A" & Rows.Count).End(xlUp).Row
    Range("K:L").EntireColumn.Insert
    Range("K1:L1") = Array("Rank", "Distance")
    For rw = 2 To lr
        Cells(rw, 11) = Application.VLookup(Cells(rw, 2), extRNG, 2, False)
    Next rw

    Set extRNG = Nothing

为避免循环,您可以将公式批量写入整个列,但外部参考会降低公式的速度。您可以开始将范围(例如< lookup_range> < table_array> )加载到数组中并以此方式处理,然后将值一起返回到工作表。超过~65K行的任何东西都可能需要转置。没有提及如何处理L列。数据的性质(数字与文本与其他)是一个考虑因素。预期值的百分比是另一个考虑因素。

完成预期结果的样本数据是最佳追索权。请参阅How to create a Minimal, Complete, and Verifiable example。另一个选择是让它达到某种程度的满意度,然后在SE Code Review重新发布工作代码,并询问有关可以改进的地方的建议。