ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2378|回复: 6

[求助]搞了一夜没找到原因,高手帮我优化一下代码,打印巨慢!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-6-24 01:38 | 显示全部楼层 |阅读模式

查询后打印很慢,打印窗口在userform4里,代码乱,请见谅,谁帮我优化一下呀,测试时请耐心等待,如果在查询里选条件,再点打印基础信息的话,很慢,我的E2180,1G内存的机子要等几分钟呢,复制数据那段代码在另一个程序里很快,我复制过来后又加了几个判断后就变慢了,帮看看啊!

 

6fUfX61I.rar (39.26 KB, 下载次数: 7)


[此贴子已经被作者于2008-6-24 1:39:26编辑过]

WFOVc6TE.rar

130.31 KB, 下载次数: 8

[求助]搞了一夜没找到原因,高手帮我优化一下代码,打印巨慢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-6-24 09:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

 

[em02][em02][em02][em02]顶下

TA的精华主题

TA的得分主题

发表于 2008-6-24 13:29 | 显示全部楼层
搞不清你的程序里装了什么。要想发现问题不如从头编。

TA的精华主题

TA的得分主题

发表于 2008-6-24 14:15 | 显示全部楼层

回复:(wty2004)[求助]搞了一夜没找到原因,高手帮我...

ogxFxwtC.rar (129.82 KB, 下载次数: 14)


sheets 汇总表 had too many formula and make your macro run slow.

Now I add application.calculation = xlmanual in your macro.

Try and test.

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-6-24 17:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
QUOTE:
以下是引用KCFONG在2008-6-24 14:15:06的发言:


sheets 汇总表 had too many formula and make your macro run slow.

Now I add application.calculation = xlmanual in your macro.

Try

高手啊,速度果然发生的质变,但没看出来哪动了手术

就看到加了一句Application.Calculation = xlCalculationManual 

你意思是说汇总表里公式太多,每次筛选公式要重新计算造成的吗?

感谢了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-6-24 17:08 | 显示全部楼层

随着微软Office的广泛应用,基于该平台开发的VBA应用程序也随之越来越多,这些应用大大地提高了我们的办公效率。可我们经常听到有朋友抱怨用VBA开发的应用程序运行速度慢,的确,由于VBA是一种宏语言,在运行速度上受到许多条件的限制,这在某种程度上制约了它的应用,但也有时候是由于人为的编程习惯造成的,因此用户编程的方法直接影响到VBA程序的运行效率。本文列举了一些提高VBA程序运行效率的方法供大家参考。

尽量使用VBA原有的属性和方法

    由于Excel对象多达数百个,对象的属性、方法、事件更是多不胜数,对于初学者来说可能对它们不全部了解,这就产生了编程者经常编写与Excel对象的属性、方法相同功能的VBA代码,这些代码段的运行效率显然与Excel对象的属性、方法完成任务的速度相差甚大。例如Range对象的CurrentRegion属性可用来返回Range对象所在的单元格区域即活动单元格所在的矩形区域,同样功能的VBA代码可能由于单元格区域的不断变化,不是一两句代码所能描述清楚的了。因此编程前应尽可能多地了解Excel对象的属性和方法。

    充分利用工作表函数

    充分利用工作表函数是提高程序运行速度的非常有效的方法。如求平均工资的例子:

For Each rng In Range("C2:C300")

TotalValue = TotalValue +rng.Value

Next

AverageValue = TotalValue / Range("C2:C300").Rows.Count

    相比之下,用下面的代码在运行时速度会快得多:

AverageValue=Application.WorksheetFunction.Average(Range("C2:C300"))

    其中的Average方法就是求平均值的函数。其它函数也可以在VBA代码中直接使用,只需在函数名称前加上对象名称“Application.WorksheetFunction”就可以了。

    尽量减少对象引用

    使用With和End With语句可以对指定的对象进行一系列的操作,而不用重复引用被操作的对象,这样可以大大  地提高程序代码的效率。如:

Workbooks(1).Sheets(1).Range("C2:C300").Font.Name="黑体"

Workbooks(1).Sheets(1).Range("C2:C300").Font.FontStyle="Bold"

    而以下语句会比上面的语句运行速度要快一些:

With Workbooks(1).Sheets(1).Range("C2:C300").Font

.Name = "黑体"

.FontStyle = "Bold

End With 

    尽可能减少“.”的使用

    VBA语句中所调用的方法和属性越多,执行语句所用的时间就越长。如果某个对象被多次引用,此时可以将此对象用Set关键字设置为对象变量,把对象模型中较高层次对象的引用保存到局部对象变量中以减少对对象的访问。如在引用某单元格数据时,可选用下面代码: 

Dim i As Long

For i=1 to 10

Workbooks(" Book1.xls").Worksheets(" Sheet1").Cells(1,i).Value=i 

Next i 

    但这段代码对对象的引用需要重复执行10次,而下面的代码运行效率则会高一些,因为代码中Workbook对象和Worksheet对象的引用只执行一次。

Dim ws As Worksheet 

Dim i As Long 

Set ws= Workbooks(" Book1.xls").Worksheets(" Sheet1") 

For i=1 to 10 

ws.Cells(1,i).Value=i 

Next i 

    尽量简化代码

    公用的过程在代码中应编写为子程序以方便其它过程的调用。假设有一个应用程序需要在不同的地方实现查找一定范围内的某些特殊的记录,在一个没有简化代码的应用程序中,不同的过程可能需要应用各自的算法以实现在某个范围内记录的查找,这样的代码不仅冗长,如果要在所有的子过程中修改查询的代码可不是件容易的事件。

另外,在编写代码的过程中我们经常会录制一些宏代码或借鉴别人的代码。这其中肯定会有与所实现的操作无关的代码,我们可以将这些代码删除以使得代码最简化。

    强制声明变量

    在VBE 编辑器中始终保持“要求变量声明”复选框被选中(在“工具”菜单的“选项”对话框设置),这样将在模块代码顶部出现“Option Explicit”语句,这就要求用户在编写代码时要对所有变量进行声明,按所需数据类型声明变量可以节省系统的内存资源。创建的对象变量使用完毕后要及时释放,如:

Dim TempObj As AnyObject 

Set TempObj=New AnyObject 

……

Set TempObj=Nothing 

    关闭屏幕刷新

    关闭屏幕更新是提高VBA程序运行速度的最有效的方法,它可以有效地减少程序运行过程中的屏幕“闪烁”,直接把程序运行的最终结果展现给用户。

    关闭和恢复关闭屏幕更新的方法如下:

Application.ScreenUpdate = False

Application.ScreenUpdate = True 

    设置计算模式为手动

    如果您的工作表中含有多个公式,每次单元格中的值发生变化时,公式都将会重新计算,这会影响程序运行的速度。你可以在进入主程序运行前将计算模式设置为手动,即使用语句“Application.Calculation = xlCalculationManual”以避免不必要的计算,或者只重新计算表格中受到影响的单元格“Application.Calculation = xlCalculationSemiautomatic”。当程序运行结束前还应恢复Excel的默认计算模式设置,即设置为自动重算“Application.Calculation = xlCalculationAutomatic”。

    合理地使用消息框和窗体

    尽管窗体提供了许多功能,但它们能够导致文件大小迅速增加。因此在程序代码中如果要显示程序运行的结果,能不用窗体的可尽量不使用,如果需要可用消息框获取和输出用户的信息。此外在工作表窗体中尽量避免将工作表中的单元格链接到用户创建窗体控件中,因为这样将会导致链接的更新操作,影响程序运行速度。

    有效地使用数组

    用数组取代单元格区域来处理数据可以大大地提高程序运行的效率,即先将数据写入到某个数组中,然后用一个语句就可以将数组中的数据传递到单元格区域中。

    在创建已知元素个数的静态数组时,使用Array函数对于节约空间和时间以及写出更具效率的代码是非常理想的。 例如:

Dim Names As string 

Names=Array("一级","二级","初级","高级") 

    此外,应该尽量使用固定大小的数组。如果确实选择使用了动态数组,应该避免数组每增加一个元素就改变一次数组的大小,最好是每次增加一定数量的数组元素。

    执行循环时尽可能地节省资源 

在循环语句中去掉不必要的执行消耗内存的重复操作。例如是否可以在循环体外(而不是在循环体中)设置某些变量?每次都通过循环执行的转换过程是否可以放在循环之外执行等等。另外,如果必须在循环中引用数组元素,可以创建一个临时变量存储该元素的值,而不是引用数组中的值,因为从数组中检索值比从相同类型的变量读取值要慢。

    对于初学VBA的用户来说,今天给大家介绍的这些“大道理”可能暂时还用不上,但随着对VBA研究的逐步深入,开发的应用程序功能越来越复杂,你就会体会到这些技巧的妙处了。

呵呵,终于找到原因了,要学的东西看样子还很多

TA的精华主题

TA的得分主题

发表于 2009-10-7 20:14 | 显示全部楼层

回复 7楼 wty2004 的帖子

不错的帖子
没办法啊!毕竟是VBA,想优化也不太有空间
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-16 18:08 , Processed in 0.044642 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表