当Excel活动窗口时Excel缓慢运行

我无法find这个问题的答案,所以我希望你们能帮助我。 我的Excelmacros经历了几次迭代的数据。 它自动过滤源文件,取出信息,处理数据,并重复约50次 – 每人一次。 下面是我的意思是一些代码,所有的个人子方法工作得很好,而且非常快:

For j = 1 To names.Count 'filter the source by name, generate sheet FilterName names(j) 'prepare data with the necessary dates FillMasterDates dates(), j Dim i As Long Dim ending As Long ending = Sheets("Daten").Rows.End(xlDown).Row Dim cellvalue As String 'check dates, etc For i = 1 To ending cellvalue = Sheets("Daten").Cells(i, 1) If cellvalue = "" Then Exit For End If ColorCell (i) FilterDate CStr(dates(i)), names(j) Next i 'user data has been successfully gathered, copy over to final sheet FillColumns j Next j 

整个代码需要大约4秒钟的时间来运行(假设我有大约2000行,并且为50个人创build了一个新的表),这很好。 令人困惑的是,尽pipe使用Application.ScreenUpdating = False (在macros中早些时候,但在这一点仍然活跃),Excel保持我的活动窗口,运行macros的必要时间达到了惊人的25秒。 相同的input,相同的输出。 所以简单地说 – 运行macros,tab出excel – macros需要大约4-5秒才能运行。 运行macros,但留在excel中,等待 – 25秒。

我已经尝试了Application.WindowState = Application.WindowStateActiveWindow.SmallScrollDoEventsApplication.CalculateFull() 。 我尝试了不同的计算设置,但是我并没有真正使用Excel中的任何公式计算 – 我必须使用Excel作为接口,因为源文件是* .xls文件,最终输出必须保持为这种格式。

如果你需要我提供更多的代码片段来理解它,请去问。 我已经被困了两天了。

你总是可以尝试更多的线路来禁用计算和警报等。

 Application.ScreenUpdating = false Application.Calculations = xlManual Application.DisplayAlerts = False 

但是,如果你真的想绕过所有的背景废话excel似乎通过不通过循环直接访问表,这个概念可能是棘手的,如果你不习惯它,但它的价值每一点,并会加快你的代码如此之快会奇怪你为什么从来没有做到这一点。

我没有让你的代码如此恶劣只是举例说明它是如何工作的

 Dim RangeArray as Variant 'This will store your range as a values array RangeArray = Sheet1.Range("A1:G100000").Value 'this will put the entire ranges values into the array If Not IsArray(RangeArray) Then ExitSub 'If your range is only 1 cell it will not create an array so be careful, handle this as needed 'This Array always starts lowerbound 1, RangeArray(1,1) = First Cell 

现在,您可以循环访问数据,并像使用单元格或范围一样操作和修改数组,除了没有开销,它只是值而不是对象。

一旦你完成了你所需要的一切,你需要做的就是将这些值放回到表单范围内

 Sheet1.Range("A1:G100000").value = RangeArray 

而且这是非常简单而且非常有效的,不pipe它有多大,从arrays到arrays的转换都是立即的。

只要让我知道这是否有帮助

感谢Paul S

– – – – – – – -新消息 – – – – – – – – – –

你可以尝试一些可能有点过分和冒险的东西,如果你只是在窗口处于活动状态时才得到这个问题,并显示如何使它看不见,问题是如果你的代码失败了,你不能捕获一个错误,你到taskmanager并closures它。

 Application.Visible = false 

这也应该停用窗口(虽然我从来没有testing过)

这应该模拟你隐藏窗口,只是当你的代码完成后把它带回来..

– – – – – – – -新消息 – – – – – – – – – –

 Application.Windowstate = xlMinimized 

这应该是诀窍:D,应该提到这第一哈哈

我也刚刚看到你尝试过类似的东西,但是代码不正确,试试这个