【问题标题】:Change cells value assignment to range and array assignment to improve performanceExcel VBA 单元格赋值性能提高
【发布时间】:2022-11-11 21:45:45
【问题描述】:

大家好,我正在审查 VBA 中的一些遗留代码,我需要对其进行优化以提高性能。 我是 VBA 的新手,需要一些帮助。 我想将这些单元格分配更改为范围和数组分配以显着提高性能,但我似乎无法将单元格引用转换为范围。

    Sheets("Model").Activate
    YearRange = Range("C7:EZ7").value

    loopvar = 1
    Do While YearRange(1, loopvar) <> "" And Right(Trim(YearRange(1, loopvar)), 1) <> "E"
      strValue = Trim(YearRange(1, loopvar))
      Year = CInt(strValue)
  
      GetSpecificData Year, RptPe, RptAvg
      
      If (RptPe <> 0) Then Cells(508, loopvar + 2).value = RptPe
      If (RptAvg <> 0) Then Cells(509, loopvar + 2).value = RptAvg
    
      loopvar = loopvar + 1
    Loop

这是我要改进的一段代码,单元格分配大约是 15 个,我只放了 2 个作为参考,通常我们谈论的是 30 年或更长时间,所以这段代码的运行通常需要大约 20 年或秒。

我在另一个地方有一个类似的循环,但不是单元格使用范围,我能够创建一个数组,然后将数组分配给范围并将时间减少到不到 1 秒。

更新 1:GetSpecificData 从一年中获取数据并用数据填充变量,这样做所花费的时间可以忽略不计。 瓶颈似乎是将数据分配给单元格。

【问题讨论】:

  • GetSpecificData() 会发生什么?
  • 获取特定数据,从数据库中获取数据并用数据填充变量
  • 为了澄清,您在每个循环期间都在查询?
  • 不完全是它确实有很多方法和技术来减少时间,我们已经对不同的部分进行了计时,这个调用占总时间的不到 10%
  • 不显示功能,看全貌,是无济于事的。

标签: excel vba range cell


【解决方案1】:

很难说出如此有限的信息可能是什么原因。

但罪魁祸首可能是 XL 中的自动重新计算?现在,您的工作表在每个 Cells(508, loopvar + 2).value = RptPe 之后重新计算整个工作表,这可能是执行缓慢的原因。

也许你可以用Application.Calculation = xlCalculationManual 装饰While ... Loop,如下所示。虽然确保一些错误处理,否则如果发生错误或代码中断,您的应用程序会“卡在”非计算模式中。

Sub Something()
    On Error GoTo ErrorExit
    Application.Calculation = xlCalculationManual        

    Sheets("Model").Activate
    YearRange = Range("C7:EZ7").Value

    loopvar = 1
    Do While YearRange(1, loopvar) <> "" And Right(Trim(YearRange(1, loopvar)), 1) <> "E"
        strValue = Trim(YearRange(1, loopvar))
        Year = CInt(strValue)
    
        GetSpecificData Year, RptPe, RptAvg
        
        If (RptPe <> 0) Then Cells(508, loopvar + 2).Value = RptPe
        If (RptAvg <> 0) Then Cells(509, loopvar + 2).Value = RptAvg
      
        loopvar = loopvar + 1
    Loop
    
ErrorExit:
    Application.Calculation = xlCalculationAutomatic
    
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多