范围链接到相邻列中的最后一个单元格

我有一个有4列的工作表,我写了一个macros,把公式放在A + B列中,这些列依赖于列D中的内容,然后复制并粘贴为值以启用对这些列的过滤。 我的问题是,每周的列D变得更长。 我不希望不断地改变A + B(A2:A69422)范围内macros的值,其中69422是D列中最后一个使用的单元格。

Worksheets("salesinfo").Range("B2").Formula = "= MID(D3,3,5)" Range("B2").Select Selection.AutoFill Destination:=Range("B2:B69422") Range("B2:B69422").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.Value = Selection.Value Range("A2").Formula = "= VLOOKUP(B2,[Data.xlsb]Stores!$A:$X,4,0)" Range("A2").Select Selection.AutoFill Destination:=Range("A2:A69422") Range("A2:A69422").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Workbooks("Data.xlsb").Close SaveChanges:=False Application.CutCopyMode = False Range("A2").Select 

使用以下语法确定列D中的最后一行,然后将其分配给LongIntegervariables。 在我的例子中,我使用lRow作为我的variables:

 Dim lRow As Long With ActiveSheet lRow = .Cells(.Rows.Count, 4).End(xlUp).Row End With 

然后在单元格地址的行参考中使用lRow + 1

正如TheGuyThatDoes'nKnowMuch所指出的那样 ,声明一个Longtypesvariables并存储模式相关列的最后一个已填充行最好通过从下到上来完成。 这相当于从工作表底部开始,然后点击Ctrl +

以下是一些可以改进代码的其他方法。

  • 使用With … End With语句定义您的工作簿对象和工作表对象 ,并通过在每个范围对象前加一个..Range(...) 。 不要离开.Parent工作表引用隐式; 总是让他们明确。
  • 一次写下所有的公式; 不需要使用Range.AutoFill方法 。
  • 直接值转换比复制和粘贴特殊值更有效,不涉及剪贴板。
  • 避免使用Range.Select和Range.Activate方法 ¹。 他们可能是一个开始使用VBA的好方法,但他们也是你应该gradle的第一件事。

当只需要A:D时,在VLOOKUP函数内的外部工作簿中引用列A:X; 在任何情况下, INDEX / MATCH函数对在大量的行中都可能更好。

您正在向列A中写入一个引用外部工作簿Data.xlsb的公式,所以我知道这不是包含salesinfo工作表的工作表。 您应该调整下面的工作簿参考,以避免使用ActiveWorkbook属性 。

  Dim lr As Long With ActiveWorkbook With .Worksheets("salesinfo") lr = .Cells(.Rows.Count, "D").End(xlUp).Row With .Range("B2:B" & lr) .Formula = "=MID(D3, 3, 5)" .Value = .Value End With With .Range("A2:A" & lr) .Formula = "=VLOOKUP(B2, [Data.xlsb]Stores!$A:$X, 4, FALSE)" 'alternate formula '.Formula = "=INDEX([Data.xlsb]Stores!$D:$D, MATCH(B2, [Data.xlsb]Stores!$A:$A, 0))" .Value = .Value End With .Range("A2").Activate End With End With Workbooks("Data.xlsb").Close SaveChanges:=False 

指定给B栏的公式关系到我一点。 你从B2中的公式引用D3。 这意味着如果将公式填充到B列以匹配D列中的所有值,那么最后一个公式实际上将引用D列中最后一个填充的单元格下面的空白单元格。

如果遇到计算滞后问题(花费很长时间),将两列公式写入近70K行,字典对象和变体数组可以非常明显地加快速度。


¹ 请参阅如何避免使用在Excel VBAmacros中select更多的方法来摆脱依靠select和激活来实现您的目标。