codecamp

VBA指令、工程命名及过程

在前面的学习中,你学习到了Excel宏录制器创建的一系列指令是和你实际进行的操作完全等同的。这些指令自动地放在工作簿里一个叫做“模块”的表里。Excel将模块储存在模块文件夹里,这个文件夹在当前工作簿,新工作簿或者个人宏工作簿里面。你必须激活VB编辑器窗口,并且双击工程浏览器里的模块文件夹才能查看到这些模块。当模块表在代码窗口里打开了后,你才能最后分析你的过程代码。


所有录制的指令都包括在“过程”里面。过程里面的每一行都是一个“指令”。指令的类型有很多种,例如,关键词,运算符,或者其它过程的调用。“关键词”代表VB中的一个特殊的意义。你已经学习了最常见的VBA关键词——Sub 和EndSub,它们表示一个过程的开始和结束。关键词默认地显示为蓝色。你不要将这些术语做其它的目的,因为关键词已经被VB保护了。


除了关键词,VB指令里还可以有运算符。运算符有四种类型:算术运算,字符串连接,逻辑运算和比较运算。“运算符”允许你将某些值结合起来。例如,除号运算符(/)可以用来计算总数的百分比。本手册中,你有很多机会看到如何在VBA过程中使用运算符。


VB指令的另外一种类型是过程调用。过程调用让你快速地跳到其它过程并且执行其它指令。是不是很难想象?让我们看一下你在第一章中录制的宏WhatsInACell。 假设你也需要包含同一模块中宏FormulasOnOff中的一些语句。怎么做呢?你可以复制需要的代码行,再粘贴过去。然而,有一种更简单快速的方法。你可以调用这个过程,而不需要在两个过程中复制。例如,你想VB在遇到指令MsgBox "所有操作都已完成"之前执行宏FormulasOnOff里面的指令,只要添加下面一句代码就行:


FormulasOnOff


当VB到达这一行,它就会立即跳到FormulasOnOff过程并且执行它的代码。之后,它会回到宏WhatsInACell去执行剩下的代码,遇到关键词End Sub时则停止。

在你尝试这个例子之前,你必须学会如何给VBA过程和模块命名,已经如何调用不同工程里的过程。


VBA工程命名

工程是一套Excel对象,模块,窗体和引用。除了VBAProject这个位于工程浏览器中工作簿名称之前默认名称,每个工程需要一个独特的名称。我们来给VBAProject (Chap01.xls) 和 VBAProject(Personal.xls)命名:


1、启动Excel,打开Chap01.xls,这里储存了宏WhatsInACell代码。你录制了宏FormulasOnOff的个人宏工作簿会自动开启


2、切换到VB编辑器窗口


3、选择VBAProject (Chap01.xls)


4、双击属性窗口里的名称属性,这个操作选中了默认的工程名称VBAProject


5、输入“FirstSteps”作为该VBA工程的名称,回车。注意,工程浏览器现在显示的是名称是

FirstSteps (Chap01.xls)


6、在工程浏览窗口选择VBAProject (Personal.xls)


7、双击属性里的名称属性


8、输入“Personal”作为它的名称,回车


技巧:避免名称冲突
为了避免VBA工程之间的命名冲突,请给你的工程独特的名称。你可以使用下述方法之一来更改工程名称:


1、在工程浏览器窗口,选择工程名称,双击属性窗口里的名称属性,再输入新的名称


2、在工程浏览器窗口,在工程名称上单击右键,并且选择“工程名称属性”。出现如下图显示的
工程属性对话框,在工程名称文本框里面输入新的名称


 工程属性窗口

 工程属性窗口可以用来更改当前被选中的工程名称和描述3模块重命名


当你录制宏或者创建新的过程时,VB会创建一个模块文件夹来储存你的VBA 代码。 第一个文件夹叫“模块1”,第二个叫“模块2”,等等。你打开一个新的工作簿并且创建VBA工程时,新VBA工程里的模块文件夹又会命名为“模块1”,“模块2”,等等。模块拥有相同的名称不但对你,而且对VB造成很大混淆,因为,它要在一个打开许多工程的环境中执行你的宏或工程。

为了避免模块混淆,给FirstSteps(Chap01.xls) 工程和 Personal(Personal.xls)  工程里的“模块1”重新命名:


1. 在工程浏览器窗口,选择FirstSteps (Chap01.xls)工程,并且选择“模块1”


2. 双击属性窗口里的名称属性,这个动作选中了模块的默认名称“模块1”


3. 输入“WorksheetFormatting”作为模块1的名称,并且回车。注意,工程浏览器窗口现在显示的模块名称是“WorksheetFormatting”


4. 在工程浏览器窗口选择Personal (Personal.xls)


5. 双击属性窗口里的名称属性


6. 输入“Switches”作为模块1的名称,回车


模块文件夹


从其它工程调用过程

你只要明确过程名称,就可以调用这个在同一个工程里任何模块里的过程。假设过程FormulasOnOff和宏WhatsInACell在同一个工程里的不同模块(或者同一个模块),在WhatsInACell宏里面调用过程FormulasOnOff,你所要做的所有工作只是明确过程名称,示例如下:


Sub WhatsInACell()
            <这里是你录制的指令>
            FormulasOnOff
End Sub

然而,如果两个或者两个以上的模块含有这个相同的过程名称,你除了要明确过程名称外,还必须包括模块名称。假设工程FirstSteps  (Chap01.xls)有三个模块。模块FormulaFormatting包含宏WhatsInACell,但是,模块Switches和模块Formulas都含有一个叫FormulasOnOff的宏。如何在WhatsInACell调用FormulasOnOff(模块Switches里面的)?请看下面例子:


Sub WhatsInACell()
            <这里是你录制的指令>
            Switches.FormulasOnOff
End Sub

要调用其它工程里的过程,你必须建立对该工程的引用。你可以在“引用”对话框进行这些操作。因为FormulasOnOff在Personal(Personal.xls)工程里,在你能够从WhatsInACell调用它之前,你需要添加对“Personal”的引用。下面是几种建立引用的方法:


1. 在工程浏览器窗口,点击FirstSteps (Chap01.xls)


2. 选择“工具”-“引用”


3. 在引用对话框,选中“Personal”旁边的勾选框,如下图所示。然后点击确定(在截图前,我并没有保存Personal,所以在附图里没有Personal一行,如果你依照手册中一步一步走下来,应该没有问题)


引用对话框

引用对话框列出了所有这个工程可以引用的工程。如果你想要执行其它工程里的过程,你就必须建立对这个工程的引用


既然对“Personal”工程的引用已经建立了,我们就来从WhatsInACell里调用FormulasOnOff吧。


1. 在工程浏览器窗口,选择FirstSteps (Chap01.xls)并且定位到含有WhatsInACell的模块


2. 在MsgBox "所有操作都已完成"之前增加一空白行,并且输入代码:FormulasOnOff


3. 返回到Excel界面,确保当前工作表是这个例子数据


4. 使用任何你在第一章里学到的方法来运行宏WhatsInACell


如果你给两个不同工程里的不同过程以相同的名称,那么你必须明确工程名称才能调用它。


我们假设FirstSteps (Chap01.xls)工程和Personal (Personal.xls) 工程里都有叫FormulasOnOff的宏,要调用Personal  (Personal.xls)工程里的FormulasOnOff(记住,你已经必须先建立对Personal的引用),必须包括工程名称:


Sub WhatsInACell ( )
            <这里是你录制的指令>
            Personal.Switches.FormulasOnOff
End Sub


技巧:VB如何定位被调用的过程
当你调用一个过程,VB先在主调方(WhatsInACell)的同一个模块里查找。如果没有找到被调过程(FormulasOnOff),VB就会在同一个工程的其它模块里查找。如果还是找不到,VB则会检查对其它工程的引用。


技巧:工程名称不在引用对话框
如果你想要调用一个当前关闭的工程里的过程,当你打开引用对话框试图建立引用时,这个过程名称不在清单中。点击“浏览”,并且打开被调用过程所在的文件夹。添加引用的对话框默认地列出数据库文件(*.olb, .tlb, .dll)。从文件类型的下拉清单中选择Excel文件(*.xls, *.xla),选择并打开含有你要调用过程的文件。这个工程的名称将会加在引用对话框的最后一行。


什么是VBA工程浏览窗口、属性窗口、代码窗口
VBA对象、属性和方法
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }