第7章SUB过程与FUNCTION函数
第7章VB过程和参数传递
VB程序设计教程
沈美莉 马银晓 陈孟建 编著
10
Function过程 第二节 Function过程
二、调用Function过程 调用 过程
Function过程的调用比较简单,可以象一个函数一样调用,其调用格式为: <过程名> = ([<实参表列>]) 【例题5.16】 编写一个求最大公约数(GCD)的函数过程,并调用该函数。 【程序代码】 (1)创建GCD函数 Function gcd(ByVal x As Integer, ByVal y As Integer) As Integer Dim reminder As Integer Do While y <> 0 reminder = x Mod y x = y y = reminder Loop gcd = x End Function
VB程序设计教程
沈美莉 马银晓 陈孟建 编著
5
Sub过程 第一节 Sub过程
二、调用sub过程 调用 过程 调用Sub过程有两种方法,一种方法是使用Call调用过程语句来调 用过程,另一种方法是将过程名作为一个语句来使用。 call调用语句 1.用call调用语句 (1)格式 Call 过程名 [(<实参表>)] (2)功能 Call语句把程序控制传递到一个Visual Basic语言的Sub过程。 Call语句调用一个过程时,如果过程本身没有参数,则<实参表> 和括号可以省略;否则,应给出相应的实际参数,并把参数放在 括号中。实际参数是传递给sub过程的变量或常数的。 例如: Call ppa(a,b)
VB程序设计教程
沈美莉 马银晓 陈孟建 编著
18
第三节 参数的传递
例如: Function fac(a,b) …… …… fac = fa End Function 调用fac函数时,可以使用以下语句来完成: Private Sub Command1_Click() …… …… Call fac(x,y) End sub 以上程序中的a和b是两个形式参数,而 x和y是两个实际参数。这样就完成了形参 与实参的结合,其关系如下图所示。
VB第7章 过程
【例7-3】编写一个利用三角形三条边的长度求 三角形面积的函数
Area= c(c-x)(c-y)(c-z) c=(x+y+z)/2
2. Function过程的调用
(1)
像使用VB内部函数一样,只需写出函数名和相应的参数 s = Max(a, b) Print Max(s, c)
(2)用Call语句调用
例7.2
计算1!+2!+3!+…+10!
因为计算5!和10!都要用到阶乘n! (n!=1×2×3×…×n) 所以把计算n!编成Sub过程 程序代码: Private Sub Form_Click() 若实参要获得子过程的返回值, Dim y As Long, sum As Long 则实参只能是变量. Dim i as Integer for i=1 to 10 Call Jc(i, y) Private Sub Jc(byval n As Integer, t As Long) sum=sum+y Dim i As Integer Next i t=1 Print sum For i = 1 To n End Sub t=t*i Next i End Sub
把以上三个方面分析好之后,就可以编写一个递归程序。 其一般格式为:
if(边界条件) 赋予边界值 else 调用解决问题的通式
例7.11
采用递归方法求n!
(n>0)
可用下列的递归公式
1 n! = n×(n-1)!
n=1 n>1
本递归中,终止条件是n=1
Private Sub Form_Load() m= fac(3) Print “3!= "; m End Sub 3*2
第7章 过程过程1
2. 调用 Function 过程
[格式]:<函数名>([实在参数表]) [功能]:返回一个函数值。
[说明]:பைடு நூலகம்
(1)一般情况下,函数的调用出现在赋值语句中,并且在赋值号 的右侧; (2)若函数没有参数,函数名后的括号不能省略; (3)虽然VB允许象调用Sub过程那样调用Function过程,但这样 调用时系统不返回函数值,建议大家不要使用这种调用方法。 例如: Call fact(x) Fact x 这两种方法均放弃函数的返回值
例: Private Sub Exchange(x As Integer,y As Integer) Dim Temp As Integer Temp=x : x=y : y=Temp
End Sub
该通用过程实现交换功能,包含两个参数,均是 ByRef形式的参数。
调用语句(Call语句)
Sub
过程体
6. Sub过程调用
[格式一]:Call <过程名>[(<实在参数表>)] [格式二]:<过程名> [<实在参数表>]
[功能]:对已定义的过程进行调用。
[说明]: (1)调用的过程必须是已经定义的,否则系统会出现“子程序或函数未定 义”的信息提示;
(2)实在参数可以是常量、变量或表达式、数组;
(3)实在参数的数目及类型要和定义时必选参数保持一致,否则系统会出 现“参数不可选”的信息提示,参数之间用逗号间隔;
Private Sub Command1_Click() Dim a As Integer, b As Integer Dim c As Integer a = Text1: b = Text2: c = Text3 If a > b Then Call Change(a, b) If a > c Then Call Change(a, c) If b > c Then Call Change(b, c) Text1 = a: Text2= b: Text3= c End Sub
vb程序设计第七章
7.1
Sub子过程
Sub过程分为事件过程和通用过程。 1. 事件过程 当 Visual Basic 中的对象对一个事件 的发生作出认定时,便自动用相应于事件的名 字调用该事件的过程。因为名字在对象和代码 之间建立了联系,所以说事件过程是附加在窗 体和控件上的。一个控件的事件过程将控件的 (在 Name 属性中规定的)实际名字、下划线 (“_”) 和事件名组合起来。
Integer
4、数组参数的传递 在VB中允许参数是数组,数组只能通过传址方式 进行传递,在传递数组时还要注意以下事项: 1)在实参列表和形参列表中放入数组名,忽略 维数的定义,但圆括号不能省略。 2)如果要传递数组的某一个元素,则只须直接 写上该数组元素。如:Call test(4,a(3)) 例:
7.4.2 变量的作用域 变量的作用域决定了哪些子过程和函数过程可以 访问该变量。 1、局部(过程级)变量 指在过程内用Dim语句声明的变量(或不加声 明直接使用的变量),只能在本过程中使用的 变量,别的过程不可访问。 2、窗体(模块级)变量 指在一窗体/模块的任何过程,即在“通用声 明”段中用Dim 语句或用Private语句声明的变 量,可被本窗体/模块的任何过程访问。
Fact(2)=2*fact(1) Fact(1)=1*fact(0) Fact(0)=1
Fact(4)=4*6 Fact(3)=3*2
Fact(2)=2*1 Fact(1)=1*1
边界条件
思考:根据递归的处理过程,在上述fact函数过程中, 若少了 : If n= 0 then fact=1 即只有语句: fact(n)=n*fact(n-1) 程序运行结果将会如何? 总结:构成递归的条件 (1)递归结束条件及结束时的值 (2)能用递归形式表示,并且递归向结束条件发展 注意: (1)递归算法设计简单,但消耗的上机时间和占据的内 存空间比非递归算法大; (2)设计正确的递归算法要满足构成递归的条件。
过程和函数
VBA过程和函数过程是构成程序的一个模块,往往用来完成一个相对独立的功能。
过程可以使程序更清晰、更具结构性。
VBA具有四种过程:Sub 过程、Function函数、Property属性过程和Event事件过程。
一.Sub过程Sub 过程的参数有两种传递方式:按值传递(ByVal)和按地址传递(ByRef)。
如下例:Sub password (ByVal x as integer, ByRef y as integer)If y=100 then y=x+y else y=x-yx=x+100End subSub call_password ()Dim x1 as integerDim y1 as integerx1=12y1=100Call password (x1,y1) ‘调用过程方式:1. Call 过程名(参数1, 参数2…) ; 2. 过程名参数1, 参数2…debug.print x1,y1 ‘结果是12、112,y1按地址传递改变了值,而x1按值传递,未改变原值End sub二.Function函数函数实际是实现一种映射,它通过一定的映射规则,完成运算并返回结果。
参数传递也两种:按值传递(ByVal)和按地址传递(ByRef)。
如下例:Function password(ByVal x as integer, byref y as integer) as booleanIf y=100 then y=x+y else y=x-yx=x+100if y=150 then password=true else password=falseEnd FunctionSub call_password ()Dim x1 as integerDim y1 as integerx1=12y1=100if password then ‘调用函数:1. 作为一个表达式放在=右端; 2. 作为参数使用debug.print x1end ifEnd sub(一)什么是模块,VBA都包含什么模块呢?首先我们来看微软VBA帮助中的三个定义:模块:一组声明集合,其后为过程声明:不可执行的代码,它命名一常数、变量或过程,并且指定其特性,比如数据类型。
ASP Sub过程和Function函数
ASP Sub 过程和Function 函数Sub 过程是包含在Sub 和End Sub 语句之间的一组VBScript 语句,执行操作但没有返回值。
Sub 过程可以使用参数(由调用过程传递的常数、变量或表达式)。
如果Sub 过程无任何参数,则Sub 语句必须包含空括号()。
下面的代码示例是一个不带任何参数的Sub 过程,弹出一个消息框,显示"HESub 过程还可以使用参数,下面就是一个带两个参数的Sub 过程,弹出消息框,调用Sub 过程时,只需输入过程名及所有参数值,参数值之间使用逗号分隔。
另外一种调用方法,就是使用Call 语句,但如果使用了Call 语句,则必须将所有参数包含在括号之中。
下面的示例显示了调用上述带参数过程Test 的两种方式。
一种使用Call 语句;另一种则不使用。
两种方式效果相同。
调用过程的必须是一个独立的语句。
在过程中还可以用Exit Sub 语句强制从过程中退出并且返回。
当不使用Call 语句调用过程时,括号被省略;使用Call 语句调用过程时,要用括号并且包含所有参数。
Function 函数是包含在Function 和End Function 关键字之间的一组VBScript 语句。
Function 函数通过函数名返回一个值,这个值是在函数内赋给函数名的。
Fu nction 返回值的数据类型总是Variant 。
与Sub 类似,若Function 函数没有参数,那么Function 函数名后面必须跟从一个无内容的括号“()”。
例如创建一个带参数的Function 函数Celsius 用于将华氏温度转换成摄氏温度,具体代码如下:在Function 函数中,为了返回一个数值,只需要将要返回的数值赋给函数名即可。
函数的调用方法与过程略有不同,函数可以在表达式中使用。
调用函数时,参数要放在()中,这样就可以将它们和表达式的其他部分区别开。
例如:同样,也可以使用Call 语句来调用函数。
VB程序设计-过程和函数
Private Sub Command1_Click()
Print sum(5, 3)
调用函数
End Sub
Function sum(x, y)
s=x+y sum = s
定义函数
End Function
函数和过程的相互转换
Private Sub Command1_Click()
Call sum(5, 3, s) 调用过程
function title(tit,n)
if len(tit)>n then
title=left(tit,n)&"…"
'返回函数值
else
title=tit
'返回函数值
end if
end function
5.7 参数传递
5.7.1 形参与实参
• 形参:置于过程定义时,参数列表中的变 量或数组;在过程被调用前,系统不对其 分配空间;
6.3 子过程与函数的参数传递
1.参数传递方式
过程的参数有两种传递方式:
传值(ByVal)
传地址(ByRef)(默认方式)。
按值传递参数:在形式参数前加上关键字ByVal 表示指定按值传递参数。调用时实际参数仅将值
传递给形式参数,形式参数的任何改变不会影响 实际参数。
按地址传递参数:
在形式参数前加上关键字ByRef表示指定按地址传递参 数。
调用函数 –变量= Function 函数名(参数1,参数2,…) –函数可以向变量一样引用和参与运算
6.2 定义Function过程
定义Function过程说明: 1)Function过程以Function语句开头,以End Function结束;中间代码部分为函数体; 2)函数名有返回值,其值类型由As 数据类型指定; 3)函数体内一般都会至少为函数名赋值一次;如果 不赋值,函数返回值默认为0或空; 4)函数中途可以利用Exit Function退出。
VB考试教程:过程的使用之再谈Sub过程与Function过程的调用及使用
VB考试教程:过程的使用之再谈Sub过程与Function过程的调用及使用1、再谈Sub过程与Function过程的调用及使用调用过程有很多方法,它们与过程的类型、位置以及在应用程序中的使用方式有关。
调用Sub 过程与Function过程不同,在表达式中,调用Sub过程的是一个独立的语句,而调用函数过程只是表达式的一部分。
Sub过程还有一点与函数不一样,它不会用名字返回一个值。
而与Function过程一样,Sub过程也可以修改传递给它们的任何变量的值。
(1)调用Sub过程有两种方法:Call MyProc(FirstArgument,SecondArgument)MyProc FirstArgument,SecondArgument说明当使用Call语法时,参数必须在括号内。
若省略Call关键字,则也必须去掉参数两边的括号(2)调用函数过程方法一:通常,调用自定义的函数过程的方法和调用VB内部函数过程的方法一样,即在表达式中写上名字。
方法二:也可以像调用Sub过程一样调用Function 过程,如调用函数过程Year:Call Year(Now)Year Now当用这种方法调用函数时,放弃返回值。
一般来说,函数都赋值给某些变量或属性。
(3)调用其它模块中的过程在工程中的任何地方都能调用其它模块中的公用过程。
调用其它模块中的过程的各种方法,取决于该过程是在窗体模块中、类模块中还是标准模块中。
调用窗体模块中的过程:所有窗体模块的外部调用过程必须指向包含此过程的窗体模块。
如在窗体模块Form1中包含SomeSub过程,则可使用语句:“Call Form1.SomeSub(参数列表)”来调用Form1中的SomeSub 过程。
调用类模块中的过程:类模块中的过程与窗体中调用过程类似,在类模块中调用过程要调用与过程一致并且指向类实例的变量。
例如DemoClass是类Class1的实例:Dim DemoClass as New Class1DemoClass.SomeSub但是不同于窗体的是,在引用一个类的实例时,不能用类名作限定符(如不能像窗体中用Form1.SomeSub那样使用Class1.SomeSub),必须首先声明类的实例为对象变量(如上面的DemoClass)并用该变量名引用它。
定义Public语句,Dim语句,Function过程,Sub过程的区别
定义Public语句,Dim语句,Function过程,Sub过程的区别
说明:
实际上窗体、报表属于比较特殊一点的类,这里为了新手看的更明白一点,将其放在和类同一概念级别。
指示Sub子过程、Function函数、类的有效范围:
Public:
范围为全局公有,在所有模块、类、窗体、报表中均可以调用。
同时可用于定义全局变量。
Private:
范围为模块私有,只能在定义它的模块/类/窗体/报表中使用。
同时可用于定义模块级变量。
Dim:
即Dimention的缩写,用来定义变量。
一般主用在Sub和Function中,模块和类模块的开头位置也可以用来定义模块级变量,但建议最好还是使用Private更准确一些。
定义子程序或函数:
Sub:
即Subroutine子程序。
用于执行一段代码完成某项任务处理,并且不需要向它的调用者返回信息。
Function:
即函数,包含Sub的所有功能,同时还能提供返回值。
例如进行某项计算,最后将计算结果返回给调用者。
visual basic 程序设计课后习题参考答案
Visual basic 程序设计习题参考答案第一章Visual basic 程序设计一、选择题二、填空题三、简答题1、简述visual basic 的特点。
(1)具有可视化的设计平台(2)面向对象的设计方法(3)事件驱动的编程机制(4)结构化程序设计语言(5)开放的数据库功能与网络支持2、什么是对象、类、属性、事件和方法?在可视化编程语言中,对象是代码和数据的集合,它可以是窗体和控件,也可以是菜单和数据库等。
描述一个对象有三个基本要素:属性、方法和事件。
类是一组用来定义对象的相关过程和数据的集合,即同类对象的集合和抽象。
属性是描述对象的一组特性。
方法是对象能够执行的动作,它是对象本身内含的函数或过程,用于完成某种特定的功能。
事件是发生在对象上并且能够被对象识别的动作,即由系统预先设置好的、能被对象识别的动作,如Click(单击)、DblClick(双击)、Load(窗体的装载)、KeyPress(按键)、Change(改变)、MouseMove (鼠标的移动)等,每一种对象能识别的事件是不同的5、什么是事件驱动的编程机制?当某个事件(一般由用户操作来触发) 发生时,系统就会自动执行此事件的事件过程。
由事件控制整个程序的执行流程。
事件过程要经过事件的触发才能被执行,这种工作模式称为事件驱动方式。
第二章Visual basic 程序设计基础一、选择题二、填空题第三章数据输入输出一、选择题二、填空题3第四章选择结构和循环结构程序设计一、选择题二、填空题第五章数组一、选择题二、填空题第六章过程一、选择题二、填空题三、简答题1、简述事件过程和通用过程的含义和联系。
5VB应用程序是由过程组成的,过程是完成某种特殊功能的一组独立的程序代码。
VB中的过程有两大类:事件过程和通用过程事件过程是当发生某个事件时,对该事件作出响应的程序段。
事件过程由VB自行声明,用户不能增加或删除。
事件过程是VB 应用程序的主体。
Excel 过程与函数
Excel 过程与函数
过程是构成程序的一个模块,往往用来完成一个相对独立的功能。
过程可以使程序更清晰、更具结构性。
VBA最常用的有Sub 过程和Function函数。
1.Sub过程
Sub过程又称为子过程。
他是在响应事件时执行的代码块。
如果模块中的代码分成子过程后,在应用程序中查找和修改错误代码就容易了。
Sub过程是一系列由Sub和End Sub语句所包含起来的Visual Basic语句,他们会执行动作却不能返回值。
Sub过程可以有参数,如常量、变量或者表达式等。
其中,Sub 过程的参数有两种传递方式:按值传递(ByVal)和按地址传递(ByRef)。
●按值传递参数
按值传递时,实际上传递的是变量的副本。
如果过程改变了这个值,则作为变动直接显示副本而不影响变量本身。
●按地址传递参数
按地址传递参数使过程用变量的内存地址去访问变量的实际内容。
其结果是当变量传递给过程时,通过过程可以改变变量的值。
如果在按地址传递参数时已经指定其数据类型时,则必须按该类型的值进行传递。
在VBA中,按地址传递参数可以缺省。
2.Function函数
函数实际是实现一种映射,它通过一定的映射规则,完成运算并返回结果。
参数传递也两种:按值传递(ByVal)和按地址传递(ByRef)。
另外,VB在对象功能上添加的两个过程,分别为Property属性过程和Event事件过程。
它们与对象特征密切相关,也是VBA比较重要组成。
VB中sub过程与function函数的区别
function是函数,sub是子程序,都可以传递参数,但函数有返回值,子程序没有function 可以用自身名字返回一个值,sub 需定义别的变量,用传址方式传回值。
Sub 过程与Function 过程的区别:1.Sub 过程定义时无需定义返回值类型,而Function 过程一般需要用“As 数据类型”定义函数返回值类型。
2.Sub 过程中没有对过程名赋值的语句,而Function 过程中一定有对函数名赋值的语句。
3.调用过程:调用Sub 过程与Function 过程不同。
调用Sub 过程的是一个独立的语句,而调用函数过程只是表达式的一部分。
Sub 过程还有一点与函数不一样,它不会用名字返回一个值。
但是,与Function过程一样,Sub 过程也可以修改传递给它们的任何变量的值。
4.调用Sub 过程有两种方法:以下两个语句都调用了名为MyProc 的Sub 过程。
Call MyProc (FirstArgument, SecondArgument)MyProc FirstArgument, SecondArgument注意当使用Call 语法时,参数必须在括号内。
若省略Call 关键字,则也必须省略参数两边的括号。
在VB中,子过程与函数过程只有一处区别(要学好VB一定要记住),区别就是:子过程没有返回值,函数过程有返回值。
子过程用于编写一些代码的集合,函数过程用于建立函数。
我兴个例吧。
例如,我要做多处要做如下事件,我只要编写一个子过程,在其它事件下,我只要把子过程的名称写下就行了。
Private Sub ABC(A As Integer, B As Integer, C As Integer)A = 1B = 1C = 1End SubPrivate Sub Command1_Click()ABC '按扭一就调用了该子过程了,而不用再写子过程的代码。
End SubPrivate Sub Command2_Click()ABC '按扭二就调用了该子过程了,而不用再写子过程的代码。
第7章SUB过程与FUNCTION函数
7.4.2 参数传递(虚实结合)
参数传递指主调过程的实参(调用时已有确定值和内存 地址的参数)传递给被调过程的形参,参数的传递有两种方 式:按值传递、按地址传递。形参前加“ByVal”关键字的 是按值传递,缺省或加“ByRef”关键字的为按地址传递。
☆☆ 第7章 过程
例:编制求n!的Function过程,调用过程求 3!+7!
形参 Private function fact(n as integer) as long 执行过程: Dim t as long,I as integer Private sub form_click() (2)(1) T=1 Dim s&, s1& , s2& (6) ( 3 ) For I= 1 to n (7) S1=fact(3) 实参 (5) T=t*I S2=fact(7) Next I (4) S=s1+s2 Fact=t End function
☆☆ 第7章 过程
7.2.2 Sub过程的调用(1)
1 sub过程的调用 (1) 格式一: 说明: (1)参数列表称为实参或实元,它必须与形参保持个数相 同,位置与类型一一对应。 (2)调用时把实参值传递给对应的形参。其中值传递(形 参前有ByVal说明)时实参的值不随形参的值变化而改变。而 地址传递时实参的值随形参值的改变而改变。 子过程名 [参数列表]
☆☆ 第7章 过程
7.2.4 Sub过程调用的执行过程:
主程序
Sub command1_click() Dim a%,b% a=val(inputbox( “a=“)) 调用出口 b=val(inputbox(“b=“)) print “a=“;a,”b=“,b call swap(a,b) print “a=“;a,”b=“,b 返回入口 End Sub
function过程
注意:过程中允许形参和主程序中的实参同名,为什么?
2、传地址调用:
★VB默认的参数传递方式是传地址调用,但前提是实参必 须是★变量名或数组,或者给形参变量名前加ByRef也可指定 为传地址调用。 传址调用时,实参必须是变量名或数组,常量和表达式不 能实现地址传递。
若为变量名,是将变量的内存地址传给对应位置上的形参;
三、变量的重名
VB规定: 同一个过程中不能声名重名变量。 但不同的过程中可以声名同名变量。不同的过程也可以声 名同名的静态变量。同一个模块中不能声名同名的模块级和全 局变量。 不同作用域变量重名时,有效范围小的变量会屏蔽有效范 围大的变量。 如:一个全局变量与一个过程中的某个局部变量变量重名 时,当在过程中直接使用这个变量时,被认为是局部变量。
目录
1 2 3 4 Sub子过程 函数过程 参数传递 过程和变量的作用范围
函数过程
函数过程也是由用户自己编写的,其功能类似于子过程。 不同之处在于函数过程名可以具有返回值。
一、函数过程的建立
1、利用菜单建立 在“工具”菜单下选择“添 加过程”,显示如图的对话框。 按所需选择相应的过程名称、 类型、范围等,即可建立一个 函数过程。
什么形式,均采用传值调用的方式。
例:分析下面程序执行结果。
Private Sub Form_Click( ) Dim a as integer, b as integer, c as integer a=5:b=3:c=9 cls print a;b;c Call prod((a),(b),(c)) Print a;b;c End Sub Sub prod (a as integer,b as integer,c as integer) a=6:b=8:c=a*b End Sub ‘换成Call prod(a, b, c)的结果又如何?
vb第7章过程jh
例:用函数实现两个整型数据相加。 Private Function addF(m%, n%)As Integer Dim sum As Integer sum = m + n addF = sum End Function
例: 编一个求n!的函数过程。
Private Function f(n) Dim s As Long, i As Integer s = 1 For i = 1 To n s = s * i Next i f = s End Function
2. 函数的调用
调用格式:
函数名(实参列表)
说明: 在调用时实参和形参的数据类型、顺序、 个数必须匹配。函数调用只能出现在表达 式中,其功能是求得函数的返回值。
例 通过函数调用求两个整型数的和。
Private Function addF(m%, n%) As Integer Dim sum As Integer sum = m + n addF = sum End Function Private Sub Command1_Click() Dim x As Integer, y As Integer, z As Integer x = Val(InputBox("请输入第一个加数")) y = Val(InputBox("请输入第二个加数")) z = addF(x, y) Print x; "+"; y; "="; z End Sub
利用“工具”菜单的“添加过程”命令创建。 利用代码窗口直接创建 格式:
[Public|Private][Static]Function 函数名([<形参列表>])[As<类型>] <语句块> 函数名=返回值 End Function
函数和过程
16
【例8-4】编程计算。要求计算 !使用函数 】编程计算。要求计算n! 过程Factorial(n)实现。 实现。 过程 实现
m! n!(m n)!
17
m! n!(m n)!
Function Factorial(N) Dim i, T T=1 For i = 1 To N T = T* i Next Factorial = T End Function Dim M, N
14
3.函数定义步骤 . 同编写过程一样,在“通用”对象代码窗口输入函数首行。 同编写过程一样, 通用”对象代码窗口输入函数首行。 如定义函数过程 如定义函数过程Max,实现求三个数的最大值: ,实现求三个数的最大值: Function Max(a, b, c) Max = a If b > Max Then Max = b If c > Max Then Max = c End Function 以上函数过程的过程名为 以上函数过程的过程名为Max 参数 、b、c 参数a、 、 函数体中多次使用了函数名 函数体中多次使用了函数名Max,并使用了参数 ,
10
【例】分析以下程序: 分析以下程序:
Sub A(n) Dim i For i = 1 To n Document.write(i) Next Call B End Sub Sub B() Document.write("BBBBBB“) End Sub Call A(9) A9 A(9)
11
2、 定义 、 定义Function函数过程 函数过程 Function函数过程执行完毕后有一个返回值。 函数过程执行完毕后有一个返回值。 函数过程执行完毕后有一个返回值 过程没有返回值。 而SUB过程没有返回值。 过程没有返回值 函数过程定义后,可像系统函数一样使用。 函数过程定义后,可像系统函数一样使用。 格式: 格式: Function 函数名 参数列表 函数名([参数列表 参数列表]) [函数体 函数体] 函数体 End Function
ExcelVBA解读(27):看看VBA的Sub过程和Function过程
ExcelVBA解读(27):看看VBA的Sub过程和Function过程经过前⾯的⼀系列⽂章的⽰例学习,我们应该已经熟悉了Sub过程。
通常我们看到的Sub过程的基本形式是:Sub 过程名称()[此处放置代码语句]Exit SubEnd Sub这也是我们在编写⼤多数VBA程序时⽤到的结构。
其中:过程名称为编程⼈员给过程命名的名称,其命名规则与变量名称的规则相同。
在同⼀模块中的过程名称不能同名。
Sub和End Sub配套出现,它们之间构成⼀个完整的程序过程。
过程中的代码可以放置ExitSub语句,表⽰提前退出过程。
通常,在VBE编辑器中,写下sub和过程名称,按下回车键后,会⾃动添加End Sub语句。
Sub过程⽤来执⾏操作,⽽Function过程可以返回值,创建⾃定义函数。
Function过程的基本语法形式为:Function 过程名称()[此处放置代码语句][过程名称= 表达式或值][Exit Function][此处放置代码语句][过程名称= 表达式或值]End Function可以看出,其形式与Sub过程的基本形式相似,只是将关键词Sub换成了Function。
注意:在Function过程的代码语句中,应⾄少有⼀次把某个确定的值赋值给函数过程的名称。
建议避免使⽤Excel内置函数名称、单元格引⽤、单元格区域的名称作为函数过程的名称。
Function过程不能对单元格区域进⾏修改,不能执⾏与对象相关的操作。
Function过程可以应⽤在⼯作表公式中,就像Excel的内置函数⼀样;Function过程也可以应⽤在VBA代码中。
过程代码中可以放置ExitFunction语句,表⽰提前退出过程。
按惯例,⽅括号表⽰可选。
下⾯的⽰例代码统计当前可见⼯作簿的数量:Function lWkbNum()Dim lCount As Long '声明计数变量Dim wkb As Workbook '声明⼯作簿对象变量'遍历应⽤程序中的⼯作簿For Each wkb In Application.Workbooks'如果为可见⼯作簿则增加1If wkb.Windows(1).Visible ThenlCount = lCount 1End IfNext wkb'将结果赋值给函数名lWkbNum = lCountEnd Function就像运⽤Excel内置函数⼀样,在⼯作表中输⼊“=lWkbNum()”,显⽰当前已打开的可见⼯作簿的数量,如下图所⽰。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.4.2 参数传递(虚实结合)
参数传递指主调过程的实参(调用时已有确定值和内存 地址的参数)传递给被调过程的形参,参数的传递有两种方 式:按值传递、按地址传递。形参前加“ByVal”关键字的 是按值传递,缺省或加“ByRef”关键字的为按地址传递。
通过函数名把值返回给上一级调用 程序
☆☆ 第7章 过程
说明:
(1)函数名:命名规则与变量名规则相同。但不能与系统的 内部函数或其它通用子过程同名,也不能与已定义的全局变 量和本模块中模块级变量同名。 (2)在函数体内,函数名可以当变量使用,函数的返回值就 是通过对函数名的赋值语句来实现的,在函数过程中至少要 对函数名赋值一次。 ( 3 ) AS类型:是指函数返回值的类型,若省略,则函数返 回变体类型值(Variant)。
先编写程序:从键盘输入m,n(m>n),求
Private Sub Form_click() Dim m %, n %, f !, i% , j% , k% Dim fm &, fn &, fmn & fm = 1: fn = 1: fmn = 1 i = 1: j = 1: k = 1 m = Val(InputBox("m=?")) : n = Val(InputBox("n=?")) While i <= m fm = fm * i i=i+1 Wend While j <= n fn = fn * j j=j+1 Wend While k <= m - n fmn = fmn * k k=k+1 Wend f = fm / (fn * fmn) Form1.Print "f="; f End Sub
☆☆ 第7章 过程
7.4 参数的传递
Visual Basic 中不同模块(过程)之间数据的传递有
两种方式:
通过过程调用实参与形参的结合实现;
使用全局变量来实现各过程中共享数据。
☆☆ 第7章 过程
7.4.1 形式参数与实际参数
1、形式参数
是指在定义通用过程时,出现在Sub或Function语句中 的变量名后面园括号内的数,是用来接收传送给子过程的 数据,形参表中的各个变量之间用逗号分隔。 2、实际参数
求n!阶乘 的 Function 函数
☆☆ 第7章 过程
VB中共有四种用户自定义过程
重点 学习 “Sub” 保留字开始的为Sub子过程
“Function” 保留字开始的为Function函数过程
不作 “Property”保留字开始的为属性过程 要求 “Event”保留字开始的事件过程
☆☆ 第7章 过程
☆☆ 第7章 过程
7.2.2 Sub过程的调用(1)
1 sub过程的调用 (1) 格式一: 说明: (1)参数列表称为实参或实元,它必须与形参保持个数相 同,位置与类型一一对应。 (2)调用时把实参值传递给对应的形参。其中值传递(形 参前有ByVal说明)时实参的值不随形参的值变化而改变。而 地址传递时实参的值随形参值的改变而改变。 子过程名 [参数列表]
☆☆ 第7章 过程
例:编制求n!的Function过程,调用过程求 3!+7!
形参 Private function fact(n as integer) as long 执行过程: Dim t as long,I as integer Private sub form_click() (2)(1) T=1 Dim s&, s1& , s2& (6) ( 3 ) For I= 1 to n (7) S1=fact(3) 实参 (5) T=t*I S2=fact(7) Next I (4) S=s1+s2 Fact=t End function
(4)Exit Function:表示退出函数过程,常常是与选择结构 (If或Select Case语句)联用,即当满足一定条件时,退出函 数过程。 (5)形参数列表:形参的定义与子过程完全相同。 ☆☆ 第7章 过程
7.3.2 函数的调用
调用形式如下:
函数名(实参列表)
说明: 在调用时实参和形参的数据类型、顺序、个数必须匹 配。函数调用只能出现在表达式中,其功能是求得函数 的返回值。
f
m! n!(m n)!
求M!
求N!
求(m-n)!
从这个程序可看出:代码中求 阶乘的3段代码的功能重复的, 3次调用, 只是数据的不同。如果把求阶 分别求得 乘功能模块拎出来,作为一个 m!,n!(m-n)! 独立模块,就可大大减少程序 代码的冗余。
Private Function fact(n As Integer) As Long Dim i As Integer, t As Long i = 1: t = 1 While i <= n t=t*i i=i+1 Wend f=t End Function Private Sub Form_click() Dim m%, n%, f& Dim fm As Long, fn As Long, fmn As Long m = Val(InputBox("m=?")) :n = Val(InputBox("n=?")) fm = fact(m) fn = fact(n) fmn = fact(m - n) f = fm / (fn * fmn) Form1.Print "f="; f End Sub
7.2 Sub过程
7.2.1 自定义过程(Sub过程)
<局部变量或常数定义> <语句组> [Exit Sub]
<语句组> End Sub 子过程的定义形式如下: [Public|Private][Static] Sub 子过程名([形参表]) Sub过程体
说明:(1)子过程名:命名规则与变量名规则相同。
Sub子过程
Private Sub Swap(x%,y%) Dim temp% Temp=X X=Y
Y=Temp
End Sub
☆☆ 第7章 过程
例:编程,将数组中各元素按值从大到小排列,要求将数组的 排序编写为sub过程。 Private sub sort(a() as single,n as byte) dim I as byte ,j as byte,k as byte,temp as single for I=1 to n-1 k=I for j=I+1 to n if a(j)>a(k) then k=j next j temp=a(k) : a(k)=a(i) : a(i)=temp Next I End sub 思考:如何调用,实现数组排序? ☆☆ 第7章 过程
☆☆ 第7章 过程
7.2.4 Sub过程调用的执行过程:
主程序
Sub command1_click() Dim a%,b% a=val(inputbox( “a=“)) 调用出口 b=val(inputbox(“b=“)) print “a=“;a,”b=“,b call swap(a,b) print “a=“;a,”b=“,b 返回入口 End Sub
(8)Print (9“3!+7!=”;s )
End sub
☆☆ 第7章 过程
例: 编写判断一个整数是不是素数写函数过程。如果给定的 整数是素数,则返回逻辑值True,否则返回False
Private Function Prime(n As Integer) As Boolean Dim k%,Yes As Boolean Yes=True For k=2 to int(sqr(n)) IF n mod k =0 then Yes=False Exit For endif Next k Prime=Yes ‘ 给函数名赋值,作为函数的返回值 End Function
(2) 格式二: Call 子过程名(参数列表)
☆☆ 第7章 过程
7.2.2 Sub过程的调用(2)
(3)当参数是数组时,形参与实参在参数声明时应省略其维
数,但括号不能省。
(4)调用子过程的形式有两种,用Call关键字时,实参必须 加圆括号括起,反之则实参之间用“,”分隔。如:
Swap a,b
Call Swap(a,b)
实际参数是指在调用 Sub 或 Function 过程时,写入子过程 名或函数名后括号内的参数,其作用是将它们的数据(数值 或地址)传送给Sub或Function过程与其对应的形参变量。 实参可由常量、表达式、有效的变量名、数组名(后加左、 右括号,如A())组成,实参表中各参数用逗号分隔。 ☆☆ 第7章 过程
子过程名不返回值,而是通过形参与实参的传递得到结果, 调用时可返回多个值。 ☆☆ 第7章 过程
7.2.1 自定义过程(Sub过程)
( 2 )形式参数列表:形式参数通常简称“形参”,仅 表示形参的类型、个数、位置,定义时是无值的,只有在过 程被调用时,虚实参结合后才获得相应的值。 (3)过程可以无形式参数,但括号不能省。 (4)参数的定义形式: [ByVal|ByRef]变量名[( )][As 类型][,…], ByVal表示当该过程被调用时,参数是按值传递的;缺 省或ByRef表示当该过程被调用时,参数是按地址传递的。
7.3Function过程
Visual Basic函数分为内部函数和外部函数,
外部函数是用户根据需要用Function关键字定义 的函数过程,与子过程不同的是函数过程将返回
一个值 。
☆☆ 第7章 过程
7.3.1 函数过程(Function过程)的定义
函数返回值类型
[Public|Private][Static]Function 函数名 ([< 参数列 表>])[As<类型>] <局部变量或常数定义> <语句块> [函数名=返回值] 函数体 [Exit Function] <语句块> [函数名=返回值] End Function