暂停VBA并重新运行会导致更快的执行

我们有一个macros观的分析,因为我们希望能够看看这个过程,由于这个原因超出范围,我们被迫在macros中使用ActivateSelect 。 我和我的同事都知道使用这种方法的缺点。 同时,testing显示编码和避免select和激活不是主要原因。

在其中一个子模块中 ,我在下面发布它的(伪)代码,我们基本上从表单中获取数据并将其复制到另一个模块中。

问题

问题是这个过程是如此缓慢,但是当我暂停macros( Esc )时,点击debugging,逐步( F8for-loop一个或两个步骤,再次运行( F5 )它运行得更快。

这不会发生在我的for循环或特定工作表的具体步骤,所以没有任何关系我的数据和它的结构。

问题:这有什么可能的原因? 暂停/步骤运行是否导致内存清除或其他可能的情况使其运行得更快? 我怎样才能解决这个问题(让它运行得很快而不需要暂停,等等)?

重要的提示

如上所述,使用“ Select和“ Activate不是减慢过程的主要原因。 我很抱歉发布这个,但需要让你知道我知道如何使用显式选项,设置范围,设置值而不是复制等。我已经改变了我的代码,以避免select,看看是否能解决问题,但情况并非如此。 它仍然缓慢地运行,直到停顿,再次踏入并跑步。 如果您仔细查看问题并说明问题背后的原因,我将不胜感激。 或者至less让我知道为什么这个,我的意思是这个特定的问题,将暂停和再次运行后,正在发生,为什么它与Select/Activate

这是整个运行程序的一个更大的主要模块的一部分,但这是导致问题的部分。 我在主模块中使用了一些优化技术。

 Sub Copy_ModelInputs(RootDir, FileName, TranID, ModOutDir, Angle, x, y, Method, TypeN) 'For each 150 storms, step through model event tabs and copy into runup tabs FileName = RootDir & "NWM\" & FileName FileName_output = ModOutDir & TranID & "_Outputs.xlsm" Workbooks.Open (FileName) FileName = ActiveWorkbook.Name Workbooks.Open (FileName_output) Filename2 = ActiveWorkbook.Name 'copy the angle into the doc sheet Windows(FileName).Activate Sheets("doc").Select Range("c12").Select ActiveCell.value = Angle 'File Transect ID Range("c6").Select ActiveCell.value = TranID ActiveCell.Offset(1, 0).Select ActiveCell.value = FileName_output Range("I4").Select ActiveCell.value = Now Range("d8").Select ActiveCell.value = x ActiveCell.Offset(0, 2).Select ActiveCell.value = y 'copy model output to input into excel spreadsheets For i = 1 To 150 'input SWELs Windows(Filename2).Activate Sheets("Event" & i).Select Range("B2:B300").Select 'Range(Selection, Selection.End(xlDown)).Select Selection.Copy Windows(FileName).Activate Sheets("Event" & i).Select Range("B7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 'input H Windows(Filename2).Activate Range("C2:C300").Select 'Range(Selection, Selection.End(xlDown)).Select Selection.Copy 'Open runup template spreadsheet, copy H0 Windows(FileName).Activate Range("D7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 'input T Windows(Filename2).Activate Range("D2:D300").Select 'Range(Selection, Selection.End(xlDown)).Select Selection.Copy 'Open template Windows(FileName).Activate Range("G7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False If TypeN = 1 Or TypeN = 3 Then 'input deep Windows(Filename2).Activate Range("E2:E300").Select 'Range(Selection, Selection.End(xlDown)).Select Selection.Copy 'Open template Windows(FileName).Activate Range("H7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End If 'input local Windows(Filename2).Activate 'If Method = 2 Then If TypeN = 2 Then Range("G2:G300").Select Selection.Copy 'Open template Windows(FileName).Activate Range("I7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 'input model Windows(Filename2).Activate Range("F2:F300").Select Selection.Copy 'Open template Windows(FileName).Activate Range("H7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 'input length Windows(Filename2).Activate Range("J2:J300").Select Selection.Copy 'Open template Windows(FileName).Activate Range("J7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 'input data Windows(Filename2).Activate Range("I2:I300").Select Selection.Copy 'Open template Windows(FileName).Activate Range("K7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End If 'input sheet Windows(Filename2).Activate If TypeN = 3 Then Range("H2:H300").Select Selection.Copy 'Open template Windows(FileName).Activate Range("S7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End If Windows(Filename2).Activate Application.StatusBar = "Model Output copied Event " & i Next i ActiveWorkbook.Save ActiveWindow.Close ActiveWorkbook.Save ActiveWindow.Close Sheets("Summary").Select End Sub 

PS:我也想知道是否Application.Cursor = xlWait除了其他应用程序属性会显着受益。

PPS请不要调出SelectActivateCopy Paste参数。 上面已经有很多次了,并且已经有了评论。

花了相当多的时间在这个问题上,我想回报这个问题;

正如@Slaibuild议的,我试图通过在每个进程之间打印时间来find代码的瓶颈。 原来, for循环的每一步之间有一个滞后,然后在Debug/Continue之后消失。

Debug/Continue之前和之后, Application属性也不会更改。

YowE3K提出的从即时窗口运行macros的方法实际上解决了这个问题。 不知何故,似乎启动VBE是解决scheme

我也尝试保存我的主要工作簿为* .xlsb解决问题。 但是,它在开始时导致文件加载速度较慢,但​​总的开销时间成本不是很大。

我所知道的即时窗口是它在范围上的差异。 如果什么都没有运行,它假定全局( Public )范围。 否则,它将在应用程序范围内。 我将不胜感激,如果有人可以添加到这一点,并详细解释在什么方式激活VBE不同于从命令button运行macros。

作为参考,我想在答案中还包括不禁用Application.ScreenUpdating会显着影响执行时间。