即使关闭事件,Excel VBA代码也会运行得非常慢

时间:2017-03-15 18:14:49

标签: excel vba

以下是我的一些同事已用于清理Excel文档的宏。这是一个完整的混乱!信不信由你,这是清理版本(我删除了大量的活动窗口滚动,一遍又一遍地调整列和行宽)。即使在我清理完所有事件(并关闭事件)之后,此代码仍然运行缓慢(10-15秒)并在整个页面上滚动。关于我如何改进它以更快地运行它的任何想法?

<input type="text" class="number" id="annual-income" name="annual_income">
<input type="text" class="number" id="commission" name="commission">
<input type="text" class="number" id="bonus" name="bonus">
<input id="income-button" type="button" value="Next">

1 个答案:

答案 0 :(得分:1)

嗯,你关闭了事件......在宏代码执行任何操作之前,这个块对我来说是相当标准的:

Dim PrevCalc As XlCalculation
With Application
    PrevCalc = .Calculation
    .Calculation = xlCalculationManual
    .Cursor = xlWait
    .Calculate
    .EnableEvents = False
    .ScreenUpdating = False
End With

然后我&#34;撤消&#34;当宏完成时,或者出现错误时:

With Application
    .Cursor = xlDefault
    .Calculate
    .Calculation = PrevCalc
    '.ScreenUpdating = True 'Not Needed...
    .EnableEvents = True
End With

顺便说一下,你调用的每个修改单元格的操作在技术上都是一个COM调用 - 所以你想要最小化它们。宏记录不够智能,无法知道修改单元格时你只做了一件事。

例如,在这里你真的只想让文本居中:

Range("A1").Select
With Selection
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlTop
    .WrapText = True
    .Orientation = 0
    .AddIndent = False
    .IndentLevel = 0
    .ShrinkToFit = False
    .ReadingOrder = xlContext
    .MergeCells = False
End With

将其更改为:

Range("A1").HorizontalAlignment = xlCenter