2011-05-18 114 views
2

我最近进入Excel宏开发很长一段时间没有必要。Excel VBA长度在一个范围

我有一列有两百行,其中每行都有一个值。我编写了一个循环来遍历每一行值,读取当前值,然后将值写回去掉最后一个字符。

这里是我写的一些实际(和伪)代码。

Dim theRow as Long 
Dim totRow as Long 
Dim fooStr as String 


theRow = 2 'we begin on the second row of the colummn 
totRow = 201 'there are 200 values 


For theRow = 2 to totRow 
    fooStr = WorkSheets(DestSheet).Cells(theRow,"A").Formula 'read the cell value 
    fooStr = Left(fooStr,Len(fooStr)-1 'subtract the last character from the value 
    Cells(theRow,1).Value = fooStr 'write the value back 
Next theRow 

在我做了一些阅读之后,我了解到最好的做法是使用Range来读取和写入数值。是否有可能使用Range重写我正在做的事情,这样它会变得更快。

这是我到目前为止所提出的。

Range("A2:A201").Value = Len(Range.Left("A2:A201").Value)-1 

但是,这是行不通的。

如果这确实可行,那么如何做到这一点的任何线索?

感谢您的任何提示。

+0

您是否在讨论循环范围中的每个元素?我相信还有一个循环,我认为你不能一次完成。 – jonsca 2011-05-18 03:40:59

回答

3

如果您希望达到最高性能(您不需要它为200行,但是......),您必须将读取和写入(大部分写入)的数量减到最小。这意味着将整个范围读入数组,操作数组,然后将其写回范围。这是一个阅读和一个写作,相比之下,200个循环。这是一个例子。

Sub RemoveLastChar() 

    Dim vaValues As Variant 
    Dim i As Long 

    vaValues = Sheet1.Range("A2").Resize(200).Value 

    For i = LBound(vaValues, 1) To UBound(vaValues, 1) 
     vaValues(i, 1) = Left$(vaValues(i, 1), Len(vaValues(i, 1)) - 1) 
    Next i 

    Sheet1.Range("A2").Resize(UBound(vaValues, 1), UBound(vaValues, 2)).Value = vaValues 

End Sub 
+0

这个例子非常有用。我想我现在理解如何使用范围处理数据的语法。 – PED 2011-05-18 17:32:07

0

你可以做类似

Sub StringTrim() 
    Dim xCell as Range 
    Range("A1:A201").Select 

    For Each xCell in Selection 
     xCell.Value = Left(xCell.Value, Len(xCell.Value) - 1) 
    Next 

End Sub 

我不知道你在寻找什么样的速度提高,而且这也将做的工作。

您可能已经知道这一点,但将Application.ScreenUpdating = False置于代码的顶部可显着加快速度(除非您喜欢在脚本工作时观看所有内容)。您应该在代码末尾将值重置为True

+0

我想要做的速度改进是编写更高效的代码,因为我可以告诉我没有做最好的事情,特别是当我尝试更大更大的列时。随着代码的运行,我已经关闭了屏幕刷新。感谢您的建议! – PED 2011-05-18 17:31:00