【问题标题】:VBA vlookup for entire column整个列的VBA vlookup
【发布时间】:2015-03-30 19:06:04
【问题描述】:

我对 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)

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

您能提供的任何帮助将不胜感激。 非常感谢!

【问题讨论】:

  • VLOOKUP function 的单元格地址是什么?虽然您对几乎所有工作表和单元格引用都使用了直接引用,但 参数仍保留为 ActiveCell.Offset(0, -9)
  • 查找值是公式左侧的 9 列。我应该如何引用它?感谢您的快速回复。
  • 写法是VBA解析Application.Vlookup并将值放入单元格中。如果您这样做并希望它反映 的各个行,那么您必须遍历它们。如果您想实际将公式放入单元格并让工作表计算解决公式,那是另一回事。
  • 我最初把它作为一个公式,但它花了很长时间。您对如何使其更快有任何想法吗?

标签: excel vba vlookup


【解决方案1】:

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

    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

为了避免循环,您可以将公式批量写入整个列,但外部引用会减慢公式的速度。您可能会开始将范围(例如 )加载到数组中并以这种方式进行处理,然后将值集体返回到工作表。超过 65K 行的任何内容都可能需要转置。没有提到如何处理 L 列。数据的性质(数字与文本与其他)是一个考虑因素。期望找到值的时间百分比是另一个考虑因素。

具有预期结果的完整样本数据是最好的办法。请参阅How to create a Minimal, Complete, and Verifiable example。另一种选择是让它工作到一定程度的满意度,然后将工作代码重新发布到 SE 的 Code Review,并就可以改进的地方寻求建议。

【讨论】:

  • 谢谢!这真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
相关资源
最近更新 更多