编写高效Excel VBA代码的最佳实践文档格式.docx

上传人:b****2 文档编号:14530026 上传时间:2022-10-23 格式:DOCX 页数:23 大小:30.16KB
下载 相关 举报
编写高效Excel VBA代码的最佳实践文档格式.docx_第1页
第1页 / 共23页
编写高效Excel VBA代码的最佳实践文档格式.docx_第2页
第2页 / 共23页
编写高效Excel VBA代码的最佳实践文档格式.docx_第3页
第3页 / 共23页
编写高效Excel VBA代码的最佳实践文档格式.docx_第4页
第4页 / 共23页
编写高效Excel VBA代码的最佳实践文档格式.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

编写高效Excel VBA代码的最佳实践文档格式.docx

《编写高效Excel VBA代码的最佳实践文档格式.docx》由会员分享,可在线阅读,更多相关《编写高效Excel VBA代码的最佳实践文档格式.docx(23页珍藏版)》请在冰豆网上搜索。

编写高效Excel VBA代码的最佳实践文档格式.docx

注:

这是工作表级的设置

关闭一些Excel功能使代码运行更快

Application.ScreenUpdating=False

Application.DisplayStatusBar=False

Application.Calculation=xlCalculationManual

Application.EnableEvents=False

ActiveSheet.DisplayPageBreaks=False'

(2)放置在主代码结束后的一段代码,用来将Excel恢复到代码运行前的设置

代码运行后,恢复Excel原来的状态;

将下面的代码放在代码的末尾

Application.ScreenUpdating=screenUpdateState

Application.DisplayStatusBar=statusBarState

Application.Calculation=calcState

Application.EnableEvents=eventsState

ActiveSheet.DisplayPageBreaks=displayPageBreaksState'

下面简要解释这些设置:

Application.ScreenUpdating:

将该属性设置为False,告诉Excel不要重绘屏幕。

其优点是不需要Excel花费资源来绘制屏幕,因而其改变会更快而不致让用户察觉其变化。

因为如此频繁地绘制屏幕需要大量的资源,所以关闭绘制屏幕直到代码执行结束。

在代码结束前,确保重新开启了该属性。

Application.DisplayStatusBar:

将该属性设置为False,告诉Excel停止显示状态栏。

例如,如果使用VBA复制/粘贴单元格,当粘贴执行时Excel将在状态栏中显示操作的进度。

关闭屏幕更新不会关闭状态栏显示,因此,如果需要的话,可以禁用屏幕更新而仍然可以通过状态栏给用户提供反馈。

记住,如果将该属性设置为False,在代码结束前应该将其设置为True。

Application.Calculation:

该属性允许编程设置Excel的计算模式。

“手工的”(xlCalculationManual)模式意味着Excel等待用户(或代码)来触发计算;

默认为“自动的”(xlCalculationAutomatic)模式,意味着由Excel来决定何时重新计算工作簿(例如,当在工作表中输入新公式时)。

由于重新计算工作簿将花费时间且浪费资源,因此可能不希望每次改变单元格值时Excel都触发重新计算。

当代码执行时关闭重新计算,在代码结束前再设置回重新计算模式。

Application.EnableEvents:

将该属性设置为False,告诉Excel不要触发事件。

你可能不希望Excel为每个正在通过代码发生改变的单元格触发事件,关闭事件将加速VBA代码的执行。

ActiveSheet.DisplayPageBreaks:

当在较新版本的Excel中运行VBA时,则可能比在早期版本的Excel中需要更长的时间完成。

例如,需要几秒钟在早期版本的Excel中完成的宏可能需要几分钟才能在更高版本的Excel中完成。

或者,第二次运行一个宏可能比第一次运行需要的时间更长。

这是由于VBA宏修改了多行或列的属性,或者必须强制执行计算Excel分页符。

如果宏设置了任何PageSetup属性或者手动设置了PageSetup属性,接着运行较大区域的行或列属性设置时会出现这样的问题。

您可以将该属性设置为False来提高代码的运行速度。

当然,在代码运行结束前,应将该属性恢复为原设置。

在单个操作中读/写大块的单元格区域

本技巧用于优化在Excel和代码之间转换数据的次数。

使用数组变量存储所需要的值并执行取值或赋值操作,而不是一次遍历单个单元格并获取或设置单个值。

例如,下面的代码在单元格区域A1:

C10000中放置随机数。

代码段一:

运行速度较慢的代码

SubtestSlow()

DimDataRangeAsRange

DimIrowAsLong

DimIcolAsInteger

DimMyVarAsDouble

SetDataRange=Range("

A1:

C10000"

 

ForIrow=1To10000

ForIcol=1To3

MyVar=DataRange(Irow,Icol)'

从Excel单元格中读取值30K次

IfMyVar>

0Then

MyVar=MyVar*MyVar'

改变值

DataRange(Irow,Icol)=MyVar'

将值写入Excel单元格中30000次

EndIf

NextIcol

NextIrow

EndSub

代码段二:

运行速度更快的代码

SubtestFast()

DimDataRangeAsVariant

DataRange=Range("

).Value'

一次从Excel单元格中读取所有的值,将其放入数组

MyVar=DataRange(Irow,Icol)

改变数组中的值

DataRange(Irow,Icol)=MyVar

Range("

).Value=DataRange'

一次将所有结果写回单元格

避免选取/激活对象

使用选取的方法更新单元格区域是最慢的。

在试验了使用Range对象、使用Variant类型和使用Select方法对一个大的单元格区域读写数据的操作后,Select方法是最慢的。

再来看一个例子:

在工作表中有40个形状,在每个形状中写入“Hello”。

使用Select方法的代码为:

DimiAsInteger

Fori=0ToActiveSheet.Shapes.Count

ActiveSheet.Shapes(i).Select

Selection.Text="

Hello"

Nexti

运行速度更快的方法是完全避免使用选取并直接引用形状:

ActiveSheet.Shapes(i).TextEffect.Text="

在使用宏录制器时,所生成的程序代码在应用任何方法或属性之前都会激活或者选择对象。

但是,并不是在所有的情况下都需要这样做。

所以,在您编写VBA程序代码时,不需要在对对象执行任何任务之前都激活或者选择每个对象。

例如,在Excel中,我们如果要使第一行变成粗体就必须先选项中它。

但在VBA中(除在图表操作时需要选中图表对象外),很少需要这样做,即VBA可以在不选中第一行的情况下,将它变成粗体。

宏录制器的代码:

Rows("

1:

1"

).Select

Selection.Font.Bold=True

改编后的代码为:

Row(“1:

1”).Font.Bold=True

这样做还可以使程序代码更简洁,并且程序可以运行得更快。

工作簿设计

好的工作簿设计和数据组织有助于编写运行良好的代码。

良好设计的工作簿,其执行效率和维护量将大大优化。

可以说,工作簿设计是从大的宏观方面进行优化,而对代码的优化只是一些微观的细节上的优化。

其他

∙尽量简化代码

通过简化代码,可以提高程序的性能。

您可以将通用过程编写为子过程来调用。

例如,假设有一个应用程序需要在不同的地方实现查找一定范围内的某个特殊条目,在一个没有简化代码的应用程序中,不同的过程可能需要应用各自的算法以实现在某个范围内查找某一条目,修改每个过程使其采用一个更有效的算法并不是一件很容易的事。

而一个简化的程序则只有一个查找算法,即将该查找算法编写成通用的子程序,需要查找某个范围的过程都调用该子程序,通过在查找方法的子程序中优化查找算法,使得调用该方法的所有过程都享受性能提高所带来的好处。

另外,删除所有无关的代码,这在所录制宏中表现得尤为明显。

在录制宏时,经常会产生一些与所实现的功能无关的代码,您可以将这些代码删除,以使得代码得以简化。

宏录制器生成无效代码的一个原因是它不知道在对话框中您选择了哪些选项,因此,当您关闭对话框时它将直接记录所有可用的选项。

例如,选择单元格区域G2:

G20,然后在单元格格式对话框中改变字体样式为粗体,使用宏录制器生成的代码如下:

SubNowThis1()

DimStartAsDouble,FinishAsDouble

Start=Timer

'

--------------------------------------

为了进行测试,将循环100次

DimNAsLong

ForN=1To100

***************************

Range("

G2:

G20"

WithSelection.Font

.Name="

Arial"

.FontStyle="

Bold"

.Size=10

.Strikethrough=False

.Superscript=False

.Subscript=False

.OutlineFont=False

.Shadow=False

.Underline=xlNone

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1