我对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)
我认为引用有问题,但我很难找到如何在线正确格式化它。还
非常感谢您提供的任何帮助。 非常感谢!
答案 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重新发布工作代码,并询问有关可以改进的地方的建议。