当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.WindowState
, ActiveWindow.SmallScroll
, DoEvents
, Application.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,应该提到这第一哈哈
我也刚刚看到你尝试过类似的东西,但是代码不正确,试试这个
- 我们不能使用Excel作为Selenium的对象存储库..?
- Excel VBA复制
- Excel:解决按datesorting表,在范围内有空行
- VBA对话框在不同的工作簿中select范围挂起
- 优化VBA / Excelmacros代码(查找重复和sorting大型数据集)
- CSV实际上是…分号分隔值…(AZERTY上的Excel导出)
- 用PythonparsingExcel Pandas 0.18 => 23,999(欧式)被parsing为23999
- 使用Python urllib2 / requestsvalidationGoogle Drive并下载电子表格
- Ruby 2.0 CSV阅读器以不同的方式处理Microsoft Excel生成的CSV文件,而不会去除控制字符