我在任何地方都找不到这个问题的答案,所以我希望你们能帮我。我的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人创建了一个新的工作表),这很好。令人费解的是,尽管使用了Application.ScreenUpdating = False (在宏的早期,但此时仍处于活动状态),当Excel保持活动窗口时,运行宏所需的时间会增加到惊人的25~秒。输入相同,输出相同。因此,简单地说,运行宏,从excel -宏选项卡运行大约需要4-5秒。运行宏,但保持在excel和等待-25秒。
我试过Application.WindowState = Application.WindowState,ActiveWindow.SmallScroll,DoEvents,Application.CalculateFull()。我尝试了不同的计算设置,但我实际上没有使用Excel固有的任何公式计算--我必须使用Excel作为接口,因为源文件是*.xls文件,最后的输出必须保持这种格式。
如果你需要我提供更多的代码片段来理解它,那就问问吧。我已经被困了两天了。
发布于 2016-04-01 12:13:55
您可以尝试再多几行来禁用计算和警报等。
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,应该先提到这个哈哈。
我也看到您尝试过类似的东西,但是代码不正确,试试这个。
https://stackoverflow.com/questions/36355622
复制相似问题