2017-08-04 78 views
2

我有一些写入的VBA代码运行速度很慢。我的代码中有一系列不同的循环。我知道循环并不总是最有效的操作数据的方式,所以我认为它们是问题。我需要如何改变循环或消除它的想法,这样我可以加快我的代码的运行时间。消除/改变一个循环来加速代码

下面是我创建的最活跃的循环。它贯穿D行的所有单元格(从D2开始),并根据第1行单元格中的条目操纵它们的值。如果我可以在此循环中获得帮助,我可能会使用类似的技术来更改我的代码中的其他循环。任何提示都表示赞赏。

'sub work week for date range 
    Range("D2").Select 
    Do Until IsEmpty(ActiveCell.Value) 
     If IsEmpty(ActiveCell.Offset(-1, 0)) = False Then 
      ActiveCell.Value = ActiveCell.Offset(-1, 0).Value & "-" & Right(ActiveCell.Value, 4) 
     Else: ActiveCell.Value = ActiveCell.Value & "-" & Right(ActiveCell.Offset(0, -1), 4) 
     End If 
    ActiveCell.Offset(0, 1).Select 
Loop 
+2

使用数组和循环通过这些。 –

+0

正如@Scott所说 - 不是指单元格,而是将这些值拉入数组并循环。 _它正在运行D_行上的所有单元格 - 是否真的需要循环16384单元格(如果在Excel 2003上,则是256)? –

回答

1

最快,效率更高的方法,就像使用数组的注释中所建议的那样。

为了让你到这一点,虽然,我已经给你的第一个步骤,以改善与VBA的交互,并了解如何编写代码,而不选择或激活对象:

For i = 4 To Cells(2, Columns.Count).End(xlToLeft).Column 
    With Cells(2, i) 
     If .Offset(-1, 0).Value = vbNullString Then 
      .Value = .Value & "-" & Right$(.Offset(0, -1).Value, 4) 
     Else 
      .Value = .Offset(-1, 0).Value & "-" & Right$(.Value, 4) 
     End If 
    End With 
Next 

基本上,你不不需要.Select.Activate什么。直接使用对象并使用变量来指定列而不是激活下一个单元格。

一旦你习惯于以这种风格编写代码,可以考虑将范围的值赋给2D数组,然后循环访问数组。

0

为了快速执行,我的第一个建议是如果自动计算和屏幕更新还需要很长时间,也可以关闭。

我同意任何涉及选择的东西都​​会非常慢,所以您应该使用范围对象。

最终代码:

' Declarations 
Dim CurrentCell, LeftCell, PreviousCell As Range 
Dim Last4Chars As String 

'Initialize 
Set CurrentCell = ActiveSheet.Range("D2") 

'Optimizations 
Application.Calculation = xlCalculationManual 
Application.ScreenUpdating = False 

'Loop until Current Cell in Empty 
Do Until IsEmpty(CurrentCell.Value) 
    Set AboveCell = CurrentCell.Offset(-1, 0)  'One row above 
    Set LeftCell = CurrentCell.Offset(0, -1)   'One column left 

    If IsEmpty(AboveCell) = False Then 
     CurrentCell.Value = AboveCell.Value & "-" & Right(CurrentCell.Value, 4) 
    Else 
     CurrentCell.Value = CurrentCell.Value & "-" & Right(LeftCell, 4) 
    End If 

    Set CurrentCell = CurrentCell.Offset(0, 1) 
Loop 

'Optimizations reversed for normal use 
Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True