null第8章第8章过 程本章要点:
Function过程▲
Sub过程▲
参数的传递*
过程的嵌套调用
变量的作用域与生存期*3.5 常用内部函数3.5 常用内部函数调用形式: 函数名[(<参数列表>)]
三个概念:函数名,参数,返回值
参数或返回值对应各自的数据类型Abs(-4)Left(“ABC”,2)null过程: 完成一段独立功能,可供其他过程使用(调用)。过程包括子程序和函数。
过程调用: 调用者、被调用者调用过程:
调用Sprg1
调用Sprg1
调用Sprg2
过程: Sprg1过程: Sprg2nullFunction和Sub的区别:
Sub没有返回值
Function有且仅有一个返回值过程分类: Sub子程序Function过程内部子程序(
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
)
事件子程序(按钮事件)
自定义子程序 内部函数
自定义函数null例1 实现Abs函数Private Function Abs( x as double ) As Double
If x<0 Then
x = -x
Else
End If
Abs = x
End Function8.1 Function过程(函数过程)8.1 Function过程(函数过程)8.1.1 Function过程的定义
1. Function过程的格式
Private Function <函数过程名> ([<形参表>]) [As <类型>]
[<语句组>]
<函数过程名> = <表达式>
[Exit Function]
[<语句组>]
End Function形参表:
<变量名1> [As <类型>], <变量名2> [As <类型>]null8.1.2 Function过程的调用1. 调用位置:
直接在表达式中调用。
2. 调用格式:
<函数过程名>([<实参表>])
其中,<实参表>:
常量、变量或表达式
各参数之间用逗号分隔
如果是数组,在数组名之后要跟一对空括号。null例2 实现Sum函数,对两个数求和Private Function Sum( x as double , _
y as double ) As Double
Dim t as Double
t = x+y
Sum = t
End Functionnull例3 编写一个函数,计算下面表达式的值。Function F(X As Double, _
Y As Double, _
Z As Double) As Double
F = Sqr(Abs(X ^ 3 + Y ^ 3 + Z ^ 3))
End FunctionFunction F(X, Y, Z)
F = Sqr(Abs(X ^ 3 + Y ^ 3 + Z ^ 3))
End Functionnull例4 实现Sgn函数Private Function Sgn( x as double ) As Long
If x<0 Then
Sgn = -1
ElseIf x>0 Then
Sgn=1
Else
Sgn=0
End If
End Functionnull求N! (N!=1×2 ×3 ×…… ×N)Private Sub Command1_Click()
Dim N As Integer, I As Integer, F As Long
N = Val(Text1.Text)
F = 1 ' F用于保存阶乘值
For I = 1 To N
F = F * I
Next I
Label1.Caption = Str(F)
End SubPrivate Sub Command1_Click()
Dim N As Integer, I As Integer, F As Long
N = Val(Text1.Text)
Label1.Caption = Str(Fact(N))
End Subnull例5 编写一个计算n!的函数。Private Function Fact( N as Long ) As Long
Dim I As Integer, F As Long
F = 1 ' F用于保存阶乘值
For I = 1 To N
F = F * I
Next I
Fact = F ' 给函数过程名赋值
End Functionnull例6 从键盘任意输入一个整数,然后调用计算 阶乘的函数求该整数的阶乘值。设计界面运行界面nullPrivate Sub Command1_Click()
Dim X As Integer
X = Val(Text1.Text)
Label2.Caption=Str(X) & "的阶乘数为:"
' 使用Fact(X)调用函数过程
Label3.Caption = Str(Fact(X))
End Subnull例7 利用Fact函数计算阶乘,求组合数。设计界面如下图。null' “=”按钮的Click事件过程
Private Sub Command1_Click()
Dim M As Integer, N As Integer, C As Double
N = Val(Text1.Text)
M = Val(Text2.Text)
' 调用Fact函数求各阶乘值
C = Fact(M) / (Fact(N) * (Fact(M - N)))
Text3.Text = Str(c)
End Subnull【例8】Private Sub Command1_Click()
Dim I As Long
Dim t As Long
Dim Sum As Long
t = 1
Sum = 0
For I =1 To 20
t = t * I
Sum = Sum + t
Next
Msgbox Str(Sum)
End SubPrivate Sub Command1_Click()
Dim I As Long
Dim t As Long
Dim Sum As Long
Sum = 0
For I =1 To 20
t=1
For J=1 To I
t = t *J
Next
Sum = Sum + t
Next
Msgbox Str(Sum)
End Subnull【例8】Private Sub Command1_Click()
Dim I As Long
Dim t As Long
Dim Sum As Long
Sum = 0
For I =1 To 20
t = Fact(I)
Sum = Sum + t
Next
Msgbox Str(Sum)
End SubPrivate Sub Command1_Click()
Dim I As Long
Dim t As Long
Dim Sum As Long
Sum = 0
For I =1 To 20
t=1
For J=1 To I
t = t *J
Next
Sum = Sum + t
Next
Msgbox Str(Sum)
End Subnull【例9】求1+(1+2)+(1+2+3)+…(1+2+3+…+100), Private Sub Command1_Click()
Dim I As Long
Dim t As Long
Dim Sum As Long
Sum = 0
For I =1 To 100
t=Acc(I)
Sum = Sum + t
Next
Msgbox Str(Sum)
End SubPrivate Function Acc(X As Long) _ As Long
Dim I As Long
Dim Sum As Long
Sum = 0
For I =1 To X
Sum = Sum + I
Next
Acc = Sum
End Functionnull【例9】求1+(1+2)+(1+2+3)+…(1+2+3+…+100), Private Sub Command1_Click()
Dim I As Long, J As Long
Dim t As Long
Dim Sum As Double
Sum = 0
For I =1 To 100
t=0
For J= 1 To I
t = t+J
Next
Sum = Sum + t
Next
Msgbox Str(Sum)
End SubPrivate Sub Command1_Click()
Dim I As Long
Dim t As Long
Dim Sum As Double
t = 0
Sum = 0
For I =1 To 100
t = t + I
Sum = Sum + t
Next
Msgbox Str(Sum)
End Sub8.2 Sub过程(子程序)
8.2.1 Sub过程的定义8.2 Sub过程(子程序)
8.2.1 Sub过程的定义1. Sub过程的格式
Private Sub <子程序名> ([<形参表>])
[<语句组>]
[Exit Sub]
[<语句组>]
End Function形参表:
<变量名1> [As <类型>], <变量名2> [As <类型>]1. Function过程的格式
Private Function <函数过程名> ([<形参表>]) [As <类型>]
[<语句组>]
<函数过程名> = <表达式>
[Exit Function]
[<语句组>]
End Functionnull8.2.2 Sub过程的调用说明:
(1) <过程名>: 要调用的Sub过程名。
(2) <实参表>: 可以是常量、变量或表达式,各参数之间用逗号分隔。如果是数组参数,则要在数组名之后跟一对空括号。
(3) 用Call语句调用一个Sub过程时,如果过程本身没有参数,则省略<实参表>和括号。
(4) 格式二省略了Call关键字,同时<实参表>两边也不能带括号。格式一: Call <过程名>[(<实参表>)]
格式二: <过程名> [<实参表>]null【例10】用双重循环在文本框中输出下面的图形 *
**
***
****
*****For i = 1 To 5
For j =1 To I
Print “*”;
Next j
Print vbCrLf;
Next iFor i = 1 To 5
PrintStar i
Print vbCrLf;
Next inull【例10】用双重循环在文本框中输出下面的图形 *
**
***
****
*****For i = 1 To 5
PrintStar i
Print vbCrLf;
Next iPrivate Sub PrintStar(X as Long)
For k = 1 To X
Print "*";
Next k
End Subnull【例11】用双重循环在文本框中输出下面的图形 *
***
*****
*******
*********For i = 1 To 5
For j = 1 To 5-i
Print " ";
Next j
For j = 1 To 2*i-1
Print "*";
Next j
Print vbCrLf;
Next inull【例11 】用双重循环在文本框中输出下面的图形 *
***
*****
*******
*********For i = 1 To 5
PrintSpace 5-i
PrintStar 2*i-1
Print vbCrLf;
Next iPrivate Sub PrintSpace(X as Long)
For k = 1 To X
Print " ";
Next k
End SubPrivate Sub PrintStar(X as Long)
For k = 1 To X
Print "*";
Next k
End Subnull【例11 】用双重循环在文本框中输出下面的图形 *
***
*****
*******
*********For i = 1 To 5
PrintChar 5-i, “ ”
PrintChar 2*i-1, “*”
Print vbCrLf;
Next iPrivate Sub PrintChar(X as Long, C as String)
For k = 1 To X
Print C
Next k
End Sub8.3 参数的传递8.3 参数的传递 参数传递是指调用过程与被调用过程之间的一种数据传递方法。
数据传递是通过形参和实参进行传递的。
数据的传递方式可以是单向的,也可以是双向的。分别称为按值传递和按地址传递。 8.3.1 形参和实参8.3.1 形参和实参 形参: 出现在Sub或Function定义语句中。
实参: 出现在调用程序中。
例如,定义如下一个过程:
Sub SubTest(n As Integer,Sum As Single)
…
End Sub
调用语句:
SubTest a , s 形参实参null说明:
一般情况下,形参表与实参表中对应参数个数、类型、位置顺序必须一一对应(除非使用关键字Optional或ParamArray对形参进行了约束)
形参表中的参数可以是:
合法 变量名、数组名()
实参表中的参数可以是:
常量、变量、表达式、数组名()
形参与实参的结合有两种方式:
按值传递和按地址传递。8.3.2 按值传递和按地址传递8.3.2 按值传递和按地址传递1. 按值传递
实参把其值传递给形参。
数据的传递是单向的。
改变形参的值不会改变实参的值
2. 按地址传递(缺省行为)
实指将实参的地址传给形参,使形参和实参具有相同地址,即形参与实参共享同一存储单元。
数据的传递是双向的。
改变形参的值会改变实参的值nullPrivate Sub SS(X, Y, Z)
X = X + 1: Y = Y + 1: Z = Z + 1
Print X, Y, Z
End Sub
Private Sub Command1_Click()
A = 1: B = 2: C = 3
SS A, B, C
Print A, B, C
End Sub例12 读程序null按值传递: 参数用ByVal修饰
按地址传递(缺省行为) : 参数用ByRef修饰Private Sub SS (ByVal X, ByRef Y, Z)
X = X + 1: Y = Y + 1: Z = Z + 1
Print X, Y, Z
End Sub
Private Sub Command1_Click()
A = 1: B = 2: C = 3
SS A, B, C
Print A, B, C
End Subnull按地址传递(缺省行为) : 实参为变量才有意义Private Sub SS(ByRef X, Y)
X = X + 1: Y = Y + 1
Print X, Y
End Sub
Private Sub Command1_Click()
A = 1: B = -2
SS A+1, abs(B)
Print A, B
SS 30, B
Print A, B
End Subnull例7 利用Fact函数计算阶乘,求组合数。设计界面如下图。nullPrivate Sub Command1_Click()
Dim M As Integer, N As Integer, C As Double
N = Val(Text1.Text)
M = Val(Text2.Text)
' 调用Fact函数求各阶乘值
C = Fact(M) / (Fact(N) * (Fact(M - N)))
Text3.Text = Str(c)
End SubPrivate Function Fact( N as Long ) As Long
Dim I As Integer, F As Long
F = 1 ' F用于保存阶乘值
For I = 1 To N
F = F * I
Next I
Fact = F ' 给函数过程名赋值
End FunctionnullPrivate Sub Command1_Click()
Dim M As Integer, N As Integer, C As Double
Dim t1 As Long, t2 As Long, t3 As Long
N = Val(Text1.Text)
M = Val(Text2.Text)
‘ 调用Fact子程序求各阶乘值
Fact M, t1
Fact M, t2
Fact M, t3
C = t1 / (t2 * t3)
Text3.Text = Str(c)
End SubPrivate Sub Fact( N , F )
Dim I As Integer
F = 1 ' F用于保存阶乘值
For I = 1 To N
F = F * I
Next I
End Subnull【例9】求1+(1+2)+(1+2+3)+…(1+2+3+…+100), Private Sub Command1_Click()
Dim I As Long
Dim t As Long
Dim Sum As Long
Sum = 0
For I =1 To 100
t=Acc(I)
Sum = Sum + t
Next
Msgbox Str(Sum)
End SubPrivate Function Acc(X As Long) _ As Long
Dim I As Long
Dim Sum As Long
Sum = 0
For I =1 To X
Sum = Sum + I
Next
Acc = Sum
End Functionnull【例9】求1+(1+2)+(1+2+3)+…(1+2+3+…+100), Private Sub Command1_Click()
Dim I As Long
Dim t As Long
Dim Sum As Long
Sum = 0
For I =1 To 100
Acc I, t
Sum = Sum + t
Next
Msgbox Str(Sum)
End SubPrivate Sub Acc(X As Long, _
Y as Long)
Dim I As Long
Dim Sum As Long
Sum = 0
For I =1 To X
Sum = Sum + I
Next
Y = Sum
End Subnull【例11 】用双重循环在文本框中输出下面的图形 *
***
*****
*******
*********For i = 1 To 5
PrintChar 5-i, “ ”
PrintChar 2*i-1, “*”
Print vbCrLf;
Next iPrivate Sub PrintChar(X as Long, C as String)
For k = 1 To X
Print C
Next k
End Subnull【例11 】用双重循环在文本框中输出下面的图形 *
***
*****
*******
*********For i = 1 To 5
PrintChar(5-i, “ ”)
PrintChar(2*i-1, “*”)
Print vbCrLf;
Next iPrivate Function PrintChar(X as Long, C as String)
For k = 1 To X
Print C
Next k
End Functionnull【例13】用inputbox函数输入3个整数,找出其中最大值和最小值,用msgbox函数输出nullPrivate Sub Form_Click()
Dim a As Long, b As Long, c As Long
a = Val(InputBox("请输入第一个数"))
b = Val(InputBox("请输入第二个数"))
c = Val(InputBox("请输入第三个数"))
If a < b Then
t = a
a = b
b = t
End If
If a < c Then
t = a
a = c
c = t
End If If b < c Then
t = b
b = c
c = t
End If
MsgBox "最 大 数 是:" & Str(a)
MsgBox "最 小 数 是:" & Str(c)
End SubnullPrivate Sub Form_Click()
Dim a As Long, b As Long, c As Long
a = Val(InputBox("请输入第一个数"))
b = Val(InputBox("请输入第二个数"))
c = Val(InputBox("请输入第三个数"))
If a < b Then
Swap(a,b)
End If
If a < c Then
Swap(a,c)
End If
If b < c Then
Swap(b,c)
End If
MsgBox "最 大 数 是:" & Str(a)
MsgBox "最 小 数 是:" & Str(c)
End Sub
Private Sub Swap (A As Long, _
B As Long)
Dim t As Long
t=A : A=B : B=t
End SubnullPrivate Sub Form_Click()
Dim a As Long, b As Long, c As Long
a = Val(InputBox("请输入第一个数"))
b = Val(InputBox("请输入第二个数"))
c = Val(InputBox("请输入第三个数"))
Swap(a,b)
Swap(a,c)
Swap(b,c)
MsgBox "最 大 数 是:" & Str(a)
MsgBox "最 小 数 是:" & Str(c)
End Sub
Private Sub Swap (A As Long, _
B As Long)
Dim t As Long
If A
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
决定显示哪个窗体;有时应用程序根本就不需要加载窗体(比如一些监控程序)。为此,可以在标准模块中编写一个main过程,作为应用程序的入口。
定义sub main过程为启动程序的
步骤
新产品开发流程的步骤课题研究的五个步骤成本核算步骤微型课题研究步骤数控铣床操作步骤
:
“工程” →“工程属性” →选择“通用”选项卡→在“启动对象”下拉列表框中选择“Sub Main”。8.6.5 过程的作用域8.6.5 过程的作用域 过程的建立位置不同,允许被访问的范围也不同。
作用域: 模块级、全局级
1. 模块级过程: 在过程前如果加Private关键字,则这种过程只能被其所在的模块中的其他过程所调用。
2. 全局过程: 在过程前如果加Public关键字(或省略),则这种过程可以被其他模块中的过程所调用。
调用格式: 模块名.过程名(参数表)
注意:标准模块中的全局过程名如果唯一,则调用时可以省略模块名null例:设窗体Form1中有按钮: Command1、 Command2
Public Sub sub1() ' sub1为全局过程
MsgBox ("这是窗体Form1中的过程")
End Sub
Private Sub Command1_Click()
Call sub1
End Sub
Private Sub Command2_Click()
Form2.Show
End Sub添加标准模块Module1 ,编写以下过程:
Public Sub sub2() ' sub2为全局过程
MsgBox ("这是标准模块中的过程sub2")
End Subnull设窗体Form2中有按钮: Command1 、 Command2
Private Sub Command1_Click()
Call Form1.sub1
End Sub
Private Sub Command2_Click()
Call Module1.sub2
End Sub8.7 变量的作用域与生存期8.7 变量的作用域与生存期 变量的作用域: 指变量的有效范围。
变量的生存期: 指变量的作用时间。
8.7.1 变量的作用域
将变量分为: 局部变量
模块级变量
全局变量null1. 局部变量
• 声明
Dim A As Integer ' A每次执行过程时被初始化
Static C As Single ' C在应用程序执行期间保持不变
• 作用范围
仅在声明的过程中起作用
其他过程中即使有同名变量,也不是指同一变量。null例:
Sub S()
X = 1
Y = 2
Z = X + Y
Print X, Y, Z
End Sub
Private Sub C1_Click()
X = 2
Y = 3
Z = X + Y
Call S
Print X, Y, Z
End Sub单击C1后运行结果:
1 2 3
2 3 5null2. 模块级变量
• 声明
在模块的通用声明段中用以下方法声明的变量。
Private ' 在模块运行时被初始化
Dim ' 在模块运行时被初始化
• 作用范围
在该模块的所有过程中都起作用
其他模块不能访问这些变量null例:
Dim Z As Integer
Sub S()
Z = Z + 2
Print Z
End Sub
Private Sub C1_Click()
Z = Z + 2
Call S
Print Z
End Sub第一次单击C1结果:
4
4
第二次单击C1结果:
8
8
第三次单击C1结果:
12
12null例:
Dim Z As Integer
Sub S()
Dim Z
Z = Z + 2
Print Z
End Sub
Private Sub C1_Click()
Z = Z + 2
Call S
Print Z
End Sub第一次单击C1结果:
2
2
第二次单击C1结果:
2
4
第三次单击C1结果:
2
6null3. 全局变量
• 声明
在模块的通用声明段中用以下方法声明的变量
Public ' 应用程序运行时被初始化
• 作用范围: 应用程序的所有过程null8.7.2 变量的生存期
静态变量
在应用程序执行期间初始化一次
模块级变量和全局变量都是静态的
Static修饰的过程中所有局部变量都是静态的
Static修饰的局部变量都是静态的
动态变量
Dim修饰的局部变量,过程每次运行会被初始化 null 单击按钮打印结果:
55
110 Static Sub SS1() ' 局部变量I,S为静态变量
For I = 1 To 10
S = S + I
Next I
Print S
End Sub
Private Sub Command1_Click()
Call SS1
Call SS1
End Subnull例:
Sub S()
Static Z As Integer
Z = Z + 2
Print Z
End Sub
Private Sub C1_Click()
Dim Z As Integer
Z = Z + 2
Call S
Print Z
End Sub第一次单击C1结果:
2
2
第二次单击C1结果:
4
2
第三次单击C1结果:
6
2本章小结 本章小结 1. 函数过程的定义和调用
定义:
[Public | Private ] [Static] Function <函数名> [(<形参表>)] [As <类型>]
……
[函数名 =表达式]
……
End Function
形参表:变量、数组名()
调 用: 函数名(<实参表>)
出现在表达式可以出现的位置null2. Sub过程的定义和调用
定义:
[Private | Public ] [Static] Sub <过程名>([<形参表>])
……
End Sub
调用:
(1)Call <过程名>([<实参表>])
(2)<过程名> [<实参表>]
注意: Sub过程定义与调用与函数过程定义与调用的区别null3. 过程之间的参数传递
按值传递: 实参为常数、表达式;
实参为变量,形参为 ByVal 变量
按地址传递: 实参为变量、数组;形参用 ByRef 定义的变量、数组(或省略ByRef)
4. 过程的嵌套调用
*5. 过程的递归调用
6. VB工程结构
窗体模块(Form) (文件扩展名.frm)
标准模块(Module) (文件扩展名.bas)
Sub Main过程
类模块(Class) (文件扩展名.cls)null7. 过程的作用域
模块级过程; 全局级过程
8. 变量的作用域
局部变量(过程级); 模块级变量;全局变量
9. 变量的生存期
动态变量; 静态变量