我有一个包含4列的工作表,我编写了一个宏来将公式放在A + B列中,这些列依赖于D列中的内容,然后复制并粘贴为值以启用对这些列的过滤。我的问题是每周列D变得更长。我不想在宏中更改A + B范围内的值(A2:A69422),其中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
答案 0 :(得分:2)
使用以下语法确定D列中的最后一行,然后将其分配给Long
或Integer
变量。在我的示例中,我使用lRow
作为我的变量:
Dim lRow As Long
With ActiveSheet
lRow = .Cells(.Rows.Count, 4).End(xlUp).Row
End With
然后在单元格地址的行引用中使用lRow + 1
。
答案 1 :(得分:1)
如TheGuyThatDoesn'tKnowMuch所述,声明一个Long类型变量并存储模式相关列的最后一个填充行最好通过自下而上查看来完成。这相当于从工作表底部开始并点击 Ctrl + ▲。
以下是其他一些可以改进代码的方法。
.
前缀.Range(...)
。不要隐含.Parent工作表引用;总是让它们明确。当您只要求A:D效率低时,在VLOOKUP function内引用外部工作簿中的列A:X;无论如何,对于大量行,INDEX / MATCH函数对可能更好。
您正在A列中编写一个引用外部工作簿Data.xlsb的公式,因此我知道这不是包含salesinfo工作表的工作表。您应该调整下面的工作簿参考,以避免使用ActiveWorkbook property。
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行,字典对象和变体数组可以非常明显地加速。
.¹有关远离依赖select和activate以实现目标的更多方法,请参阅How to avoid using Select in Excel VBA macros。