gpt4 book ai didi

vba - 我的 'cleaner' 代码运行速度比宏录制版本慢

转载 作者:行者123 更新时间:2023-12-02 11:49:30 25 4
gpt4 key购买 nike

我在电子表格中遇到了一个奇怪的问题,该电子表格包含大量计算,并且还必须运行一些目标搜索。

这不是我的电子表格 - 它属于另一个团队 - 但我必须经常使用它,而且速度很慢。慢到让人厌烦。所以我试图加快速度,然后我会让其他团队切换到我更快的代码。

问题是,我重写的代码的运行速度是原始宏记录代码的两倍,我不知道为什么。

原代码:

Range("P43").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy
Range("P35").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlSubtract, _
SkipBlanks:=False, Transpose:=False
Range("P43").GoalSeek Goal:=0, ChangingCell:=Range("P35")

Range("Q43").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy
Range("Q35").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlSubtract, _
SkipBlanks:=False, Transpose:=False
Range("Q43").GoalSeek Goal:=0, ChangingCell:=Range("Q35")

...

它对每一列重复此代码块,直到到达 Z 列,因此它相当冗长。

当我看到这个时,我认为加快速度很容易 - 摆脱选择,添加循环,关闭屏幕更新等 - 通常。

这是我重写的代码:

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

'our worksheet
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Analysis")

'column nos start with c; row nos with r
Dim cFirst As Integer, cLast As Integer, cCurrent As Integer
Dim rGoal As Integer, rChange As Integer

cFirst = 16 'col P
cLast = 26 'col Z

rGoal = 43
rChange = 35

With ws
For cCurrent = cFirst To cLast
'copy values from current column to last column to the other row
.Range(.Cells(rChange, cCurrent), .Cells(rChange, cLast)).Value = .Range(.Cells(rGoal, cCurrent), .Cells(rGoal, cLast)).Value
'run the goal seek on the current column
.Cells(rGoal, cCurrent).GoalSeek Goal:=0, ChangingCell:=.Cells(rChange, cCurrent)
Next cCurrent
End With

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

我是不是做错了什么?我就是看不到。我的新代码更短,产生完全相同的结果,但需要双倍的时间......

任何帮助将不胜感激!

最佳答案

MacroMarc astutely pointed out ,我并没有完全复制原始记录的代码 - 不敢相信我看不到它!

Selection.PasteSpecial Paste:=xlPasteValues, *>>*Operation:=xlSubtract*<<*, _
...

如果没有此操作,重构的代码会引入一个错误,使 GoalSeek 调用比预期的工作更加困难。该作业应实现此 xlSubtract 操作:

.Range(.Cells(rChange, cCurrent), .Cells(rChange, cLast)) _
.Value = .Range(.Cells(rChange, cCurrent), .Cells(rChange, cLast)).Value _
- .Range(.Cells(rGoal, cCurrent), .Cells(rGoal, cLast)).Value

关于vba - 我的 'cleaner' 代码运行速度比宏录制版本慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51412842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com