ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

VB编程之提速攻略

[复制链接]

TA的精华主题

TA的得分主题

发表于 2003-6-1 20:46 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:开发帮助和教程
本帖最后由 chrisfang 于 2013-9-24 21:53 编辑

● 判断空字符串

判断空字符串的常用方法是使用下面的语句:

If my_string = "" Then... 

但是请采用另外一种方法,就是判断字符串的长度是否为0,这要比前者运行快,代码是:

If Len(my_string) = 0 Then ... 。


● 使用With命令引用多次使用的对象

这要比在每条语句中都完整地引用对象名称执行速度快许多!


● 少有字符串操作函数

尽可能少地使用字符串操作函数,它们运行很慢。


● 定制Select Case语句

Select Case是处理多重条件判断的语句,请将经常要用到的选择排列在前面的选项,以增加该选项提前被选择命中的机会。


● 尽可能的使用by ref参数调用函数和子程序


● 将从不需要的表单设置为nothing

如果有许多要标明的表单,采用这个策略,将节省内存并减少运行时间。如果只有少数几个表单,请将它们全部装载进内存并隐藏之,这样将在随后的使用中速度更快。


● 预想一下程序的速度

对程序的运行速度进行想象是非常重要的,设想一下点击按钮后,等待10秒钟。这将是一个非常长的时间!请添加一个进程条显示程序的进展情况,用户就不会感到等待。


● 使用mid$函数而不是mid

如果需要执行许多字符串/文件操作,请使用mid$(以及trim$等等)函数而不是mid。因为后者将数据类型看作是variant 而不是 string,速度将慢3倍。


● 尽快显示启动表单

尽快地显示启动表单可以使程序看起来很快。在表单的Load事件中使用Show命令,从而在执行长时间的启动计算工作前就能显示出程序界面。


● 尽可能地在Form_Load事件中放置少量的代码


● 使用splash技术过渡中间操作

如果初始化的表单要运行很长时间,请先立即显示一个splash画面,然后在初始表单完全装载后,再去除它。关于如果创建不同种类splash画面的资料,请查阅Advanced Visual Basic Techniques。


● 在模块中将子程序分组

当一个程序调用另外一个程序时,另外的程序所在的模块将被装载。如果一个程序需要调用多个不同模块中的程序,那么所有的这些模块都要被装载。因此,将所有相关的程序放置在一个模块中,就可以实现一次装载。


● 不要浪费内存

有时,利用更多的内存可以使程序变快,但是有时却不然。在实际中,如果给程序分配了它不能适应的过多内存,就会严重地影响程序速度。


● 设置AutoRedraw为False

为了节省内存的使用,请将AutoRedraw设置为False。如果设置为True,对于复杂的绘图操作时,刷新屏幕的速度将很快。


● 设置ClipControls为False


● 使用Moveto组件替代设置Left和Top属性


● 隐藏正在修改的控件

当需要修改一系列空间的外观属性值时,请先将此控件执行隐藏操作。完成修改工作后,再使之变为可见。


● 使用临时变量引用多次使用的复杂表达式

比如,需要设置对象SelectedEmployee.NextOfKin.HomeInformation.Address几个属性的数值,请不要多次引用这个长长的表达式,请使用: 

Dim addr As AddressInfo 

Set addr = SelectedEmployee.NextOfKin.HomeInformation.Address 

addr.Street = txtStreet.Text 

addr.City = txtCity.Text 

addr.State = txtState.Text 

addr.Phone = txtPhone.Text


● 缓存多次使用的属性值

如果程序需要多次引用txtLastName.Left的值,请将数值保存在变量中,然后引用这个变量。变量的存取要比属性值的存取在速度上快很多。


● 使用Line (x1, y1)-(x2, y2), , B来绘制一个box,而不要画4次。


● 尽可能地使用Image控件替代PictureBoxes

Image控件消耗较少的内存。


● 使用Frame控件包容其他控件,不要使用PictureBoxes控件做同等工作。前者消耗内存较少。


● 使用控件数组

对于不很重要的控件,请使用控件数组来引用它们。比如,许多表单都包含许多label,请将它们都放入一个控件数组中。一个包含10个控件的控件数组要比10个单独的控件占用更少的内存。


● 使用定时器在后台执行长时间、低级别的运算工作。


● 使用注释,并命名富有含义的变量。

详细的注释、富有含义的变量名以及空白行,不会增加编译程序的长度,反而能大大地提高程序的可读性。


● 消除掉不使用的变量和代码,因为保留它们将消耗内存。


● 使用DoEvents语句

使用DoEvents语句从而运行运行在长时间的进程时可以让用户执行其他的操作。


● 快速搜索目录

为了快速搜索目录,请使用如下相关API函数:FindFirstFile、 FindNextFile 和 FindClose 。


● 大小写比较

UCase$和LCase$函数用于执行大小写比较,但使用下面的API函数将更快: 

Declare Function CharLower Lib "user32" _ Alias "CharLowerA" (ByVal lpsz As String) As String 

Declare Function CharUpper Lib "user32" _ Alias "CharUpperA" (ByVal lpsz As String) As String


● 使用With语句引用对象

下面的语句在引用长表达式对象时,速度更快: 

With SelectedEmployee.NextOfKin.HomeInformation.Address 

.Street = txtStreet.Text 

.City = txtCity.Text 

.State = txtState.Text 

.Phone = txtPhone.Text 

End With


● 使用ByRef方式传递参数数值,而不要使用ByVal方式

当使用ByRef方式时,程序传递数值的地址。而使用ByVal时,程序必须要复制一份数值的拷贝,然后再做传递工作。通常,传递地址要比传递拷贝速度快。


● 使用*而不是^执行简单的整数幂运算

比如,使用语句A=B*B,而不是A=B^2,前者速度要快一些。


● 合成长字符串

如果需要建立一个长字符串,请先一块块地生成,最后再进行合并工作。比如,下面的子程序AddText1, AddText2的功能是在字符串后添加文本,那么如下的代码: 

Dim txt As String

txt = AddText1(txt) 

txt = AddText2(txt)

txt = AddText3(txt) 

要比下面的代码花费更多的时间: 

Dim txt As String 

Dim txt1 As String 

Dim txt2 As String 

Dim txt3 As String 

AddText1(txt1) 

AddText2(txt2) 

AddText3(txt3) 

txt = txt1 & txt2 & txt3

在第1段代码中,AddText子程序必须要对长字符串进行操作。而第2段代码只需要操作相对短小的字符串。


● 保存数学运算的中间结果

比如,下面的一段代码: 

Xsquare = x * x 

Ysquare = y * y 

a = 2 * Xsquare + 3 * Ysquare 

b = 3 * Xsquare + 5 * Ysquare 

If a + b > 50 Then ... 

将比下面的代码运行速度快: 

If 2 * x * x + 3 * y * y + _ 3 * x * x + 5 * y * y > 50 _ Then ...


● 在Loop循环上界中使用数值而不是函数表达式

在使用Loop循环,不要使用函数来判断终止数值,比如如下代码: 

i = 1 

Do While i <= SlowFunction() 

total = total + i 

Loop 

就要比下面的代码运行慢: 

i_max = SlowFunction() 

i = 1 

Do While i <= i_max

total = total + i 

Loop

注意:For语句控制的循环不会每次都计算最终数值,当For语句开始时,系统计算上界数值然后就保存它,每次判断时不用再重新计算。所以,单单使用下面的代码就可以: 

For i = 1 To SlowFunction() 

total = total + i 

Next i


TA的精华主题

TA的得分主题

发表于 2003-6-1 20:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
是你自己的经验吧? 辛苦了,谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2003-6-1 20:56 | 显示全部楼层
一部分是我的经验,一部分是从网上搜集的

TA的精华主题

TA的得分主题

发表于 2003-6-1 21:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好文!

TA的精华主题

TA的得分主题

发表于 2003-6-2 12:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢!

TA的精华主题

TA的得分主题

发表于 2003-6-2 12:32 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2003-6-9 01:31 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2003-6-9 15:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2004-2-8 13:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
真的不错

TA的精华主题

TA的得分主题

发表于 2004-2-8 13:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
[fly]谢谢啊~[/fly] 但我不懂编程
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-24 11:33 , Processed in 0.043742 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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