【问题标题】:Efficient looping through an array高效循环数组
【发布时间】:2016-10-17 23:42:33
【问题描述】:

我有一列全名,我想用首字母代替。

我目前正在这样做:

Dim n As Long
Dim varray As Variant
Dim FullNameRange As Range
Dim FullName As String

varray = Range(NDLstaffCol & FirstLineItemRow & ":" & staffCol & LastRow + 1)

For n = FirstLineItemRow To UBound(varray, 1)
    Set FullNameRange = ActiveSheet.Range(staffCol & n)
    FullName = FullNameRange.Value
    FullNameRange = Left(FullName, 1) & Mid$(FullName, InStr(FullName, " ") + 1, 1)
Next

其中LastRow 将最后一条记录称为全局变量。

与同一模块中的其他子例程相比,这需要较长的处理时间。

有更好的方法吗?

作为参考,我从来不知道全名,所以硬编码的查找/替换不起作用。有

【问题讨论】:

  • 对我来说看起来不错,它的运行时复杂度为 O(n),无法改进(至少在这个宇宙中)。您是否尝试过在调试器之外运行?它在调试模式下和正常运行一样慢吗?您是否尝试过使用 .NET Office SDK 在 C#/.NET 中重写它?如果在运行 Excel 时将其最小化,它会运行得更快吗?您使用的是哪个版本的 Excel?
  • @Dai 在“live”时正常运行缓慢。我使用进度条(用户窗体)向用户显示他们在子程序中的位置,当我到达本节时,它需要很长时间。没听说过重写和使用 SDK。最小化不会影响时间。 Excel 2016。如果这真的是最好的方法,那么我很高兴我只有

标签: arrays vba excel loops


【解决方案1】:
Dim n As Long, rng As Range
Dim varray As Variant
Dim FullNameRange As Range
Dim FullName As String, v

Set rng = Range(staffCol & FirstLineItemRow & ":" & staffCol & LastRow + 1)
varray = rng.Value

For n = 1 To UBound(varray, 1)
    v = varray(n, 1)
    varray(n, 1) = Left(v, 1) & Mid$(v, InStr(v, " ") + 1, 1)
Next

rng.Value = varray

【讨论】:

  • 哇。刚刚测试了这个,它从我的总数中减少了大约 2 分钟......谢谢!你能解释一下为什么会这样吗?也许我哪里出错了?
  • 您将数据拉入一个数组,然后在工作表上逐个单元格循环:更改数组中的数据然后在一次操作中将其写回工作表要快得多。
  • 哈哈,这正是我打算把它放在一个数组中的原因——非常感谢!
猜你喜欢
  • 2018-04-23
  • 2012-03-19
  • 2016-01-03
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2021-09-15
相关资源
最近更新 更多