我有一个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
答案 0 :(得分:0)
转到代码主体的开头(调用此子例程的代码)并添加
Application.ScreenUpdating = False
作为第一行之一。然后在该函数结束时,在调用此子例程后,将其重新打开:
Application.ScreenUpdating = True
这样可以防止在列/行大小的每次更改时重新绘制屏幕,从而显着缩短运行时间。
答案 1 :(得分: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
当您操作许多工作表对象时,这是一个非常密集的进程。算法的改变可以改善该过程所需的时间。也许您应该发布整个代码,以便进一步帮助您。
干杯,
帕斯卡
答案 2 :(得分:0)
对我来说,自动调整速度很慢。我可以在此处添加任何其他答案的唯一一件事就是将其放在单独的模块中,并且仅在必要或有时间时才调用它。同样,要最后实现,则必须测试所有其他代码并使其正常工作。