




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
[VBA起步]常用的、带解释的VBA短句[A65536].End(xlUp).Row'A列末行向上第一个有值的行数[A1].End(xlDown).Row'A列首行向下第一个有值之行数[IV1].End(xlToLeft).Column'第一行末列向左第一列有数值之列数。[A1].End(xlToRight).Column'第一行首列向右有连续值的末列之列数Application.CommandBars("Standard").Controls(2).BeginGroup=True'在常用工具栏的第二个按钮前插入分隔符Cells.WrapText=False'取消自动换行IfLen(Target)>5Then'如果当前单元格中的字符数超过5个,执行下一行Target.WrapText=True'自动换行EndIf[A1:B10].SpecialCells(xlCellTypeBlanks).Rows.Hidden=True'有空格即隐藏行[A2].'返回活动单元格的工作表名[A2].'返回活动单元格的工作簿名如下代码可使工作簿打开后30秒(或闲置30秒)内不输入、不重新选择等,自动关闭工作簿PrivateSubWorkbook_Open()'工作簿打开事件tt'工作簿打开时启动tt过程EndSubPrivateSubWorkbook_SheetChange(ByValShAsObject,ByValTargetAsRange)'工作表变化事件tt'工作表中任一单元格有变化时启动tt过程EndSubPrivateSubWorkbook_SheetSelectionChange(ByValShAsObject,ByValTargetAsRange)'工作表选择变化事件tt'工作表中单元格的选择有变化时启动tt过程EndSubSubtt()'tt过程DimmyNowAsDate,BLAsInteger'定义myNow为日期型;定义BL为长整型myNow=Now'把当前的时间赋给变量myNowDo'开始循环语句DoBL=Second(Now)-Second(myNow)'循环中不断检查变量BL的值IfBL=30ThenGoToCl'当BL=30即跳转到CLDoEvents'转让控制权,以便sheets可继续操作LoopUntilBL>30'当BL>30即跳出循环ExitSubCl:Application.EnableEvents=False'避免引起其他事件ActiveWorkbook.CloseTrue'关闭活动工作簿并保存Application.EnableEvents=True'可触发其他事件EndSubrange("e4").addcomment.Text"代头"&Chr(10)&"内容……"'添加批注range("e4").Comment.Visible=True'显示批注把工作簿中所有工作表的指定列调整为最佳列宽:Sub调整列宽()Dimi%Fori=1ToSheets.Count'遍历工作簿中所有的工作表Sheets(i).Columns("A:K").AutoFit'把每个工作表的[A:K]列调整为最佳列宽NextiEndSubDo循环语句的几种形式:1.DoWhilei>1'条件为True时执行......'要执行的语句Loop2.DoUntili>1'条件为False时执行......'要执行的语句Loop3.Do......'要执行的语句LoopWhilei>1'条件为True时执行4.Do......'要执行的语句LoopUntili>1'条件为False时执行5.While...Wend语句Whilei>1'条件为True时执行......'要执行的语句Wend勾选"VBA项目的信任"Application.SendKeys"%(tmstv){ENTER}"'在Excel窗口操作Application.SendKeys"%(qtmstv){ENTER}"'在VBE窗口操作Application.CommandBars("命令按钮名称").Position=msoBarFloating'使[命令按钮]悬浮在表格中Application.CommandBars("命令按钮名称").Position=msoBarTop'使[命令按钮]排列在工具栏中ActiveStectPassword:="wshzw"'为工作表保护加口令ActiveSheet.UnprotectPassword:="wshzw"'解除工作表保护Activesheet.ProtectContents'判断工作表是否处于保护状态工作表的复制与命名Subwshzw()DimiAsIntegerFori=1To5Sheets("Sheet1").CopyAfter:=Sheets(1)'Before/After复制新表在Sheets("Sheet1")前/后ActiveSheet.Name=i&"月"'为复制的新表命名NextiSheets("Sheet1").Name="总表"'为Sheets("Sheet1")改名EndSubApplication.EnableEvents=FalseApplication.EnableEvents=True'抑制事件连锁执行Application.EnableEvents=FalseActiveWorkbook.Save'抑制BeforeSave事件的发生Application.EnableEvents=True'抑制指定事件Application.DisplayAlerts=False'屏蔽确认提示Application.ScreenUpdating=FalseApplication.ScreenUpdating=true'冻结屏幕以加快程序运行ActiveCell.CurrentRegion.Select'选择与活动单元格相连的区域range("a2:a20").NumberFormatLocal="00-00"'区域的格式化ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row'已用区域的最末行ActiveSheet.CopyBefore:=Sheets(1)'复制活动工作表到第一张工作表之前range("a2:a20").FormulaHidden=True'工作表处于保护状态时隐藏部分单元格公式FileDateTime("E:\MyDocuments\33.xls")或FileDateTime(thisworkbook.FullName)'文件被创建或最后修改后的日期和时间FileLen(thisworkbook.FullName)/1024或FileLen("E:\MyDocuments\temp\33.xls")/1024'文件的长度(大小),单位是KBApplication.AskToUpdateLinks=False'不询问是否更新链接,并自动更新链接ActiveSheet.Hyperlinks.Delete'删除活动工作表超链接ActiveWorkbook.SaveLinkValues=False'不保存活动工作簿的外部链接值ActiveSheet.PageSetup.CenterFooter=Range("k2").Value'打印时设置自定义页脚ActiveSheet.PageSetup.Orientation=xlLandscape'设置为横向打印ActiveSheet.PageSetup.Orientation=xlPortrait'设置为纵向打印Application.WindowState=xlMinimized'最小化窗口Application.WindowState=xlNormal'最大化窗口Sub删除工作表()Application.DisplayAlerts=FalseSheet1.DeleteApplication.DisplayAlerts=TrueEndSub有删除就有添加Sub添加工作表()Fori=1To5Worksheets.Add.Name=iNextEndSub[A1:A20].AdvancedFilterxlFilterCopy,[B1],Unique:=True'可去掉重复数据[A2:C32].ReplaceWhat:="F",Replacement:="G"'指定范围内的查找与替换Activesheet.AutoFilterMode=false'取消自动筛选执行以下语句可有效缩小工作簿的大小,执行前请先看清每条语句的作用:ActiveSheet.UsedRange.ClearComments'清除活动工作表已使用范围所有批注ActiveSheet.UsedRange.ClearFormats'清除活动工作表已使用范围所有格式ActiveSheet.UsedRange.Validation.Delete'取消活动工作表已使用范围的数据有效性ActiveSheet.Hyperlinks.Delete'删除活动工作表超链接ActiveSheet.DrawingObjects.Delete'删除活动工作表已使用范围的所有对象ActiveSheet.UsedRange=ActiveSheet.UsedRange.Value'取消活动工作表已使用范围的公式并保留值还有:Subx()DimmyRangeAsStringmyRange=ActiveSheet.UsedRange.Address'去除活动工作表无数据的行列EndSubActiveWorkbook.FullName'当前窗口文件名与路径Application.AltStartupPath="E:\My\MyStart"'替补启动目录路径Application.AutoRecover.Path'返回/设置Excel存储"自动恢复"临时文件的完整路径Application.DefaultFilePath'选项>常规中的默认工作目录Application.Evaluate("=INFO(""directory"")")'默认工作目录Application.LibraryPath'返回库文件夹的路径Application.NetworkTemplatesPath'返回保存模板的网络路径Application.Path'返回应用程序完整路径Application.RecentFiles.Item(1).Path'返回最近使用的某个文件路径,Item(1)=第一个文件Application.StartupPath'Excel启动文件夹的路径Application.TemplatesPath'返回模板所存储的本地路径Application.UserLibraryPath'返回用户计算机上COM加载宏的安装路径Debug.PrintApplication.PathSeparator'路径分隔符"\"CurDir'默认工作目录Excel.Parent.DefaultFilePath'默认工作目录ThisWorkbook.Path'返回当前工作薄的路径dimmm(2,10)Range("a1:b10")=mm'可以将二维数组赋值给RangeApplication.Dialogs(XLdialogsaveas).show显示保存对话框[SIZE=1]Subx()DimmyRangeAsStringmyRange=ActiveSheet.UsedRange.Address'去除活动工作表无数据的行列EndSub这相当于把新的已使用区域赋值给变量,效果等同于手工删除多余的列或行后立即保存;来一个函数的PrivateSubWorksheet_SelectionChange(ByValTargetAsRange)'右边单元格反向显示活动单元格文本IfActiveCell.Column<256ThenActiveCell.Offset(0,1)=StrReverse(ActiveCell)EndSub想不到UsedRange还可以这样用,又学到了!有了这个就可以轻松取得当前Sheet的最末行和最末列号了:Subtest()DimmyRangeAsStringmyRange=ActiveSheet.UsedRange.AddressDebug.Print"LastRow="&Cells.SpecialCells(xlCellTypeLastCell).RowDebug.Print"LastColumn="&Cells.SpecialCells(xlCellTypeLastCell).ColumnmyRange=""EndSub跟一帖:如上下相邻单元格数据相同则删除一个SubYjue()DimmyCellAsRange,NCellAsRange'定义SetmyCell=ActiveSheet.Range("b2")'把对象ActiveSheet.Range("b2")赋给变量myCellDoWhileNotIsEmpty(myCell)'条件为True时执行SetNCell=myCell.Offset(1,0)'把对象myCell的下一个单元格赋给变量NCellIfNCell.Value=myCell.ValueThen'如上下相邻单元格数据相同,则望下执行myCell.Delete'删除myCellEndIf'结束条件语句SetmyCell=NCell'把变量NCell赋给变量myCell,等于在循环中把原myCell下移了一格LoopEndSub复制行高列宽与内容:SubYjue()'过程的名称Sheet2.Rows("2:23").Copy'复制行区域Sheet3.Select'选择粘贴区域Range("A2").PasteSpecialPaste:=xlPasteColumnWidths'粘贴类型ActiveSheet.Paste'实施粘贴Application.CutCopyMode=False'取消复制模式EndSub如整行为空白则删除整行:SubDelRow()DimiAsInteger,LastRowAsIntegerLastRow=ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row'把最后行的行号赋给变量Fori=LastRowTo1Step-1'倒循环IfRange("iv"&i).End(xlToLeft).Column=1AndRange("a"&i)=""ThenRange("a"&i).EntireRow.Delete'如整行为空白则删除整行EndIfNextiEndSubT=Application.GetOpenFilename("TextFiles(*.dat),*.dat")选择文件保存路径通过依次赋色给单元格的例子,展示简单的OnErrorGoToLine1用法:SubYjue()'过程名DimiAsInteger'定义i为整型OnErrorGoToLine1'遇到错误跳转到Line1Fori=0To65'予设从0循环到65Cells(i+1,2).Interior.ColorIndex=i'依次赋色给第2列的单元格Cells(i+1,1)=i'依次给第1列的单元格标上色索引号NextiExitSub'退出过程Line1:'遇到错误跳转到这行继续执行MsgBox"默认颜色只有"&i-1&"种。"'提示对话框EndSub'结束过程通过显示或取消网格线,展示运算符“Not”应用的简单示例:DimmyLineAsBoolean'定义变量myLine为布尔型WithCommandButton1'With语句结构If.Caption="取消网格线"Then'如按钮上显示为"取消网格线".Caption="显示网格线"'改按钮上的字幕为"显示网格线"myLine=ActiveWindow.DisplayGridlines'把活动窗口当前网格线的显示状态赋给变量ActiveWindow.DisplayGridlines=NotmyLine'进行逻辑否定运算Else.Caption="取消网格线"'否则按钮上显示为"取消网格线"ActiveWindow.DisplayGridlines=NotmyLine'进行逻辑否定运算EndIfEndWith'结束With语句结构ActiveCell.Offset(,-1).Name="hzw"'定义名称ActiveCell.Precedents.Address'被当前单元格所引用的区域地址ActiveCell.Resize(0,2).Select'选定当前单元格并向右延伸二格Activesheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count-1'显示自动筛选后的行数有选择地删除指定区域内的单元格点击按钮可选择性的删除[A1:A20]区域内含有[D1]中字样的单元格;再点击按钮可返回原样;如果替换了[D1]中的字样,点击按钮后所删除[A1:A20]区域中的单元格亦会随着变化。WithCommandButton1If.Caption="删除单元格"Then'如按钮显示的字符为:"删除单元格",.Caption="反悔删除"'则改为:"反悔删除"Fori=20To1Step-1'倒循环IfCells(i,1)Like"*"&Range("d1")&"*"ThenCells(i,1).DeleteShift:=xlUp'如循环中发现某个单元格含有[D1]中字符,则删除该单元格EndIfNextiElse.Caption="删除单元格"'否则让按钮显示的字符为:"删除单元格"Range("a1:a20")=Range("f1:f20").Value'把[F1:F20]赋给[A1:A20],为了可反复测试EndIfEndWith下面换个话题,举一个限制鼠标只能在[B2:G60]以外的区域活动的例子:WithActiveSheet'With语句,在一个单一对象上执行一系列的语句.Unprotect'解除没设密码的工作表保护.Cells.Locked=False'解除活动工作表中所有单元格的“锁定”.Range("b2:g60").Locked=True'只锁定[B2:G60]区域.EnableSelection=xlUnlockedCells'仅允许选定未被有效锁定的单元格.Protect'工作表保护(没设密码)EndWith'With语句结束一个复制数据后,只能粘贴数值的例子PrivateSubWorksheet_SelectionChange(ByValTAsRange)'工作表SelectionChange事件OnErrorResumeNext'忽略代码运行中的错误,并越过错误继续执行后面的语句IfT.Column=1Then'如活动单元格为第一列时执行下面的语句Selection.PasteSpecialPaste:=xlPasteValues'粘贴数值Application.CutCopyMode=False'立即清空剪贴板EndIf'IF结构结束EndSub'本过程结束如何用VBA获得工作簿名称?ForEachwbkInWorkbooksMsgBoxwbk.NameNextWorkbooks.Close'关闭所有工作簿Application.Quit'关闭所有工作簿工作簿调用的问题本人做了一个程序,里面自定义了工具菜单:如果程序打开后,调用了一个新的工作簿,当再次调用第二个新的工作簿时如何用vba编写一段代码,先保存退出调用的第一个工作簿,然后再打开第二个新的工作簿DimWbAsWorkbookSubtest()SetWb=Workbooks.Open("book2.xls")EndSubSubtest2()Wb.Closesavechanges:=TrueSetWb=Workbooks.Open("book5.xls")EndSub下面代码为何不能进行两工作簿中的工作之间的复制?(复制代码出现不支持此属性或方法的错误)Mybo=ActiveWorkbook.NameShe=Sheets(1).NameRange("A1:B1").SelectSelection.AutoFilterRange("B2").SelectSelection.AutoFilterField:=1,Criteria1:=">100",Operator:=xlAnd,_Criteria2:="<200"Windows(Mybo).Worksheets(She).Range("A1:K5000").Copy_Destination:=Windows(mybook).Worksheets("acfmis").Range("A1")宝剑赠英雄激活工作簿SubMakeActive()
Workbooks("MyBook.xls").Activate
EndSub
创建新工作簿
SubAddOne()
Workbooks.Add
EndSub
SubAddNew()
SetnewBook=Workbooks.Add
WithnewBook
.Title="1995Sales"
.Subject="Sales"
.SaveAsfilename:="95Sales.xls"
EndWith
EndSub
打开工作簿
SubOpenUp()
Workbooks.Open("C:\MyFolder\MyBook.xls")
EndSub
用编号引用工作表
SubFirstOne()
Worksheets(1).Activate
EndSub
SubFourthOne()
Sheets(4).Activate
EndSub
用名称引用工作表
Worksheets("Sheet1").Activate
Charts("Chart1").Activate
DialogSheets("Dialog1").Activate
可用Sheets属性返回工作表、图表、模块表或对话框编辑表;Sheets集合包含了所有这些表。
下例激活活动工作簿内的图表“Chart1”。
SubActivateChart()
Sheets("Chart1").Activate
EndSub
用快捷记号引用单元格
SubClearRange()
Worksheets("Sheet1").[A1:B5].ClearContents
EndSub
SubSetValue()
[MyRange].Value=30
EndSub
按相对于其他单元格的方式来引用单元格SubUnderline()
ActiveCell.Offset(1,3).Font.Underline=xlDouble
EndSub
用Range对象引用单元格
SubRandom()
DimmyRangeAsRange
SetmyRange=Worksheets("Sheet1").Range("A1:D5")
myRange.Formula="=RAND()"
myRange.Font.Bold=True
EndSub
引用工作表上的所有单元格
SubClearSheet()
Worksheets("Sheet1").Cells.ClearContents
EndSub
引用若干单元格区域
SubClearRanges()
Worksheets("Sheet1").Range("C5:D9,G9:H16,B14:D18")._
ClearContents
EndSub
SubClearNamed()
Range("MyRange,YourRange,HisRange").ClearContents
EndSub
SubMultipleRange()
Dimr1,r2,myMultipleRangeAsRange
Setr1=Sheets("Sheet1").Range("A1:B2")
Setr2=Sheets("Sheet1").Range("C3:D4")
SetmyMultipleRange=Union(r1,r2)
myMultipleRange.Font.Bold=True
EndSub
SubFindMultiple()
IfSelection.Areas.Count>1Then
MsgBox"Cannotdothistoamultipleselection."
EndIf
EndSub
在单元格区域中循环
SubRoundToZero1()
Forcounter=1To20
SetcurCell=Worksheets("Sheet1").Cells(counter,3)
IfAbs(curCell.Value)<0.01ThencurCell.Value=0
Nextcounter
EndSub
SubRoundToZero2()
ForEachcInWorksheets("Sheet1").Range("A1:D10").Cells
IfAbs(c.Value)<0.01Thenc.Value=0
Next
EndSub
如果不知道要循环的单元格区域的确切边界,可用CurrentRegion属性返回活动单元格周围的区域。
例如,下述过程在工作表上运行时,将在活动单元格周围的区域内循环,将所有绝对值小于0.01的数字都设置为0(零)。
SubRoundToZero3()
ForEachcInActiveCell.CurrentRegion.Cells
IfAbs(c.Value)<0.01Thenc.Value=0
Next
EndSub
用A1样式的记号引用单元格和单元格区域
SubFormatRange()
Workbooks("Book1").Sheets("Sheet1").Range("A1:D5")_
.Font.Bold=True
EndSub下表演示了用于Range方法的一些A1-样式的引用。
引用含义
Range("A1")单元格“A1”
Range("A1:B5")从单元格“A1”到单元格“B5”的区域
Range("C5:D9,G9:H16")多块的选定区域
Range("A:A")“A”列
Range("1:1")第一行
Range("A:C")从“A”列到“C”列的区域
Range("1:5")从第一行到第五行的区域
Range("1:1,3:3,8:8")第1、3和8行
Range("A:A,C:C,F:F")“A”列、“C”列和“F”列
用编号引用单元格
SubEnterValue()
Worksheets("Sheet1").Cells(6,1).Value=10
EndSub
SubCycleThrough()
DimcounterAsInteger
Forcounter=1To20
Worksheets("Sheet1").Cells(counter,3).Value=counter
Nextcounter
EndSub
引用行或列
SubRowBold()
Worksheets("Sheet1").Rows(1).Font.Bold=True
EndSub
Rows(1)第一行
Rows工作表上所有的行
Columns(1)第一列
Columns("A")第一列
Columns工作表上所有的列
SubSeveralRows()
Worksheets("Sheet1").Activate
DimmyUnionAsRange
SetmyUnion=Union(Rows(1),Rows(3),Rows(5))
myUnion.Font.Bold=True
EndSub
Subcreate_word()
'CreateaWordDocumentbyVBA
SetappWD=CreateObject("Word.Application")
appWD.Visible=True
appWD.documents.Add
appWD.Selection.TypeTextText:="aaa"
appWD.Selection.TypeParagraph
appWD.Quit
EndSub为便于大家更好地交流,特编辑以下VBA编程基础要求供参:例一:如何布满屏用API函数取得当前屏幕分辨率。
更改窗体的Height、Width属性。
OptionExplicit
PrivateDeclareFunctionGetSystemMetricsLib"user32"(ByValnIndexAsLong)AsLong'ConstantsforGetSystemMetrics
ConstSM_CXSCREEN=0'Widthofscreen
ConstSM_CYSCREEN=1'Heightofscreen
SubGet_System_Metrics()
DimXValAsLong,YValAsLong
YVal=GetSystemMetrics(SM_CYSCREEN)
XVal=GetSystemMetrics(SM_CXSCREEN)
MsgBox"您的屏幕分辨率为:"&XVal&"X"&YVal
EndSub例二:如何调用DOS
shell不能调用DOS内部命令,需用COMMAND加载。
范例应为:
shell"/cdir/bc:\帐目\*.xls>List.xls"
此后生成的“List.xls”(实际上是个文本文件)仅1、2K大小,用Excel打开,可以看到此文件只有一个名为List的工作表,A列中是“帐目”文件夹中所有Excel文件的列表。
DOS命令相当丰富,在Windows'95问世之前,它肩负着“搞定一切”的重任。
对于不熟悉VBA的人;或者对于为了实行某一功能专门编写VBA代码很花时,很费劲的场合,如果在VBA中用Shell能够调用DOS命令来解决,也不失为是一个“合理偷懒”的方法。VBA编程基础要求
1.编写实代码
2.命名变量和常量
3.命名对象和控件
4.命名函数和子例程
5.组织代码及对代码进行格式编排
6.注释代码
7.设计可重复利用的代码
前言:使用命名规则
正式的命名规则有很多种,每一种都有各自的支持者和反对者。您可以采用现有的某种规则,也可以自己制定一套命名规则。重要的是,您所采用的规则应该便于其他Office开发人员理解,而且使用要一致。
对有用的命名规则的最低要求是,它应该能够标识并区别变量类型(对象变量、控件变量和数据类型)、变量作用范围、常量以及过程,并且它应当便于理解和使用。
1编写实代码
“编写实代码”是指编写可实现预定功能、可重复利用、便于理解和维护的Microsoft®VisualBasic®forApplications(VBA)代码或脚本。很多开发人员将所有的时间和精力放在仅仅使代码能够工作上。如果您曾经努力理解自己或别人编写的代码,或者为其他应用程序重新编写相同的过程,那么您一定能够理解编写实代码可减轻许多工作。
Microsoft®Office应用程序是否高效,最重要的考虑因素之一就是它设计得好不好。如果应用程序有用户界面,那么,在每次创建对话框或添加自定义工具栏时,都应当考虑界面的一致性和易用性。而且还必须了解所编代码的设计和结构。从如何命名变量到何时使用类模块,您在设计代码时所采用的方式方法将会对代码的可维护性和可用性产生重大影响。
2命名变量和常量
通常,各种命名规则都用小写的前缀或后缀来指定变量的类型和作用范围。变量本身应当用有意义的名称来说明它是什么或要做什么。多字变量名由几个字连接在一起,每个字的第一个字母大写,并且不使用下划线。如果您用过变量名模板,其格式应当如prefixNoun或prefixNounVerb。
常量名也应当有一定的意义,格式为NOUN或NOUN_VERB。常量名均为大写,字之间用下划线分隔。尽管给常量名添加字符以指定数据类型和作用范围的做法不存在技术性错误,但通常不这么做。常量与变量都是数据的符号表示,在此意义上,二者完全相同。区别在于变量可以变化,而常量则保持不变。
变量名和常量名最多可以包含255个字符,但是,超过25到30个字符的名称比较笨拙。此外,要想取一个有实际意义的名称,清楚地表达变量或常量的用途,25或30个字符应当足够了。
2.1变量名
变量名使用大小写混合的格式(Noun或NounVerb),以此指定变量是什么以及它要做什么。大小写混合格式被用作变量名的说明部分,在这里每个字的第一个字母大写而其余字母小写。
变量名还有两个或三个字符的前缀,用来指定变量的数据类型。例如,以下语句声明的变量都用前缀指定变量的数据类型:
DimstrRecipientNameAsString
DimintItemsProcessedAsInteger
DimblnContinueProcessingAsBoolean
两个字符的前缀通常用来指定Office应用程序对象类型。例如:
DimxlAppAsExcel.Application
DimolNameSpaceAsOutlook.NameSpace
DimwdNewDocAsWord.Document
在声明一般变量或对象变量时,要使用"obj"前缀。即使要创建代表Microsoft®Office应用程序的晚期绑定对象变量,也应当使用该前缀。例如:
DimobjXLAppAsObject
DimobjWDDocumentAsObject
DimobjOLMailItemAsObject
全局变量和模块级变量还要再加一个字符前缀来表示它们的作用范围。变量的作用范围定义了变量的生存期和可见性。全局变量和模块级变量都有永久的生存期。就是说,只要应用程序不关闭,变量就一直占用分配给它的内存。过程内声明的变量只在声明它们的过程中有效,其生存期为过程代码的执行时间。但是,用关键字Static来声明变量的情况例外。
全局变量有小写的"g"作前缀,并在模块的“声明”部分用Public语句声明。它对应用程序中所有模块内的所有过程可见。例如,PublicgstrPathToDataSourceAsString是一个全局变量,它包含了一个字符串,而该字符串是应用程序中所使用的数据源的路径。
应当尽可能始终使用最小的作用范围来定义变量。只有在找不到其他途径来共享变量所包含的数据时,才应当使用全局变量。全局变量会使代码难以理解和维护。如果您使用的全局变量过多,且未经过仔细挑选,则可能需要重新设计代码,以便减少全局变量。
模块级变量有小写的"m"前缀,是在模块的“声明”部分用Dim或Private语句声明的。它们对声明时所处模块中的所有过程可见。例如,DimmrstCustomerRecordsAsADODB.Recordset是用于客户记录的模块级对象变量。在类模块中,用Private语句声明的模块级变量具有前缀"p_"。类模块中公共的模块级变量作为类属性出现,不应当有任何前缀表示它们的数据类型或作用范围。
过程级变量是在过程内用Dim语句创建的。例如,DimintCurrentMailItemAsInteger是一个用作循环计数器的过程级变量。此外,过程级变量可以用Static关键字声明。即使声明静态变量的过程已经结束运行,静态变量仍然会保留它们的值。静态的过程级变量具有小写的"s"前缀。例如,StaticscurTotalSalesAsCurrency将创建一个过程级静态变量,用于在一个计算当前销售额的过程中保存累加和。
用户定义类型变量在模块的“声明”部分中声明,声明时名称全部大写并且后跟"_TYPE"。可以按如下方式声明用户定义类型:
TypeEMPLOYEEINFO_TYPE
strFullNameAsString
lngEmployeeIDAsLong
datStartDateAsDate
strDepartmentCodeAsString*4
curSalaryAsCurrency
EndType
应当使用"udt"前缀来声明EMPLOYEEINFO_TYPE类型的模块级变量。例如,DimmudtEmployeeRecordAsEMPLOYEEINFO_TYPE。
数组变量有小写"a"作前缀,而且,如果不是Variant型,则后跟一对圆括号。数组是可以包含多个值的变量。数组变量要使用Dim语句声明,例如,DimalngNum()是长整型的数组变量。当需要存储多个相同类型的值,而又不希望为它们分别创建单个变量的时候,数组会非常有用。
下面是一些使用前述常规命名规范的变量名称示例:
变量数据类型作用范围
strCompanyName字符串过程
rstCurrentOrders对象过程
intCurrentRecordCount整型过程
wdWordApplication对象过程
varClipboardDataVariant过程
curAmountPastDue货币型过程
blnProcessNextRecord布尔型过程
molOutlookMailItem对象模块
mcolCurrentUsers对象模块
gcnnDBConnection对象全局
gstrLogonID字符串全局
gastrContactNames()字符串(数组)全局
molOutlookMailItem对象模块
mcolCurrentUsers对象模块
gcnnDBConnection对象全局
gstrLogonID字符串全局
gastrContactNames()字符串(数组)全局
2.2常量名
常量使用由全部大写的多个字组成的说明型名称,每个字之间用下划线分隔。声明常量时,要使用Const语句以及常量名、它的数据类型和它的值。例如,如下常量可以在模块的“声明”部分声明,以提供应用程序所使用的数据源的路径:
PublicConstDATABASE_PATHAsString="C:\Solutions\Source\AppData.mdb"
注意如果使用Public关键字来声明常量,那么应用程序中任何模块的任何过程都可以使用该常量。如果不使用Public关键字,那么常量只有模块级的作用范围,这意味着它只能被声明它的模块所包含的过程使用。如果常量是在过程内声明的,那么它只能用于该过程内的代码,并且生存期仅为过程内代码的执行期间。
下面是一些使用前述常规命名规范的常量名称示例:
ACCESS_CONNECTSTRING
API_MAX_STRINGBUFFER
SQL_STRING
注意如果在类模块中创建公共枚举常量,可以使用不同的命名规则来将它们与其他常量区分开来。
除了您自己声明的常量外,Microsoft®VisualBasic®forApplications(VBA)以及每个Microsoft®Office应用程序都包含了有预定义值的内置常量(即内部常量)。应当始终使用内部常量,而不用它们代表的值。同用户定义的常量一样,使用内部常量的好处是它们可以使您的代码更容易被理解。例如,比较下面两组代码示例,一组使用内部常量,另一组则没有使用内部常量。请判断内部常量是否可以使代码更容易理解。
IfMsgBox("ProceedNow?",48+512+3+16384,"Continue?")=7Then
DoCmd.OpenForm"Customers",0,,,1,3
EndIf
IfMsgBox("ProceedNow?",vbExclamation+vbDefaultButton3+_
vbYesNoCancel+vbMsgBoxHelpButton,"Continue?")=vbNoThen
DoCmd.OpenForm"Customers",acNormal,,,acFormEdit,acDialog
EndIf
要查看VBA和每个Office应用程序的内部常量的完整列表,请打开“对象浏览器”,然后从“项目/库”对话框中选择合适的类型库,再在“搜索”文本框中键入相应的常量前缀,然后在“对象浏览器”工具栏上单击“搜索”。下表是从内部常量的完整列表中提取的部分示例。
应用程序/类型库常量前缀
AccessAc
ExcelXl
FrontPageFp
OfficeMso
OfficeBinderBind
OutlookOl
PowerPointPp
WordWd
VBAVbVBA提速大法●判断空字符串判断空字符串的常用方法是使用下面的语句:Ifmy_string=""Then...,但是请采用另外一种方法,就是判断字符串的长度是否为0,这要比前者运行快,代码是:IfLen(my_string)=0Then...。
●使用With命令引用多次使用的对象
这要比在每条语句中都完整地引用对象名称执行速度快许多!
●少有字符串操作函数
尽可能少地使用字符串操作函数,它们运行很慢。●定制SelectCase语句
SelectCase是处理多重条件判断的语句,请将经常要用到的选择排列在前面的选项,以增加该选项提前被选择命中的机会。
●尽可能的使用byref参数调用函数和子程序●将从不需要的表单设置为nothing如果有许多要标明的表单,采用这个策略,将节省内存并减少运行时间。如果只有少数几个表单,请将它们全部装载进内存并隐藏之,这样将在随后的使用中速度更快。
●预想一下程序的速度
对程序的运行速度进行想象是非常重要的,设想一下点击按钮后,等待10秒钟。这将是一个非常长的时间!请添加一个进程条显示程序的进展情况,用户就不会感到等待。●使用mid$函数而不是mid如果需要执行许多字符串/文件操作,请使用mid$(以及trim$等等)函数而不是mid。因为后者将数据类型看作是variant而不是string,速度将慢3倍。
●尽快显示启动表单
尽快地显示启动表单可以使程序看起来很快。在表单的Load事件中使用Show命令,从而在执行长时间的启动计算工作前就能显示出程序界面。●尽可能地在Form_Load事件中放置少量的代码
●使用splash技术过渡中间操作如果初始化的表单要运行很长时间,请先立即显示一个splash画面,然后在初始表单完全装载后,再去除它。关于如果创建不同种类splash画面的资料,请查阅AdvancedVisualBasicTechniques。●在模块中将子程序分组当一个程序调用另外一个程序时,另外的程序所在的模块将被装载。如果一个程序需要调用多个不同模块中的程序,那么所有的这些模块都要被装载。因此,将所有相关的程序放置在一个模块中,就可以实现一次装载。●不要浪费内存有时,利用更多的内存可以使程序变快,但是有时却不然。在实际中,如果给程序分配了它不能适应的过多内存,就会严重地影响程序速度。
●设置AutoRedraw为False为了节省内存的使用,请将AutoRedraw设置为False。如果设置为True,对于复杂的绘图操作时,刷新屏幕的速度将很快。●设置ClipControls为False
●使用M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 私人地下室租赁合同
- 机械设备租赁的合同范本
- 室内装修设计合同
- 全新开发商与购房者之间的买卖合同条款
- 合资建设项目合同协议书范本
- 家政保姆服务合同详细条款解析
- 跨国公司外籍员工聘用合同
- 云计算服务供应商与客户数据安全保密合同
- 租赁业务合同范本
- 人力资源战略合作合同书
- 《辅助工法》课件
- 剪映:手机短视频制作-配套课件
- 国家二级公立医院绩效考核医疗质量相关指标解读
- 英语课堂教学技能训练(英语师范专业)全套教学课件
- 玻璃雨棚维修施工方案
- 安全生产费用提取及使用计划
- 建筑工程施工安全管理网络图
- 电子商务法律法规高职PPT完整全套教学课件
- HydroPro操作手册说明书
- 7S目视化管理标准
- 附件4:项目成本管控要素集成库20200713
评论
0/150
提交评论