我多年来一直在我的VBA修补中使用这段代码:
Range("B2:B" & Range("A" & Rows.Count).End(xlUp).Row).Formula = _
""
Range("B2:B" & Range("A" & Rows.Count).End(xlUp).Row).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
我现在需要能够使用此功能,并将其循环通过1460列,但1460将是可变的。
到目前为止,我的尝试看起来像这样:
Dim a As Interger
a = 3
Do While Cells(1, a) <> ""
Range(Range("R1Ca:RCa") & Range("A" & Rows.Count).End(xlUp).Row).Formula = _
"[super convoluted formula]"
Range(Range("R1Ca:RCa") & Range("A" & Rows.Count).End(xlUp).Row).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
a = a + 1
Loop
所以我在这一点上的重点是如何修改&#34; B2:B&#34;在我的开始示例中,变量可以循环以命中所有列?
答案 0 :(得分:0)
最好一次计算“最后一行”,例如
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
然后允许你当前的陈述
Range("B2:B" & Range("A" & Rows.Count).End(xlUp).Row).Formula =
将替换为等效的
Range("B2:B" & lastRow).Formula =
可以使用Cells
代替地址重新表达
Range(Cells(2, "B"), Cells(lastRow, "B")).Formula =
然后可以很容易地将其转换为使用列的变量的公式:
Range(Cells(2, c), Cells(lastRow, c)).Formula =
请注意,Cells
对象的列参数可以表示为数字(即第1,2,3等列)或字符串(即列“A”,“B”,“ C“等)。迭代多列时,使用数值非常有用。当您只使用一个已知的列时,使用字符串值非常有用 - 它使代码更具“可读性”。
您的重写代码可能是:
Dim c As Long
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
For c = 2 To Cells(1, Columns.Count).End(xlToLeft).Column
Range(Cells(2, c), Cells(lastRow, c)).Formula = "[super convoluted formula]"
Range(Cells(2, c), Cells(lastRow, c)).Value = _
Range(Cells(2, c), Cells(lastRow, c)).Value
Next
(如果您只是尝试粘贴值,则无需进行复制/粘贴 - 将Value
属性设置为Value
属性会更安全。)