我无法在任何地方找到这个问题的答案,所以我希望你们能帮助我。我的excel宏经历了几次迭代的数据。它会自动过滤源文件,获取信息,处理数据,并再次执行约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人创建了一个新表),这很好。令人困惑的是,当Excel保持我的活动窗口时尽管使用Application.ScreenUpdating = False
(在宏中较早,但此时仍然处于活动状态),运行宏的必要时间上升到惊人的25秒。相同的输入,相同的输出。所以简单地说 - 运行宏,tab excel - 宏需要大约4-5秒才能运行。运行宏,但保持在excel等待 - 25秒。
我已尝试Application.WindowState = Application.WindowState
,ActiveWindow.SmallScroll
,DoEvents
,Application.CalculateFull()
。我尝试了不同的计算设置,但我并没有真正使用Excel中的任何公式计算 - 我必须使用Excel作为接口,因为源文件是* .xls文件,最终输出必须保持这种格式。
如果您需要我提供更多代码片段来理解它,请随便提出。我已经被困了好两天了。
答案 0 :(得分:0)
您可以尝试多行来禁用计算和警报等。
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
就是这样,非常简单而且非常有效,无论它有多大,这种从阵列到阵列的转移都是立竿见影的。
如果有帮助,请告诉我
由于 保罗S
---------------新消息-------------------
你可以尝试一些可能有点过分和风险的东西,如果你只是在窗口处于活动状态时遇到这个问题并显示如何让它变得不可见,问题是如果你的代码失败并且你没有陷入错误它会在你转到任务管理器并在那里关闭它之前保持隐身。
Application.Visible = false
这也应该停用窗口(虽然我从未测试过)
这应该模拟你隐藏窗口,并在你的代码完成后把它带回来。
---------------新消息-------------------
Application.Windowstate = xlMinimized
这应该可以解决问题:D,应该首先提到这个哈哈
我也刚刚看到你尝试了类似的东西,但代码不正确,试试这个