过程(sub)
无参数过程
Sub SayHello()
Msgbox "Hello World"
End Sub
有参数过程
'声明一个过程
Sub SayHello(name As String)
Msgbox "Hello" & name
End Sub
'在另一个过程,调用上述过程,调用时,提供一个实际的 name 参数
Sub MyCode()
SayHello "World 2"
End Sub
调用子过程
'主入口
Sub Main()
Dim name As String
Dim title As String
name = "Zhang san"
title = "CEO"
WriteInfo name & "," & title
End Sub
'子过程,在工作表A1单元格填写信息
Sub WriteInfo(info As String)
Range("A1") = info
End Sub
从代码可读性的角度来看,这里推荐使用关键词
Call
调用子过程
点击查看代码
Sub Main()
Call MySub
End Sub
Sub MySub()
'代码
End Sub
函数(Function)
VBA 函数与 VBA 过程很相似,除了使用的关键词外,主要区别是,函数可以返回值。
无参数函数
实例:
Function RandomLogic() As Boolean
RandomLogic = Rnd() > 0.5
End Function
语法:
Function [函数名]() As [返回值类型]
语句...
[函数名] = [返回值]
End Function
有参数函数
实例:
Function Add2Number(num1 As Double, num2 As Double) As Double
Add2Number = num1 + num2
End Function
语法:
Function [函数名]([变量名1] As [数据类型1],...[变量名n] As [数据类型n]) As [返回值类型]
语句...
[函数名] = [返回值]
End Function
调用函数
调用有返回值的函数时,一般有两种情形:
- 一是,使用一个变量存储函数返回的值
- 二是,函数返回的值参与其他计算
实例:
Sub Main()
'使用变量存储函数返回的值
Dim result1 As Double
result1 = Add(12, 345)
'函数返回值继续参与计算
Dim result2 As Double
result2 = RandNum + Add(12, 345)
End Sub
'函数:返回一个随机值
Function RandNum()
RandNum = Rnd * 100
End Function
'函数:返回两数的和
Function Add(num1 As Double, num2 As Double) As Double
Add = num1 + num2
End Function
过程sub和函数的不同:函数可以有返回值(函数可以不返回值,这种情况其作用与子过程相同。因此建议,不需要返回值时,直接使用子过程代替函数。)
ByVal传值和ByRef传地址
VBA 中定义过程或函数时,如果需要传递变量,需指定参数的传递类型,包括以下 2 类:
ByVal
:传递参数的值
ByRef
:传递参数的引用
两种传递类型的说明和区别如下:
ByVal
:传递变量时,复制一份该变量,传入过程或函数。在过程和函数内部对该变量进行修改,只对该副本有效,对上一级过程(父过程)的变量没有影响。ByRef
:传递变量时,将该变量的引用地址传入过程或函数。传入引用地址意味着,在过程或函数内部对其修改时,也会影响上一级过程(父过程)中的变量的值。
ByVal 实例
Sub Test()
Dim msg As String
msg = "main"
TestSub1 msg
Msgbox msg
End Sub
'ByVal 传递类型
Sub TestSub1(ByVal msg As String)
msg = "val"
End Sub
ByRef 实例
Sub Test()
Dim msg As String
msg = "main"
TestSub2 msg
MsgBox msg
End Sub
'ByRef 传递类型
Sub TestSub2(ByRef msg As String)
msg = "ref"
End Sub
默认情况下,当省略传递类型时,默认值是 ByRef,因此以下两种写法是等效的。
'指定 ByRef 传递类型
Sub TestSub1(ByRef msg As String)
End Sub
'省略传递类型
Sub TestSub1(msg As String)
End Sub
变量作用域
- 过程作用域
- 模块作用域
- 工程作用域
1、过程作用域
在过程或函数内部声明的变量,只有在当前过程或函数内被使用。
2、模块作用域
一个模块中,在任何一个过程和函数外面,使用关键词 Private 或 Dim 声明的变量,称之为模块变量,其作用域是当前模块。例如,
Dim guest As String
Sub Test()
Dim message As String
guest = "张三"
message = "你好"
MsgBox message & "! " & guest
End Sub
3、工程作用域
Excel VBA 中,一个 Excel 工作簿是一个 VBA 工程。与之对应,工程作用域表示变量在当前工程中的模块、Excel 对象、用户窗体、类模块中均可以被使用。
工程级别变量,在所在模块顶部声明 Option Private Module 修饰语句前提下,在过程或函数外面,使用关键词 Public 声明的变量,其作用域是当前工程。例如,
Option Private Module
Public guest As String
Sub Test()
Dim message As String
guest = "张三"
message = "你好"
MsgBox message & "! " & guest
End Sub
标签:Function,VBA,End,函数,String,msg,过程,Sub
From: https://www.cnblogs.com/marshban/p/18281246