Vba 非常非常慢的Excel宏

Vba 非常非常慢的Excel宏,vba,excel,Vba,Excel,我正试图通过转储一个数据池并重新格式化来自动化我每天在工作中必须完成的过程。我已经为此工作了很长一段时间,我最不想去的地方就是论坛寻求帮助。我已经做了一些研究,包括了尽可能多的建议,我可以在我的宏中找到。当我第一次创建宏的时候,我把所有的“选择”都放在里面了,它运行得很快。由于我一直在试运行,速度越来越慢。现在需要2分钟或更长时间才能完成,并在前5秒内停止响应,然后在2-3分钟后完成 这样做的目的是重新格式化要查看的工作表的信息,并根据日期创建工作表,以对信息进行优先级排序。所有日期都链接到一个

我正试图通过转储一个数据池并重新格式化来自动化我每天在工作中必须完成的过程。我已经为此工作了很长一段时间,我最不想去的地方就是论坛寻求帮助。我已经做了一些研究,包括了尽可能多的建议,我可以在我的宏中找到。当我第一次创建宏的时候,我把所有的“选择”都放在里面了,它运行得很快。由于我一直在试运行,速度越来越慢。现在需要2分钟或更长时间才能完成,并在前5秒内停止响应,然后在2-3分钟后完成

这样做的目的是重新格式化要查看的工作表的信息,并根据日期创建工作表,以对信息进行优先级排序。所有日期都链接到一个名为“Hot sheet”的工作表,但我创建了一个新的工作表,然后切换公式引用,这样Excel就不会自行工作。我是一个新手,自学成才,所以请对我宽容一些

PS:当我保存文件时,它现在提示我说:“隐私警告:此文档包含宏、ActiveX控件、XML扩展包信息或Web组件。这些可能包括文档检查器无法删除的个人信息。”

代码:


尝试关闭屏幕更新以释放系统资源。您的宏可能还有其他问题,但您应该注意到性能有了显著的提高

在宏的开头添加:

Application.ScreenUpdating = False
在末尾(在“结束子项”之前)添加:


我希望这能有所帮助。

从哪里开始?顺便说一句,不要误会,很明显,您已经知道如何让Excel使用VBA完成您想要的任务。这些提示更多地是关于解决性能方面的问题

  • Application.ScreenUpdate=False(开始时)在结束时重新启用
  • 您似乎更喜欢在公式中使用R1C1表示法,将其替换为通过.Range2属性将每个单元格块中的所有输入数据获取到二维数组中的模式
  • 根据需要使用循环更新数组中的值来执行所有数据转换
  • 将数组写回大小完全相同的单元格区域,并将数组传入.Range2属性
  • 带积木的木块看起来很无害,你可以把它们留下
  • 将格式化条件一直移动到末尾,除非您需要它(不应该)
  • 添加一个表(listobject)并将您的范围转换为该表。然后使用数据块引用您将在上面的提示(2.)中修改的数据
  • 如果有必要,可以使用该表插入行。但是,最好使用数组中的数据,根据需要在数组中添加行(元素),然后计算新的数组大小,并按照提示(2.到4.)将其写回

  • 提示,不要使用复制和粘贴,而是使用
    Sheets(“View2”).Range(“A1:D500”).Value=Sheets(“View1”).Range(“A1:D500”).Value来指定数组范围中的值。例如,不要使用
    Insert()
    要移动单元格,只需首先将单元格放在正确的行中。如果您想优化数组中的传递,它是.Range2而不是Range。这些数据来自何处?数据库?我建议您编写一个高效的查询,以所需的格式从数据库中获取数据。很难从这个庞大的数据块中判断您在做什么如果你有一个性能问题,你需要监控你的代码,并尝试分析问题所在,然后集中精力解决。事实上Excel有可扩展性限制,而将你的业务流程建立在Excel宏上是一种责任。很抱歉,我为什么要写这么多来回答这些问题。这是一个文本文件中的数据转储。所以。Ja72我会尝试数组,但我会插入帮助格式。我正在将PDF文件转换为文本文件,然后尝试在Excel中复制PDF文件的格式,以便进行分析。因此Eletriclama没有查询。我只是在尝试整理杂乱无章的垃圾。是的,我尝试过这个。我没有真正注意到改进。我是j令人失望的是,随着越来越多的提示让这件事情变得越慢,速度也就越快。我想这可能是因为它是一台公司的电脑。但正如我在原始帖子中所说的。当它选择销售时,你确实要看它跳来跳去,但它没有冻结,它走得更快。我不是我不确定这是否有助于向您提供更多信息,但我在中添加了一些内容,创建了一个新工作簿,并重新创建了新工作簿中的所有内容。这大约只需5秒钟即可完成。这是否意味着一旦保存工作簿,速度就会慢很多?
    Application.ScreenUpdating = False
    
    Application.ScreenUpdating = True