改进VBA代码,使其可以遍历列

时间:2017-05-09 21:20:21

标签: excel-vba vba excel

我多年来一直在我的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;在我的开始示例中,变量可以循环以命中所有列?

1 个答案:

答案 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属性会更安全。)