0

我有一个创建和格式化销售报价的 excel vba 宏。我有一个自动调整合并单元格的功能。我使用此功能来自动调整描述字段,因为其中一些很长,一些很短。在一个典型的报价中,这个函数被调用了大约 40 次。宏在一秒钟内完成。如果我再次运行完全相同的宏(可能对它的显示方式进行不同的设置),则需要 30-60 秒以上。除了以下块之外,宏的其余部分没有任何内容会随着每次运行而减慢:

对于完全相同的一组输入,是否有可能使此代码运行得更慢?

Sub AutoFit_Height(ByVal Target As Range)
Dim MergeWidth As Single
Dim cM As Range
Dim CWidth As Double
Dim NewRowHt As Double

With Target
    .MergeCells = False
    CWidth = .Cells(1).ColumnWidth
    MergeWidth = 0
    For Each cM In Target
        cM.WrapText = True
        MergeWidth = cM.ColumnWidth + MergeWidth
    Next
    'small adjustment to temporary width
    MergeWidth = MergeWidth + Target.Cells.count * 0.66
    .Cells(1).ColumnWidth = MergeWidth
    .EntireRow.AutoFit
    NewRowHt = .RowHeight
    .Cells(1).ColumnWidth = CWidth
    .MergeCells = True
    .RowHeight = NewRowHt
End With
End Sub
4

3 回答 3

0

转到代码主体(调用此子例程的代码)的开头并添加

Application.ScreenUpdating = False

作为第一行之一。然后在该函数结束时,在调用此子例程后,将其重新打开:

Application.ScreenUpdating = True

这将防止它在每次更改列/行大小时重新绘制屏幕,​​从而显着加快运行时间。

于 2013-09-05T21:58:43.757 回答
0

优化你的脚本可能从

  • 使用 xlsb 文件保存扩展名

  • 通过删除未使用的行和列并保存来查找任何不必要的格式,以便使垂直和水平滚动条滚动到必要的数据

  • 尽可能使用命名范围

这可以添加到您的脚本中

在您调用其他模块或函数的主模块的开头

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

在主模块任务结束时完成

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

当您操作许多工作表对象时,这是一个 CPU 密集型过程。算法的改变可以缩短此过程所需的时间。也许您应该发布整个代码,以便进一步帮助您。

干杯,

帕斯卡

http://multiskillz.tekcities.com

于 2014-08-26T10:34:04.530 回答
0

Autofit 对我来说非常缓慢。我可以在这里添加到任何其他答案的唯一内容是将它放在一个单独的模块中,并且仅在必要或有时间时才调用它。此外,最后实施,一旦所有其他代码都经过测试和工作。

于 2020-11-30T01:22:17.270 回答