3.VBA编程基础-过程调用和参数传递
- 格式:ppt
- 大小:48.00 KB
- 文档页数:12
VBA的过程及参数详解VBA的过程及参数详解VBA中的过程(Procedure)有两种,⼀种叫函数(Function),另外⼀种叫⼦程序(Subroutine),分别使⽤Function和Sub关键字。
它们都是⼀个可以获取参数、执⾏⼀系列语句、以及改变其参数的值的独⽴过程。
⽽与 Function 过程不同的是:带返回值的 Sub 过程不能⽤于表达式。
这⾥主要介绍⼦程序的使⽤⽅法,同样这些⽅法也可以应⽤到Function上。
语法[Private | Public | Friend] [Static] Sub name [(arglist)][statements][Exit Sub][statements]End Sub* ⽤[]符号括起来的选项是可选项[Private | Public | Friend]这三个关键字与作⽤范围有关。
Private表⽰私有,即这个过程只能从本模块⾥⾯调⽤。
使⽤这个关键字,从菜单“⼯具”->”宏”->”宏…”中将看不到该过程。
Public表⽰公⽤,这样从其它的模块也可以访问这个过程。
如果没有使⽤ Public、Private 或 Friend 显式指定,Sub 过程按缺省情况就是公⽤的。
公⽤的过程可以从菜单”⼯具”->”宏”->”宏…”中看到。
Friend⽤在类模块⾥⾯,较少使⽤,在此就不介绍了。
Static是静态的意思(你可能还记得⽤Static声明静态变量),⽤它声明过程的话,表⽰这个过程中声明的局部变量在下次调⽤这个过程时仍然保持它原来的值。
下⾯是Static声明过程的⽤法。
Static Sub m1()Dim i As IntegerDim j As Integeri = i + 1j = j + 1Debug.Print "i=" & i & " j=" & jEnd SubPrivate Sub m2()Dim i As IntegerDim j As Integeri = i + 1j = j + 1Debug.Print "i=" & i & " j=" & jEnd SubSub try1()Dim i As IntegerDebug.Print "静态过程:"For i = 1 To 10Call m1Next iDebug.Print "私有过程:"For i = 1 To 10Call m2Next iEnd Sub运⾏try1过程,然后可以在⽴即窗⼝⾥看到结果。
VBA过程的调用(含过程名称为变量时的方法)VBA过程的调用(含过程名称为变量时的方法)【不带变量调用】一般在VBA里,我们调用某个过程,都会用Call语句,先说说用Call语句直接调用某个过程的方法例如你有一个过程aa如下:Sub aa()Msgbox "喵喵", 64End Sub那么调用这个过程的方法为:Sub Call_aa_01()aaEnd Sub这里,call语句里的call是可以省略的,但为了令代码更清晰,一般程序员会喜欢加上去,以表示aa是一个过程:Sub Call_aa_02()Call aaEnd Sub如果aa是一个带有参数的过程,如:Sub aa(str As String)MsgBox str, 64End Sub那么在用call语句调用的时候,就要这样(不带Call):Sub Call_aa_03()aa "喵喵"End Sub或者这样(带Call):Sub Call_aa_04()Call aa ("喵喵")这里值得注意的是,调用过程的名称如果在整个过程里不是唯一的,即其他模块也有相同名称的过程,那么在调用其他模块里的同名过程时,需要加上模块的名称,如模块1和模块2同时存在过程aa,在模块1里想调用模块2的过程aa,那么必须加上模块2做前缀,否则只会调用同模块下的aa:Sub Call_aa_05()Call 模块2.aaEnd Sub如果aa是在另外一个工作簿里,需要先在VBE-工具-引用,添加引用的工作簿(通常会显示该工作簿的工程名称,如VBAProject1;有多个工程相同时应把自身的工程名删除后再添加personal的工程名),再加上工程名加以调用,这里要注意,相互调用的工作簿是要打开的,而且工程名称不能重复,不然不能引用。
如:Sub call_aa_06()Call VBAProject1.模块2.aaEnd Sub同时,有多个过程aa时,一样需要加上模块名称,只有一个的话模块名称可省略:Sub call_aa_07()Call VBAProject1.aaEnd Sub【带变量调用】好了,以上是传统的调用方法,如果过程名称aa是一个变量呢?我们注意到用Call语句,后面的过程名称不可以是变量,例如以下的调用是行不通的:Sub Call_aa_08()Dim str As Stringstr = "aa"Call str我们要用另一种方法,Application.run方法来调用过程名是变量的过程:Sub Call_aa_09()Dim str As Stringstr = "aa"Application.Run strEnd Sub如果用run方法来调用带参数的过程,则这样,多个参数用逗号分隔:Sub Call_aa_10()Dim str As Stringstr = "aa"Application.Run str, "喵喵"End SubRun方法处理同名过程和Call语句不一样,只要在工作簿中存在相同的名称,即使是工作表里定义的名称,像上一个过程的写法就会报错(没有找到过程或者工程错误),也必须在过程名前加上模块名称(注意点不要漏了),如:Sub Call_aa_11()Dim str As Stringstr = "aa"Application.Run "模块2." & str, "喵喵"End Sub引用其他工作簿(该工作簿必须是打开的),如Book1里的过程则需要加上工作簿名称(注意引号不要漏了),如:Sub Call_aa_12()Dim str As Stringstr = "aa"Application.Run "Book1!模块2." & str, "喵喵"。
vba 模块之间调用函数的方法VBA是Visual Basic for Applications的简称,是一种用于编写宏的编程语言。
在VBA中,模块之间的函数调用是实现代码重用和模块化编程的重要方式之一。
本文将介绍几种常用的VBA模块之间调用函数的方法。
一、直接调用函数在VBA中,模块之间可以直接调用函数。
需要调用的函数必须是公共的,即使用Public关键字声明的函数。
例如,在模块A中定义了一个名为Add的函数:Public Function Add(a As Integer, b As Integer) As IntegerAdd = a + bEnd Function在模块B中,可以直接调用模块A中的函数Add,并使用其返回值进行后续操作:Sub Test()Dim result As Integerresult = Add(2, 3)MsgBox resultEnd Sub二、通过引用模块调用函数除了直接调用函数外,还可以通过引用模块的方式来调用函数。
首先,在模块A中定义一个名为Math的模块,将Add函数放入该模块中:Public Function Add(a As Integer, b As Integer) As IntegerAdd = a + bEnd Function在模块B中,使用关键字"Call"来引用模块A,并通过模块名和函数名来调用函数:Sub Test()Dim result As Integerresult = Math.Add(2, 3)MsgBox resultEnd Sub通过引用模块的方式可以更加清晰地表达函数的来源,也方便维护和管理。
三、使用Application.Run方法调用函数另一种调用函数的方式是使用Application对象的Run方法。
在模块A中定义了一个名为Add的函数:Public Function Add(a As Integer, b As Integer) As IntegerAdd = a + bEnd Function在模块B中,可以使用Application.Run方法来调用模块A中的函数Add:Sub Test()Dim result As Integerresult = Application.Run("Add", 2, 3)MsgBox resultEnd Sub使用Application.Run方法可以动态地调用函数,可以根据需要在运行时确定要调用的函数名。
VBA代码在运行过程中,实际参数的值如何传递给形式参数大家好,我们今日继续讲解VBA代码解决方案的第124讲内容:VBA程序执行过程中,参数的传递形式。
在代码的编写过程中,为了深入的理解代码,有时候要对一些理论的知识必须要做必要的深入了解。
我将在这节和下阶内容中着重讲解程序在运行时参数是如何传递的。
理论的成分多些,但还是希望朋友们能好好掌握。
首先,我们先来理解一下几个定义:什么是形式参数,什么是实际参数,什么是参数的传递,参数传递有几种形式。
1形式参数指出现在Sub 和Function过程中的变量名、数组名。
该过程在被调用前,没有为它们分配内存,其作用是说明自变量的类型和形态以及在过程中的作用。
形参可以是变量名,也可以是数组名。
2 实际参数:就是在调用Sub 和Function过程时,从主调过程传递给被调用过程的参数值。
实参可以是变量名、数组名、常数或表达式。
在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应。
3 参数的传递:在程序运行过程中,实际参数将参数值传递给相应的形式参数,然后在函数中实现数据处理和返回的过程。
4 参数的传递有两种:按值传递和按地址传递① 按值传递:在过程被调用时,传递给形参的是调用过程中的相应实参的值,形参与实参各占有不同位置的储存空间,被调用过程在执行过程中,改变了形参变量的值,但不会调用过程的实参值。
在函数声明行在参数名称之前加上关键字ByVal。
② 按地址传递:就是当调用一个过程时,是把实参变量的内存地址(指针)传递给被调用过程的形参,也就是说形参与实参使用相同地址的内存单元。
因此当在被调用过程中改变形参的值,就等于改变了实参的值。
上面的几个定义或许你不是很理解,下面我们看一个实例:Sub MynzNumbers()Dim a As Integer, b As Integer, c As Integera = 10b = 20c = 30MsgBox MyAverage(a, b, c) & ' ' & a & ' ' & b & ' ' & cEnd SubFunction MyAverage(ByVal a, ByVal b, ByVal c)a = a 60MyAverage = (a b c) / 3End Function代码截图:看了上面的代码,大家想想maxbox弹出的对话框是什么内容呢?看看上面的结果,是否和你想的一致呢?上述过程中使用关键字ByVal在参数名称前,可以防止函数改变参数值。
本篇包括计算机二级基础知识、C语言程序设计、VB、VFP、JAVA、C++、Access 和Delphi语言程序设计考试大纲。
全国计算机等级考试二级基础知识大纲基本要求1.掌握算法的基本概念。
2.掌握基本数据结构及其操作。
3.掌握基本排序和查找算法。
4.掌握逐步求精的结构化程序设计方法。
5.掌握软件工程的基本方法,具有初步应用相关技术进行软件开发的能力。
6.掌握数据库的基本知识,了解关系数据库的设计。
考试内容一、基本数据结构与算法1.算法的基本概念;算法复杂度的概念和意义(时间复杂度与空间复杂度)。
2.数据结构的定义;数据的逻辑结构与存储结构;数据结构的图形表示;线性结构与非线性结构的概念。
3.线性表的定义;线性表的顺序存储结构及其插入与删除运算。
4.栈和队列的定义;栈和队列的顺序存储结构及其基本运算。
5.线性单链表、双向链表与循环链表的结构及其基本运算。
6.树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。
7.顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)。
二、程序设计基础1.程序设计方法与风格。
2.结构化程序设计。
3.面向对象的程序设计方法,对象,方法,属性及继承与多态性。
三、软件工程基础1.软件工程基本概念,软件生命周期概念,软件工具与软件开发环境。
2.结构化分析方法,数据流图,数据字典,软件需求规格说明书。
3.结构化设计方法,总体设计与详细设计。
4.软件测试的方法,白盒测试与黑盒测试,测试用例设计,软件测试的实施,单元测试、集成测试和系统测试。
5.程序的调试,静态调试与动态调试。
四、数据库设计基础1.数据库的基本概念:数据库,数据库管理系统,数据库系统。
2.数据模型,实体联系模型及E-R图,从E-R图导出关系数据模型。
3.关系代数运算,包括集合运算及选择、投影、连接运算,数据库规范化理论。
4.数据库设计方法和步骤:需求分析、概念设计、逻辑设计和物理设计的相关策略。
VBA调⽤C#对象⽅法,传递double数组参数VBA⽅法可以通过COM Interop来调⽤C#对象⽅法。
基本⽅法是公开.NET对象通过COM Interop,然后就可以调⽤.net 对象⽅法并传递参数了,但是参数如果包含double数组,VBA将出现如下错误信息"Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic"下⾯将解决这个问题VBA调⽤C#对象⽅法C#类callableClass必须继承⾃接⼝interfaceExposer。
接⼝interfaceExposer的⽅法被公开可以使⽤VBA调⽤。
//interfaceExposer.csusing System;namespace blah{public interface interfaceExposer{int callableMethodSimple(double a);}}//cssClass.csusing System;namespace blah{public class callableClass : interfaceExposer{public int callableMethodSimple(double a){return (int)a;}}}重点:为项⽬注册COM Interop。
VS 2003中选择“项⽬属性”-“配置属性”-“⽣成”设置“为COM Interop注册”为True,再编译。
VBA:选择⼯具引⽤选择COM对象。
'VBA codePublic cssObject As New SendArray.callableClass 'SendArray 是项⽬名称Dim iClass As interfaceExposerSub MyRoutine()Set iClass = cssObjectDim result As Integerresult = IClass.callableMethodSimple(5.0)End SubVBA传递double数组//cssClass.csusing System;using System.Reflection;namespace blah{public class callableClass : interfaceExposer{.. .public int callableMethodArray(object a){double[] thisVect = LoadComObjectIntoDoubleArray(a);return 0;}private double[] LoadComObjectIntoDoubleArray(object comObject){Type thisType = comObject.GetType();Type dblType = Type.GetType("System.Double[*]");double[] doubleArray = new double[1];if(thisType == dblType){object[] args = new object[1];int numEntries = (int)thisType.InvokeMember("Length", BindingFlags.GetProperty, null, comObject, null);doubleArray = new double[numEntries];for(int j1=0; j1 < numEntries; j1++){args[0] = j1+1;doubleArray[j1] = (double)thisType.InvokeMember("GetValue", BindingFlags.InvokeMethod, null, comObject, args);}} // End if(thisType == dblType)return doubleArray;} // End LoadComObjectIntoDoubleArray()}}'VBA codePublic cssObject As New SendArray.callableClass 'SendArray 是项⽬名称Dim iClass As interfaceExposerSub MyRoutine()Set iClass = cssObjectDim result As IntegerDim SendArray(1 To 2) As DoubleSendArray(1) = 5.2SendArray(2) = 7.5result = iClass.callableMethodArray(SendArray)End Sub转载:。
VBA中的函数和子过程的编写与调用在VBA中,函数和子过程是编写和调用的重要组成部分。
函数用于封装可重复使用的代码,而子过程则用于执行一系列操作。
在本文中,我将详细介绍如何编写和调用VBA中的函数和子过程。
在VBA中,函数和子过程都需要以关键字"Sub"开始,并以"End Sub"结束。
函数的关键字是"Function",并且需要返回一个值。
函数和子过程可以传递参数,这些参数可以是任何数据类型。
编写函数时,我们需要指定函数的名称和返回类型。
在函数体中,我们可以定义局部变量,并使用VBA的控制结构(如条件语句和循环语句)来执行一系列操作。
下面是一个示例,演示了如何编写一个名为"AddNumbers"的函数,该函数接收两个整数参数并返回它们的和:```vbaFunction AddNumbers(num1 As Integer, num2 As Integer) As IntegerDim sum As Integersum = num1 + num2AddNumbers = sumEnd Function```在上面的示例中,"AddNumbers"函数接收两个整数参数"num1"和"num2",并将它们相加赋值给局部变量"sum"。
最后,函数使用"AddNumbers = sum"语句将"sum"作为函数的返回值。
要调用函数,我们只需在代码中使用函数的名称,传递所需的参数。
下面是调用"AddNumbers"函数的示例:```vbaSub Example()Dim result As Integerresult = AddNumbers(5, 10)MsgBox "The sum is: " & resultEnd Sub```在上面的示例代码中,我们声明一个变量"result"来存储函数的返回值。
VBA函数传递参数方式在VBA中,有多种方式可以传递参数给函数。
以下是最常见的几种方式:1.值传递:通过值传递,实际参数的值被复制到形式参数中。
此时,形式参数和实际参数是两个不同的变量,对形式参数的修改不会影响到实际参数。
这是VBA默认的参数传递方式。
2.引用传递:通过引用传递,形式参数是实际参数的引用。
这意味着,形式参数和实际参数是同一个变量,对形式参数的任何修改都会影响到实际参数。
如果想要使用引用传递,需要在函数定义中使用ByRef关键字。
3.可选参数:可选参数是指在函数定义时可以省略的参数。
在函数内部,可以通过判断该参数是否有传递数值来确定是否使用默认值。
在VBA中,可以通过在参数名称后加上可选关键字Optional来定义可选参数,然后定义一个默认值。
例如:Sub MyFunction(Optional ByVal parameter As Integer = 0)此时,函数可以按照以下两种方式调用:MyFunction ' 不传递参数,使用默认值MyFunction(10) ' 传递参数10,使用传递的值4.命名参数:命名参数是指通过指定参数名称来传递参数,而不是按照位置传递参数。
使用命名参数可以避免参数位置的困扰,特别是当函数有多个可选参数时。
在VBA中,调用函数时可以使用参数名:=参数值的形式来指定参数。
例如:MyFunction(parameter:=10) ' 通过参数名指定参数值5.数组参数:数组参数是指传递一个数组给函数。
在VBA中,可以通过在参数名称后加上可变关键字ParamArray来定义一个数组参数。
例如:Sub MyFunction(ParamArray parameter( As Variant)在函数内部,可以通过遍历数组来访问每个元素。
这些是VBA中常用的参数传递方式。
根据具体的需求,可以选择适合的方式来传递参数给函数。
VBA在窗体间传递参数的几种常用办法在实际开发应用中,经常需要在窗体间传递参数。
常用的几种参数传递方法有如下几种:1。
使用openargs在调用的窗体使用如下语句:docmd.openform "被调用的窗体",,,,,,"参数值" 在被调用的窗体使用me.openargs即可获取传递过来的参数2。
使用全局变量先设置一个全局变量,例如:gstrPara,Public gstrPara as string在调用之前传递参数值给这个全局变量gstrPara="参数值"docmd.openform "被调用的窗体"在被调用的窗体里使用gstrPara即可获取传递过来的参数3。
使用tag标记将要传递的参数放置在调用窗体的tag标记里在被调用的窗体里通过调用forms.tag 来获取参数值4。
使用模块变量在调用窗体设置一个公共的模块变量mstrPara将要传递的参数放置在调用窗体的mstrPara变量里在被调用的窗体里通过调用forms.mstrPara 来获取参数值5。
直接获取假如参数来自调用窗体的控件,也可直接调用在被调用的窗体里直接引用调用窗体的控件的值如:forms.控件名.value6。
多个参数传递假如需要传递多个参数,可将参数合并到一个变量里传送(使用指定符号隔开),然后在被调用窗体再拆分这些变量,以达到多个参数传递的效果。
不过,因为一般传递两个参数的时候,多数一个是变量,一个是窗体本身,所以我常用的方法也是比较实用的方法是:在调用窗体使用如下语句:docmd.openform "被调用的窗体",,,,,,"参数值" 而在被调用的窗体里设置一个模块变量mfrmSrc在被调用的窗体的open或load事件中设置set mfrmSrc= screen.activeform这时mfrmSrc就指向原来的调用窗体(因为在窗体未完全加载好前,屏幕上激活的窗体是原来的窗体)使用mfrmSrc你可以获取调用窗体上所有控件及相关的值,并且不需要事先知道原来窗体的名称,具有比较强的通用性。