
VBA过程子程序和函数.doc
37页word第四章 VBA过程:子程序和函数在第二章中,你知道了过程是一组指令,它让你在程序运行的时候完成一些具体的任务VBA有以下三种过程:n 子程序过程〔子程序〕执行一些有用的任务但是不返回任何值它们以关键字Sub开头和关键字End Sub完毕子程序可以用宏录制器〔第一章〕录制或者在VB编辑器窗口里直接编写〔见第二章和第三章〕在你第一章里已经学习了多种运行这种过程的方法n 函数过程〔函数〕执行具体任务并返回值它们以关键字Function开头和关键字End Function完毕在本章中,你将创建你的第一个函数过程函数过程可以从子程序里执行,也可以从工作表里访问,就像Excel的内置函数一样n 属性过程用于自定义对象使用属性过程你可以设置和获取对象属性的值,或者设置对另外一个对象的引用你将在第十一章中学习如何创建自定义对象和使用属性过程在本章中,你将学习如何创建和执行自定义函数,另外,你将发现变量〔见第三章〕如何用于传递数据给子程序和函数在本章后面,你将对VBA中两种最有用的函数:MsgBox和InputBox进展比拟彻底的了解关于函数过程使用Excel几百种内置函数,你可以进展非常宽广的自动计算,然而,你总有要做个自定义计算的时候。
使用VBA编程,你可以通过创建函数过程快速的完成这个特殊需求,你可以创建任何Excel没有提供的函数创建函数过程象Excel函数一样,函数过程进展计算并返回数值学习函数的最好方法就是自己创建一个因此,我们开始吧设置完一个新的VBA工程后,你将创建一个函数过程来加和两个数值2. 切换到VB编辑器窗口并且选择VBAProject(Chap04.xls)3. 在属性窗口,将VBAProject改为MyFunctions4. 在工程浏览器窗口选择MyFunctions(Chap04.xls),然后选择“插入〞-“模块〞5. 在属性窗口将“模块1〞改为Sample16. 在工程浏览器窗口,点击Sample1并选择“插入〞-“过程〞〔译者:需要激活右边的代码窗口〕添加过程对话框如图4-1所示图4-1 你使用添加过程对话框时,VB自动创建你选择的过程类型7. 在对话框里输入如下设置:名称:SumItUp类型:函数X围:公共的8. 点击确定退出添加过程对话框VB输入了一个空函数过程如下:Public Function SumItUp()End Function第一句声明函数过程名称,关键字Public外表这个函数可以在所有模块的所有过程里访问。
关键字Public是可选的注意,关键字Function后面是函数名称〔SumItUp〕和一对空括号在括号里你可以列上计算中需要的数据项目每个函数过程都以End Function语句完毕技巧4-1 关于函数名称函数名称应该点明该函数的作用,并且必须和变量的命名规如此一致技巧4-2 设置VBA过程X围在前几章你学习了变量的X围决定它可以在哪些模块和过程里使用,和变量一样,VBA过程也有X围过程的X围决定其它模块里的过程是否可以调用该过程所以的VBA过程默认为公共的,这意味着它可以被任何模块里的其它过程调用因为过程默认为公共的,所以如果你愿意你可以忽略关键字Public但是,如果你将Public关键字换成关键字Private,那么你的过程只能被同一模块里的其它过程调用,而不能被其它模块里的过程调用9. 将函数声明修改为这样:Public Function SumItUp(m,n)End Function这个函数的目的是加和两个数值不要将实际值输给函数给该函数提供两个自变量以确保该函数具有灵活性这样,你的自定义函数就能够将你提供的任何两个数值加和起来了每个变量代表一个数值,你在运行该函数时要给每个变量提供数值。
技巧4-3 使用函数的理由自定义VBA函数可以用于:n 分析数据和进展计算n 修正数据和汇报信息n 基于提供的或计算的数据采取具体行动10. 在Public Function和End Function之间输入下述语句:SumItUp = m + n这条语句意思是将储存于变量n上的数据加在储存于变量m的数值上,并且将结果返回给函数SumItUp在等号后面输入该函数名称,再就是括号和需要加和的数值在上面的语句中,设置函数名称等于m + n的和完成的自定义函数过程如下:Public Function SumItUp(m,n)SumItUp = m + nEnd Function祝贺,你已经创建了你的第一个函数!然而,函数过程并没有什么用,除非你知道如何执行它下一个段落将给你示X如何使你的函数工作执行函数过程在第一章里,你学习了很多中方法来运行子程序和子程序不同,函数过程只能使用两种方法来执行你可以用于工作表的公式里面,或者从另外一个过程里调用它你在VBA里创建的函数过程,不能通过在Excel窗口选择“工具〞-“宏〞-“运行宏〞访问;它们也不能在代码里面通过按F5键来运行接下来的局部里,你将学习到执行函数的专门技术。
从工作表里运行函数过程自定义函数过程和内置函数一样,如果你不知道确切的函数名称或者它的自变量,那么你可以使用“插入函数〞对话框来帮助你在工作表里输入需要的函数1. 切换到Excel窗口,并选择任何一个单元格2. 点击函数工具栏上的“插入函数〔fx〕〞按钮〔译者:或者选择“插入〞-“函数〞〕,Excel弹出插入函数对话框,上面显示了所选类别里所以函数,按字母顺序排列3. 在类别下拉框里选择“全部〞或者“用户定义〞,然后滚动函数名称框,找到并选择本章中创建的函数SumItUp当你选中这个函数名称时,在插入函数对话框的下部显示了该函数的语法:SumItUp(m,n)〔译者:同时可以看到“没有帮助信息〞请参阅创建自定义函数的相关教材,如何给自定义函数提供帮助信息〕技巧4-4 私有函数用户是看不到的使用关键字Private声明的函数不会出现在“插入函数〞对话框上,私有函数不能用于公式里,它们只能从另一个VBA过程里调用技巧4-5 快速访问自定义函数一旦你创建了一个公共的VBA函数,Excel就会将它参加到“插入函数〞对话框的“用户定义〞的类别里通过选择这个类别,你可以快速地访问该自定义函数图4-2 VBA自定义函数出现在Excel内置函数同一清单上4. 点击确定,开始写公式。
函数参数〞对话框出现,如如下图所示对话框显示了函数名称和每个参数:m和n图4-3 公式的调色板功能有助于输入任何工作表函数,不论是内置或VBA编程的自定义函数5. 如图4-3所示输入自变量数值,或者你任意输入数值当你输入数值在参数文本框时,Excel显示你输入的数和当前的函数结果因为两个参数〔m和n〕都是必须的,所以,如果你忽略了其中的某个时,函数会返回错误6. 点击确定退出函数参数对话框,Excel输入函数SumItUp在所选的单元格里,并且显示它的结果要编辑这个公式的话,选择该显示公式结果的单元格,并且点击“插入函数〞按钮,选择函数并点击确定以访问函数参数对话框在函数参数m和n上输入不同的数值,并点击确定也可以直接在该单元格上双击,修改函数参数值技巧4-6 确保你的自定义函数可用只有在你储存该自定义函数的工作簿开启的时候,你的自定义VBA函数才可用,如果你关闭该工作簿,该函数便不再可用要确保你的自定义函数每次在你使用Excel时都能用到,你可以做下述事情之一:n 保存你的函数在个人宏工作簿n 将含有你的自定义函数的工作簿保存在XLStart文件夹里n 创建引用到含有该自定义函数的工作簿〔请参见第二章,如何创建对另一个工程的引用〕从另外一个VBA过程里运行函数过程正如前面提到的,你不能在VB窗口将光标放在代码里并且按F5来运行函数,也不能通过选择“运行〞-“运行宏〞来运行函数过程。
要运行函数,你必须从另外一个过程里调用该函数要执行自定义函数,编写一个VBA子程序并且在需要的时候调用该函数下面的过程调用函数SumItUp并且将计算结果输出在立即窗口:Sub RunSumItUp()Dim m As Single, n As Singlem = 370000Debug.Print SumItUp(m,n)MsgBox "Open the Immediate window to see the result."End Subn 上面的子程序使用Dim语句声明变量m和n,它们用来给函数提供数据n 接下来两行语句给变量赋值n MsgBox函数通知用户在哪里查看结果依照下述步骤来试验上面的例子:1. 在输入函数SumItUp的同一个模块里面输入过程RunSumItUp2. 将光标放在该过程的任意地方,按下F5技巧4-7 函数的快速测试你编写自定义函数后,你可以在立即窗口快速的测试它打开立即窗口,输入一个问号〔?〕在函数名称前,可以显示该函数的计算结果记住,要在括号里输入函数的参数值 例如,输入:? SumItUp(54, 367.24)然后回车你的函数使用参数m和n传递的数值进展计算,函数的结果显示在下一行:传递参数到目前为止,你已经创建了简单的可以执行具体任务的VBA过程,这些过程在它们运行前没有要求你提供额外的数据。
然而,在现实生活中,过程〔子程序和函数〕经常需要参数参数〔自变量〕是过程工作时需要的一个或多个数值参数通常输入在括号之间,多个参数用逗号分割开来使用Excel有一阵了,你已经知道Excel内置函数根据你提供的数据可能产生不同的结果例如,如果单元格A4和A5分别含有数字5和10,加和公式=SUM(A4:A5)将会返回15,除非你更改单元格里面的数值正如你可以传递数值给Excel内置函数,你也可以传递数值给自定义VBA过程现在,我们来看看如何从子程序传递数值给函数SumItUp这个自定义函数目的是计算一个人的姓和名的字母数目1. 在放置函数SumItUp的模块里输入如下子程序NumOfCharacters:Sub NumOfCharacters()Dim f As IntegerDim l As Integerf = Len(InputBox("Enter first name:"))l = Len(InputBox("Enter last name:"))MsgBox SumItUp(f,l)End Sub2. 将光标放在过程NumOfCharacters的任意地方并按下F5VB将显示信息输入框问你名字,这个信息框由下面的函数产生:InputBox("Enter first name:")3. 输入任何名字,回车,VB承受你输入的文本并且将它作为一个参数传递给函数Len。
函数Len计算提供的文本的字母数目VB将函数Len的结果储存于变量f以供以后使用这之后,VB显示下一个信息框,这次是问你的姓4. 输入任何姓,回车VB将输入的姓传递给函数Len来获得姓的文本长度,然后数值储存于变量l接下来发生什么呢?VB遇到了函数MsgBox,这个函数告诉VB显示函数SumItUp的结果然而,因为这个结果还没有准备好,VB很快就跳到函数SumItUp里,使用变量f和l储存的数值来做计算在函数内部,VB用变量f的值取代参数m和变量l值取代参数n一旦取代工作完成,VB将两个数值加和起来,并且将结果返回给函数SumItUp函数SumItUp内部没有其它的任务了,因此,VB又马上返回子程序并且将函数SumItUp的结果作为一个参数提供应函数Ms。
