首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel活动窗口运行缓慢

Excel活动窗口运行缓慢
EN

Stack Overflow用户
提问于 2016-04-01 11:50:15
回答 1查看 132关注 0票数 1

我在任何地方都找不到这个问题的答案,所以我希望你们能帮我。我的excel宏经历了几次数据迭代。它自动过滤源文件,获取信息,处理数据,并再次这样做50次--每人一次。下面是一些代码,我的意思是,所有单独的子方法都工作得很好,而且非常快:

代码语言:javascript
复制
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.WindowStateActiveWindow.SmallScrollDoEventsApplication.CalculateFull()。我尝试了不同的计算设置,但我实际上没有使用Excel固有的任何公式计算--我必须使用Excel作为接口,因为源文件是*.xls文件,最后的输出必须保持这种格式。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-01 12:13:55

您可以尝试再多几行来禁用计算和警报等。

代码语言:javascript
复制
Application.ScreenUpdating = false
Application.Calculations = xlManual
Application.DisplayAlerts = False

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

我没有你的代码那么糟糕,只是举一个例子说明它是如何工作的。

代码语言:javascript
复制
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

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

一旦你完成了你需要做的事情,那么你需要做的就是把这些值放回工作表范围内。

代码语言:javascript
复制
Sheet1.Range("A1:G100000").value = RangeArray

这就是它,非常简单,非常有效,无论它有多大,这种从数组到范围的转换都是即时的。

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

谢谢保罗S

您可以尝试一些可能有点过度和风险的东西,如果您只在窗口处于活动状态并显示时遇到这个问题,那么如何使其不可见,问题是如果您的代码失败而您未能捕获一个错误,它将保持不可见性,直到您进入任务管理器并在那里关闭它。

代码语言:javascript
复制
Application.Visible = false

这应该也会使窗口停用(尽管我从未测试过)

这将模拟您隐藏窗口,并在代码完成后将其带回来。

代码语言:javascript
复制
Application.Windowstate = xlMinimized 

这应该能起作用:D,应该先提到这个哈哈。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36355622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档