【问题标题】:Excel VBA Length-1 In a RangeExcel VBA Length-1 在一个范围内
【发布时间】:2011-05-18 02:51:26
【问题描述】:

我最近在很长一段时间没有需要后进入 Excel 宏开发。

我有一列有两百行,每行都有一个值。我写了一个循环来迭代每一行值,读取当前值,然后将值写回减去最后一个字符。

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

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

但是,这不起作用。

如果确实可行,有什么线索可以说明如何做到这一点吗?

感谢任何提示。

【问题讨论】:

  • 你说的是循环遍历范围内的每个元素吗?我相信仍然必须有一个循环,我认为您不能一次执行所有操作。

标签: vba range cell


【解决方案1】:

如果您想要最大性能(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

【讨论】:

  • 这个例子非常有用。我想我现在了解了如何使用 Ranges 处理数据的语法。
【解决方案2】:

你可以做类似的事情

 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

【讨论】:

  • 我想要做的速度改进是编写更高效的代码,因为我可以说我没有做最好的事情,尤其是当我尝试越来越大的列时。我已经在代码运行时关闭了屏幕刷新。感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2017-10-31
  • 2011-12-12
  • 2016-07-19
  • 1970-01-01
相关资源
最近更新 更多