避免在Excel中选择VBA仍然无法加快我的代码

时间:2018-02-16 23:42:57

标签: excel vba excel-vba

这是我第一次在StackExchange上找不到问题的答案。你们这些人非常彻底。无论如何,我们最近从2007年更新到Office 365 / Excel 2016,现在我的VBA脚本不会运行,除了一夜之间。我研究并了解到使用Select / Activate是一个可怕的人。我已经看到了我的方式的错误,但现在即使是简单的代码仍然不想在大表上运行。我的代码,它清除当前工作表中的格式,以便更快地填充数据:

Sub ClearFormattingAndValidation()

Dim referenceCell As Range
Dim rngToFormat As Range

With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    .EnableEvents = False
End With

Set referenceCell = Cells.Find("Some specific text", after:=ActiveCell, LookAt:=xlWhole)

Set rngToFormat = Range(referenceCell.Offset(2, 0), ActiveCell.SpecialCells(xlLastCell))
'    rngToFormat.Select

With rngToFormat
    .Validation.Delete 'near-instantaneous
    .FormatConditions.Delete 'took 7-15 minutes on timed runs
End With

With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
    .EnableEvents = True
End With

End Sub

当我取消注释rngToFormat.Select时,我总共获得了76,302个单元格,以便您了解电子表格的大小。有很多验证和条件格式。在2007年,即使使用选择/选择,它也会在几秒钟内完成。现在,我不知道需要多长时间。我在5分钟后放弃了。它确实在较小版本的工作表上成功运行。

如果可能的话,我想避免删除验证和条件格式化,但如果这是加速它的唯一方法,那么对于大约一半的可能性来说这是一种(耗时且昂贵的)可能性。

我还能做些什么来让代码运行得更快,还是有些东西我做错了?

修改:代码已更改,以反映截至2月21日的评论/建议。类似的结果。

2 个答案:

答案 0 :(得分:1)

您的代码会立即使用Excel 2013运行。

虽然代码可以写成如下......

Sub ClearFormattingAndValidation()
Dim referenceCell As Range
Dim rngToFormat As Range

With Application
    .Calculation = xlCalculationManual
    .EnableEvents = False
    .ScreenUpdating = False
End With
Set referenceCell = Cells.Find("Some specific text", after:=ActiveCell, LookAt:=xlWhole)

If Not referenceCell Is Nothing Then
    Set rngToFormat = Range(referenceCell.Offset(2, 0), ActiveCell.SpecialCells(xlLastCell))
    With rngToFormat
        .FormatConditions.Delete
        .Validation.Delete
    End With
End If

With Application
    .Calculation = xlCalculationAutomatic
    .EnableEvents = True
    .ScreenUpdating = True
End With
End Sub

答案 1 :(得分:0)

With ActiveSheet
    .EnableFormatConditionsCalculation = False
End With

这会禁用导致速度减慢的条件格式。运行代码后应该重新启用它。

再次感谢,@ sktneer。你的帮助把我推向正确的方向。