VBA之宏基本篇
VBA 之宏基本础篇
前面几贴的自定义基本均是 Excel的功能,只是可能大家没有仔细总结,后面的自定义就基
本是用 VBA来完成的。我曾经说过,于 excel的应用中,我仍中最喜欢 VBA和学习研究 VBA,
ZSH_000也有壹贴 VBA的入门贴,那我也来讲讲我心中对 VBA的认识。
什么是宏?宏是 VBA语言编出的壹段程序,是壹系列命令和函数,存储于 VisualBasic模块
中,且且于需要执行该项任务时可随时运行。
什么是 VBA?VBA是 VisualBasicforApplications的简称,VisualBasic(VB)于 office的
应用版。VBA是和 VB类似或者对大家说能够说是壹样的语言,而 VB是以易用易学著称!我
以前曾经考过二级的 C,后来本来想学 C++却因自己壹个人学习,倍感困难而放弃。但从壹
个偶然的机会发现 Office里的 VBA起而开始学习 VB,但后来大部份均是于 VBA里学习,而
没有进壹步再去,但学习 VB的途径会比较多,大家也可能从学习 VB开始。
宏有什么用?如果经常于 MicrosoftExcel中重复某项任务,那么能够用宏自动执行该任务。
这是宏于 Excel帮助中的用途,而宏的用处不仅仅于于此。就象有人说,VB能干什么?而有
人回答,什么均能够!但个人认为,不壹定什么东西非要用 VBA,Excel中本身自带的很多
功能均能解决很多的问题!但这些功能也均能通过代码的方式来表达!
怎么开始学习 VBA?这是不少吧友常问的问题之壹。个人认为学习什么东西,最好的开始是
兴趣,本贴的创建的原因也于于此。后面的内容可能大家于工作和生活中均没有什么实际的
用处,但我希望后面的内容能引起大家对 VBA编程的兴趣。而开始学习 VBA我认为第壹步从
录制宏开始。
何为录制宏?录制宏是 excel的壹个功能,它能将用户的操作转化为代码,这样即使你壹点
均不懂得编程,也能够通过录制宏来生成壹段宏!这个功能于工具菜单/宏中。点击录制新
宏,于选择保存的地方(个人宏工作簿/当前工作簿或新工作簿),接着只要按我们平时的
操作过程操作 Excel,完了之后按停止录制宏结束,这样就能够生成壹段宏程序。
录制宏的功能有何用?除了能生成壹段宏外,我们仍能够将操作的过程序变成宏后,再通过
其代码来了解这过程的关联要用到的属性啦,方法啦等,对于初学者,这是壹个非常好的自
学方法之壹。
从哪能够见到宏代码?宏我们录制好了,那我们从哪里能够见到我们录好的宏的代码呢?点
击工具/宏/VBA编辑器或按 Alt+F11,就能够进入 VBA编辑器,于里面就能够见到我们录制
好的代码。
怎么运行宏?从工具/宏/宏中,通过选择其中的名称,就能够运行我们的宏了,当然我们也
能够于 VBA编辑器中运行宏,先将光标移到宏所于的代码中,再点击运行菜单中的运行子过
程或窗体,或按工具栏中的相应的按钮,或用快捷键 F5,就能够运行子过程了,注意!!!
宏对文件的壹切操作是不可撤消的,于不了解宏的功能之前,最好的方法是先保存文件(更
好就备份壹份啦),然后再运行宏,如果发现宏运行后的结果有误,就能够关闭文件且不保
存,这样再打开文件就能够仍原到运行宏前的状态(注:宏也能够自行保存文件,这时这个
办法就无效了)
VBA之宏操作篇
其实这壹篇和上壹篇是写给完全不了解 VBA的朋友,让他们也可能体会壹下之后的功能,但!
这个贴子的内容,我于上篇已说过,目的是让吧友们对 VBA产生兴趣而不是教大家从零开始!
怎么获得帮助?仍记得第壹贴中我的见意了吗?当下就要用到 VBA的帮助了!于 VBA编辑器
中按 F1即可调出 VBA的帮助,如果大家有兴趣细细地见上壹次(全部哦!),那你壹定会
从中收获不少的。如果更快地获得帮助,找到帮助的内容呢?壹个当然就是于索引和应答向
导里寻找,另壹个就是先选择代码中的词,再按 F1即可。
第壹个宏!上贴已介绍大家如何利用录制宏生成我们的宏代码,而这壹贴,我来介绍如何利
用 VBA编辑器来创建壹个宏!学过编程的朋友均知道有名的 Hello!World!的程序,那我们当
下就来创建这个宏!
新建壹个文件后,保存这 hello,然后进入 VBA编辑器,于工程资源管理器中选择这个 hello
工程(默认于左上侧的窗口,见不到工程资源管理器,能够点击菜单视图/工程资源管理器
或按 Ctrl+R,工具栏中也有对应的按钮),然后点击插入/模块(工具栏中也有相应按钮),
这时工程资源管理器就会多了壹个模块,里面就多了壹个模块 1(也有可能是英文名),双
击这个东东,就能够编辑我们的代码了。
接下来于菜单插入/过程中添过壹个子程序,名称命名为 hello,点击确定后就会自动生成壹
个过程序的头 PublicSubhello()和尾 EndSub,那么我们的代码就能够于这之间加入了!
这个程序我们用三行代码做三件事!于 A1格中写入 Hello!World!,于立即窗口(默认于右
下方,没有见到立即窗口,也于视图中点击立即窗口让它显示)中写入 Hello!World!,用壹
个消息框弹出 Hello!World!,三行代码为:
Range("A1").Value="Hello!World!"
"Hello!World!"
MsgBox"Hello!World!"
运行宏后就各到我们上面要做的事情了!
最后再说几个 VBA有关的概念:
什么叫个人宏工作簿?个人宏工作簿名称为 ,如果存于,是随 EXCEL启动而打
开的,能够从窗口/取消隐藏见到它的真面目,第壹次能够录制壹个宏且保存于个人宏工作
簿来生成它。
怎样才能将网页代码移到你的文件中?复制,粘贴到你的代码窗口即可,有些朋友可能没有
包含过程的头和尾,自行加入即可。
怎样才能将壹个文件的代码移到另壹个文件?除了上面说的方法,仍能够导出整个模块(右
击该模块)再导入(右击需要导入的工程)即可。VBA之自定义函数
这壹贴说的是自定义函数。Excel本身已自带了很多函数,供我们使用,但有些问题用原有
的函数解决起来很复杂,甚至是无能为力,但有了 VBA,可能就能够现实。
怎样自定义壹个函数?下面我们建壹个名为 RangeCount和函数,用来统计给定单元格数量。
上贴说过怎么插入壹个宏(子程序),其实细心的朋友就会发现,里面有壹项函数的选项,
就是用这个添加了!键入你需要的名称 RangeCount,即会自动生成壹个函数的头
PublicFunctionRangeCount()和尾 EndFunction!这时大家能够知道,子程序均是以 Sub关键
字开头,而函数是以 Function关键字开头。
怎样给自定义函数传递参数?用过 Sum函数的朋友均知道 Sum的用法,于单元格中键入
=Sum(A1:A10)就能对 A1:A10进行求和,那么怎么让我们的自定义函数也有此功能呢,其实
很简单,只要于 FunctionRangeCount()中的(和)之间加入即可,象当下我们要给这个自定
义函数传递壹个单元格的参数,即于()间加入 XRanAsRange即可。其中 XRan就是我们给
这个参数设定的名称,As是关键字,而 Range就是给定参当数的类型(单元格类型),更详
细的说明能够参见 VBA的帮助(上贴有说明怎么用帮助了吧:))。
怎 么 样 自 定 义 函 数 加 入 功 能 ? 其 实 也 和 子 程 序 壹 样 , 于 函 数 的 头
PublicFunctionRangeCount()和尾 EndFunction之间就能够加入代码,我们这个函数的代码
只有壹句:RangeCount=
怎么样让自定义函数返回值?从上面的例子见出,只要将函数的名称设定为需要返回的值即
可。
怎么当前工作表中使用自定久函数?使用自定义函数的方法其实和壹般函数的方法是壹样
的,于单元格中键入=RangeCount(A1:A10),即能够得到值(10)!当然,也能够通过菜单
插入/函数,于类别中选择用户自定义里找到你自定义的函数。
怎么于工作表里使用别的工作表里的自定义函数?从菜单插入/函数,类别中的用户自定义
里,能够见到,如果这个自定义函数不是于当前的工作表里的,函数会变成——文件名.xls!
函数名了,这样我们使用上面的自定义函数就变成=!RangeCount(A1:A10)(设我
们刚才保存文件为 Book1)。
怎么样于任何工作表中使用自定义函数?自定义了函数后,每壹次使用均要打开这个工作簿,
不方便,那么怎么样让任何工作簿均能使用这个自定义函数呢?有俩个方法,第壹个就是把
代码写于上面说到的个人宏工作簿中,因为个人宏工作簿均是随 Excel自动打开的,那么我
们就能够通过 !函数名来使用这个自定义函数。第二个方法就是加载宏(关于
加载宏的其它用法和具体说明以后仍会有专门的壹贴),将包含这个自定义函数的工作簿,
去掉无关的内容(不去当然也行啦!)后另存为加载宏(不会不知道怎么另存吧,汗!后注!),
这样于菜单工具/加载宏里,将关联项前打勾,即可使用该自定义函数,这时使用函数的方
法只要直接用函数名即可,如=RangeCount(A1:A10)。
最后再说壹点大家少遇到的现象:用过 VBA后,大家知道于同壹模块中是不能有相同名称的
子程序和函数的,如果有,运行时会提示存于二义性!但于不同模块中,却能有相同甸称的
函数存于,那么怎么使用这样的函数呢?从菜单插入/函数,类别中的用户自定义里,我们
能够见出这样的函数变成模块名 .函数名了,这样我们的使用方法就是 =模块
(A1:A10)或=模块 (A1:A10)。
后注:详细的另存为加载宏的过程,点击菜单/文件/另存为,于文件类型里选择
MicrosoftExcel加载宏项,这时文件夹自动转到保存加载宏的 AddIns,再保存即可。
附:上面 RangeCount的完整代码:
FunctionRangeCount(XRanAsRange)
RangeCount=
EndFunction
下面给出俩个自定义函数,按给颜色求和 SumColor和计数 CountColor
FunctionSumColor(rColorAsRange,rSumRangeAsRange)
DimrCellAsRange
DimiColAsInteger
DimvResult
iCol=
ForEachrCellInrSumRange
=iColThen
vResult=(rCell)+vResult
EndIf
NextrCell
SumColor=vResult
EndFunction
FunctionCountColor(rColorAsRange,rSumRangeAsRange)
DimrCellAsRange
DimiColAsInteger
DimvResult
iCol=
ForEachrCellInrSumRange
=iColThen
vResult=vResult+1
EndIf
NextrCell
CountColor=vResult
EndFunction
自定义模板
今天突然发现仍有壹个不是 VBA的自定义项没有说——模板。以下几点是 Excel关于模板的
说明。
关于模板:若要创建新工作簿,使其具有您所希望的格式,则可基于模板来新建工作簿。模
板中可包含格式样式、标准的文本(如页眉和行列标志)、公式、VisualBasicforApplications
宏和自定义工具栏等。
默认工作簿模板:您可创建默认工作簿模板。该模板定义了您启动 MicrosoftExcel时打开
的新工作簿的格式和内容。通过单击“新建”或选择“模板”对话框(“通用模板”、“新
建工作簿”任务窗格)中的工作簿模板所创建的工作簿是基于默认工作簿模板的文件。默认
的工作簿模板的文件名为 。您能够为特定的任务和项目创建其他自定义的工作簿模
板。
默认工作表模板:您可创建默认工作表模板。该模板定义了您使用“工作表”命令(“插入”
菜单)插入的默认工作表的格式和内容。默认的工作表模板的文件名为 。如果您
需要于工作簿中使用多种工作表,那么您能够创建其他的自定义工作表模板。
保存默认工作簿和工作表模板:如果您已创建了名为 或 的模板,且保
存于了 XLStart文件夹中,MicrosoftExcel将使用该模板来创建新的默认工作簿或插入的新
工作表。XLStart文件夹通常位于:C:\ProgramFiles\MicrosoftOffice\Office10\XLStart
若要使用保存于网络文件位置上的模板文件(.xlt),您可按替补启动文件夹指定位置。保存
于 XLStart文件夹中的自定义模板或替补启动文件夹会出当下“模板”对话框(“通用模板”,
“新建工作簿”任务窗格)中的“常规”选项卡上。
共享模板:如果正于使用 MicrosoftWindows95或其后续版本,或者是 或其后
续版本,则可将自定义模板保存到网络上,使其他用户也可使用。例如,要让某个工作小组
的所有成员均使用特定项目的同壹个自定义模板,则可将其放于能被所有成员访问的网络文
件夹中。然后创建访问该文件夹或模板的快捷方式,且让所有成员将该快捷方式放入各自的
Templates文件夹中。
而于 VBA中,如何获得当前计算机中模板的路径?能够用 !于
VBA编程的初期,能够利用模板来生成固定格式的工作簿或工作表,这样能够减少代码的数
量。但有利就有弊,这样的宏于别的计算机使用时,就要连同模块壹起,否则就无法正常运
行!但对于初期或自己快速建立宏,利用好之前的已定义好的模板资源,不失为壹个很好的
过渡方法。
自定义 Excel加载宏
什么是加载宏?加载宏程序是壹类程序,它们为 MicrosoftExcel添加可选的命令和功能。
加载宏的分类!Excel有三种类型的加载宏程序:Excel加载宏、自定义的组件对象模型(COM)
加载宏和自动化加载宏。而我们这里说的和以后讲的加载宏均是第壹类加载宏。
"如何安装加载宏?于使用某个加载宏前,必须先将其安装于计算机上,再将其加载到 Excel
中。默认情况下,加载宏(*.xla文件)将安装于以下某个位置上:
MicrosoftOffice/Office文件夹的 Library文件夹或其中的某个子文件夹。
DocumentsandSettings/<username>/ApplicationData/Microsoft/AddIns文件夹。你也能够
将 XLS文件,通过文件/另存为,将其另存为 Xla加载宏文件。"
如何将加载宏装入 Excel?安装完加载宏之后,仍必须将加载宏装入 Excel。于工具/加载宏
中,里面就列出你电脑中的所有安装的加载宏项,将对应项的勾勾选上即可加载加载宏。
如何卸载 Excel中的加载宏?相对应,于工具/加载宏中,里面就列出你电脑中的所有安装
的加载宏项,将对应项的勾勾去除即可。将加载宏卸载只是从 Excel中删除加载宏的功能和
命令,但计算机上依然保留着加载宏程序,因此您仍能够轻松地重新装载该加载宏。
如何于加载宏加载和关闭时运行特定的代码?于 AddinInstall事件和 AddinUnInstall事件
中加入相应的代码即可,当然,这是加载宏加载和关闭时特有的事件,你能够选择于
Workbook_open(打开)和 Workbook_BeforeClose(关闭)中加入相应的加代。
如何于自定义的加载宏中加入说明?细心的朋友会发现,当我们选择每个 Excel自带的加载
宏时,于其下方会有壹段文字说明这个加载宏,其实我们自定义的加载宏里也能够自已加入
壹段说明的,只要于其文件/属性的备注中写入这段说明即可,这样见起来是不是专业壹点
*~_~*,也方便让其它使用加载宏的朋友于加载前多壹点了解它。
加载宏就说到这里了,再加上前面的说明,你是不是能够将以前的自定义函数啦,宏啦用加
载宏分发别其他朋友了:),再下面的几项自定义项,能让你的壹些不懂 VBA的朋友更能易
用你编好的加载宏,敬请关注哦!
自定义菜单项
上贴讲过了加载宏,且见意大家将以前的自定义函数啦,宏啦用加载宏分发别其他朋友。自
定义函数包含于加载宏后的使用方法前面已说过,而宏呢?如果让别人使用加载宏里的宏?
于宏的基础篇中,我们已说过宏怎么运行,但其实最方便的方法就是于我们的工具栏中建立
壹个按钮来调用这个宏。
怎么自定义壹个按钮?首先要确保要更改的工具栏是可见的,再单击“工具栏选项”箭头指
向“添加或删除按钮”或用右击单击工具栏,再单击“自定义”,单击“命令”选项卡,于
类别中选择“宏”,将“自定义按钮”拖拉到你需要的工具栏的位置即可。而有多项的话,
我们仍能够自定义壹个菜单项来包含这壹些按钮。
怎么自定义壹个菜单项?和自定义按钮是差不多的,只是最后壹步的操作是将“自定义菜单
项”拖拉到你需要的工具栏的位置即可。
怎么将按钮和宏关联?刚刚建立好的按钮,于第壹次单击它是,会弹出壹个菜单,让你选择
和其关联联的宏,这时选择要关联的宏的名称即可。但我们能够这样操作,右击工具栏后选
择“自定义”,选择需要关联宏的按钮,然后于“更改所选内容”中的指定宏中指定或修改!
如何更改这个自定义按钮的外观?于刚才说的“更改所选内容”项里,仍能够更改这个按钮
的名称,图标,样式,只要于此做相应的修改即可,要说明的壹点是,于名称中用&后面跟
着英文的话,就变成相对应的键盘按键,修改后我们见到的是这个英文下面加壹条划线来表
示!
如何删除自定义的菜单?仍按照上面的操作,将要删除的菜单拖拉到工具栏外,或选择它,
再点击“更改所选内容”里的删除即可。
上面说了手工怎么样建立的删除自己的菜单,而怎么让加载宏自己建壹个菜单,且于关闭时
将其删除呢?前贴说过,能够于 AddinInstall事件和 AddinUnInstall事件或者
Workbook_open事情和 Workbook_BeforeClose事件中,加入代码,来让加载宏打开和关闭时
运行这些代码,仍有壹个方法就是于模块中定义 auto_open(打开时运行)和 auto_close(关
闭时运行)这俩个过程来实现,下面给出壹个例子:
PrivateDeclareFunctionShellExecuteLib""Alias"ShellExecuteA"(ByValhwn
dAsLong,ByVallpOperationAsString,ByVallpFileAsString,ByVallpParametersAsString,
ByVallpDirectoryAsString,ByValnShowCmdAsLong)AsLong
PrivateDeclareFunctionGetDesktopWindowLib"user32"()AsLong
DimAName,MName(2,1),DelMenu(2)AsBoolean
Subauto_open()
DimMyMenuAsCommandBarPopup
DimMyBtnAsCommandBarButton
DimiAsByte
DimXTAsString
OnErrorResumeNext
AName="自定义(&Z)"'菜单名称
MName(0,0)="百度 Excel吧(&A)"'菜单项名称
MName(0,1)="BaiDuExcelBa"'指定宏名称
MName(1,0)="Excel吧主页(&B)"'菜单项名称
MName(1,1)="ExcelBaZy"'指定宏名称
MName(2,0)="Excel各页名(&C)"'菜单项名称
MName(2,1)="Excel各页名"'指定宏名称
SetMyMenu=CommandBars("WorksheetMenuBar").Controls(AName)
IfMyMenuIsNothingThen
SetMyMenu=CommandBars("WorksheetMenuBar").(Type:=msoControlPopup)
=AName
EndIf
Fori=0ToUBound(MName)
SetMyBtn=(MName(i,0))
IfMyBtnIsNothingThen
DelMenu(i)=True
SetMyBtn=(Type:=msoControlButton)
WithMyBtn
.Style=msoButtonIconAndCaption
.FaceId=79+
.Caption=MName(i,0)
.OnAction=MName(i,1)
EndWith
Else
DelMenu(i)=False
XT=XT&vbCrLf&MName(i,0)
EndIf
SetMyBtn=Nothing
Next
自定义右键菜单
前面说过了自定义菜单和工具栏,如果大家利用好了,就能够很方便地让别人使用你编辑好
的功能了。而这壹贴要讲的,利用右键的菜单,让调用功能更为方便。
当我们使用右键时,Excel相对应均会有壹些功能于右键的菜单中出现,比如右击单元格时
有设定单元格的功能,右击行号和列标时,有设定行高和列宽的功能,那么,我们也能够相
应于我们需要的时候,将功能将入右键的菜单中,方便调用,比如下面说的自定义宏
——合且复制选择单元格的内容,即能够加入到于右击单元格时产生的右键菜单中。
其实这些菜单的使用方法和前面将的菜单和工具栏是类似的,工具栏对应的是 CommandBars
对象,菜单对应的是 CommandBarControl对象,而 CommandBarControl对象中又分有三种
——ComandBarButton(按钮控件 )、 CommandBarComboBox(组合框控件 )以及这贴说的
CommandBarPopup(弹出式控件),下面给出壹段程序,于表格中列出全部的弹出式控件的
名称及项目等内容。
SubListPopups()
DimctlAsCommandBarControl
DimcbAsCommandBar
DimintRowAsInteger'Tracksrowinworksheet
'下面壹行是检查当前工作表是否没有内容
IfNotIsEmptyWorksheet(ActiveSheet)ThenExitSub
OnErrorResumeNext
=False
Cells(1,1).Value="CommandBar"
Cells(1,2).Value="Control"
Cells(1,3).Value="FaceID"
Cells(1,4).Value="ID"
Range("A1:D1").=True
intRow=2
ForEachcbInCommandBars
="正于处理控制..."&
'OnlylistcommandbariftypeisPopup
=msoBarTypePopupThen
Cells(intRow,1).Value=
intRow=intRow+1
'Listcontrolsoncommandbar
Cells(intRow,2).Value=
=0Then
(intRow,3)
Cells(intRow,3).Value=
EndIf
Cells(intRow,4).Value=
intRow=intRow+1
Nextctl
EndIf
Nextcb
Range("A:B").
=False
EndSub
'检查当前工作表是否有内容的函数
FunctionIsEmptyWorksheet(shtAsObject)AsBoolean
IfTypeName(sht)="Worksheet"Then
()=0Then
IsEmptyWorksheet=True
ExitFunction
EndIf
EndIf
MsgBox"请生成壹个空的工作表!",vbCritical,_
"Warning"
EndFunction
从上面的程序能够让我们了解各种情况下的弹出菜单,只要通过名称及其相应的功能,我们
就能够和现实中的操作对比,来获得需要的弹出菜单名称,比如单元格——Cell,行
——Row等。之后我们就能够将自定义的项目加入对应的菜单中了。以下是我现实合且复复
增减菜单项目的代码,其余代码略过:
SubMenu_Del()
DimN
N=("Cell").
ForI=1ToN
'当发现右键菜单中有"合且复制(&A)"项时将其删除
("Cell").Controls(I).Caption="合且复制(&A)"Then
("Cell").Controls(I).Delete
'下面这句是重置菜单,但个人认为仍是用上面的方法比较好
'("cell").Reset
EndIf
Next
EndSub
SubMenu_Add()
DimN,I,CmbAsCommandBarControl
N=("Cell").
ForI=1ToN
("Cell").Controls(I).Caption="合且复制(&A)"Then
ExitSub
EndIf
Next
SetCmb=("cell").(Type:=msoControlButton)
WithCmb
.BeginGroup=True
.Caption="合且复制(&A)"
.OnAction="UnionCopy"
.FaceId=159
EndWith
EndSub
之上俩个程序的实例,请到我个人主页中的自定义宏项里下载——内置菜单和合且复制。
到此贴,自定义的内容已基本完成,而下面的自定义功能只是让大家多感受壹些编程的魅力
——只有想不到,没有做不到,而下面的功能的具体实现方法我也不是能给大家解释得很清
楚,因为大多是基于类模块和 API的应用,我也只能将关联的原代码贴出来,和大家分享!