VBA的过程(Procedure)
VBA中的过程(Procedure)有两种,它们都是一个可以获取参数、执行一系列语句、以及改变其参数的值的独立过程。
- 一种叫函数(Function) '可调用代码block
- 一种叫子程序(Subroutine) '可执行代码block
一 函数和过程的相同点
1.1 sub 和 function的相同点
- sub和function ,从代码本身本身差别不大,都是把代码封装的手段
- 都是封装的独立代码block
- 它们都是一个可以获取参数、执行一系列语句、以及改变其参数的值的独立过程
1.2 sub和function的 声明范围
- sub sub_name() 就相当于 public sub sub_name()
- function function_name()就相当于public function function_name()
- 也就是说,默认 sub function 都是跨模块级的,默认在本脚本文件-模块内可调用
- 但如果,特别加上了 private 就不是了,在模块内都是私有了。
- 总结
- 默认和public都是跨模块生效的
- private 是本模块内有效
1.3 sub的范围和sub内的变量范围不一回事
- sub / function内的变量,默认只在函数内起作用,除非单独对变量做其他声明。
- 他们的声明是独立的,两者没关系。
1.4 VBA可以执行一个代码脚本(包含多个sub和func)吗?可以
- 方法1
- 对象上挂的脚本,是触发后自动执行的,脚本内的所有内容都可以
- 用对象的事件触发逻辑,可以执行对象挂的脚本里的事件代码。
- 方法2
- 理论上一个sub的主过程,调用其他sub和fuction也是没问题的
- 写那种所有内容放一起的一个sub,也是可以的,只是不如分函数 sub写的好
1.5 函数和过程的调用---无参数时不能带括号!---需要使用返回值时带括号
- 调用函数或过程,如果需要使用返回值,则带括号
- 如果只是执行一个过程,不需要调用返回值,不带括号
- 如果使用call 语句,有参数时,一般都要带括号
- 直接调用---实测出来只能无参数和1个参数
- subname
- Functionname
- Python一般调用函数,无论是否有参数,都带括号 func1() 分 func1(a,b)这个是返回值return结果
- python 里除非故意用函数名,这个是调用函数名?变量?
- 用call调用
- 实测出来,是如果带2个参数,必须用call----避免和数组写法混淆
- call subname
- call subname(i,j)
- call Functionname
- call Functionname(x,y)
Sub test_ponyma1()
sub2 (11)
Call sub1(101, 99) '必须加call,因为不加call这么调用,sub1(101, 99)会和函数搞混
'Debug.Print sub2(12)
Debug.Print func1(222, 333)
End Sub
Sub sub1(a, b)
Debug.Print a + b
End Sub
Function func1(x, y)
func1 = x + y
End Function
Sub sub2(a)
Debug.Print a * a
End Sub
1.6 调用 sub 或 function 会返回吗?一定返回之前调用的位置!
调用其他函数或过程后,实测是一定返回执行后面的语句
Sub sub_main()
Call func1(3, 5)
Debug.Print ("调用函数返回了吗")
End Sub
Function func1(a, b)
func1 = a + b
Debug.Print func1
End Function
- 而oop里一般最小的是 函数 或类/对象
- 一般调用其他内容,都默认会返回
特例?
- Dos纯面向过程的
- 里面不会有函数名等,独立单元: 行-----> 文件/脚本
- 如goto 就不再返回了吧?
- Filename.bat 不返回?
- Call filename.bat 会返回
- Start filename.bat 新窗口调用,不影响本程序执行
二 sub 和function的不同点(可执行代码 vs 调用代码)
- 功能差别较大
- sub是一个最小可执行代码单位,而function是1个“调用代码”的最小可执行单位
- sub可以被直接被手动执行,函数不可以
- 函数一定有返回值(如果不设置,默认为none),而sub没有返回值
- 代码执行时,按顺序执行到sub就开始执行sub 而执行到函数那并不执行,而是函数调用时才执
- 与 Function 过程不同的是:带返回值的 Sub 过程不能用于表达式。
特别注意点
- 如果过程带参数的话,也是不能被直接执行的,只能被调用才可以执行。
- 比如这样一个过程 sub test1(x,y)
- 直接运行里是看不到 这个过程名的,因为有参数的关系。
三 过程 sub
3.1 过程的基本语法
- 宏就是过程
- sub sub_name()
- end sub
- 过程名不能被赋值,函数名是可以的
- 过程也可以被调用
Sub s1()
For i = 1 To 3
For j = 1 To 5
Sum = i + j
Debug.Print Sum
Next j
Next i
s1 = Sum '试验,这里会报错,没有函数或变量,也就是sub 不能使用=
End Sub
3.2 过程的调用和参数传递
过程之间可以互相调用
过程和函数之间呢?
Sub s1(i)
Sum = i + 10
Debug.Print Sum
End Sub
Sub s2()
s1 (10)
End Sub
特殊调用方式 gosub 和 return
- 语法结构1
- gosub subname1
- subname1:
- return '返回之前gosub位置的下一句
3.3 调用过程---call sub 多个参数传递?
- 如果直接调用 sub_name,单个参数传递可以,多个参数就报错
- 如果用 call sub_name,可以带多个参数
Sub s1(i, j)
Sum = i + j
Debug.Print Sum
End Sub
Sub s2()
s1 (1,3) '2个参数可以定义,但调用时报错,不知道为啥,说缺少= ?
End Sub
Sub s1(i, j)
Sum = i + j
Debug.Print Sum
End Sub
Sub s2()
Call s1(1, 3)
End Sub
搜到一个和我遇到相同的问题---我猜想主要原因,在于不要和数组的写法混淆
https://zhidao.baidu.com/question/1381664585785887220.html
是的,那是我3.3第2段的备注写错了
实际上是这样的
实测 call func 这样的调用,参数必须带括号
而 func 直接这样的写法,多参数不能带括号,但特例是1个参数可带括号或不带
3.4 sub 之间传递参数,和封闭的函数一样,需要用模块级变量才行
- sub内部的变量值,无法传递给其他过程
- 需要设置为全局变量 public
- 如果要读到其他过程里的变量变化,需要先运行其他过程
Public a
Public b
Sub s3()
a = 10
b = 20
End Sub
Sub s4()
Sum = a + b
Debug.Print Sum
End Sub
四 函数的用法
4.1 函数的基本语法
- 函数无法直接执行,VBE里无法直接当宏调用!!!
- 顺序执行的代码,执行到函数定义那只会自动跳过,函数调用时才真正执行
- 函数都有返回值? 一定,没有的话也会返回默认的none
- 函数的语法
- function function_name()
- end function
- 调用函数或者过程,一定要 括号,否则谁知道你是 变量,还是函数,过程
Sub sub_main()
func1
End Sub
Function func1()
Debug.Print ("这个函数没有返回值")
End Function
- VBA的函数,设置返回值的方法
- 其他语法函数的最后有 return,return返回值,return后的lines 被称为无效代码,VBA里不用return函数返回值
- VBA的方法:函数名= 赋值
Sub sub_main()
Call func1(3, 5)
End Sub
Function func1(a, b)
func1 = a + b
Debug.Print func1
End Function
4.2 函数的返回和调用
- 遇到和sub通用的问题,一个参数可以直接 f1()
- 需要多个参数,必须用call f1()
Function f1(a, b)
Sum = a + b
f1 = Sum
Debug.Print f1
End Function
Function f2()
Call f1(5, 6)
End Function
Sub s1()
Call f2
End Sub
函数名= 可以直接赋值,不需要中转变量
Function f1(a, b)
f1 = a + b
Debug.Print f1
End Function
Function f2()
Call f1(5, 6)
End Function
Sub s1()
Call f2
End Sub
4.3 VBA的自定义函数,可以直接在excel里作为自定义函数使用
- 只能是模块里的 函数 才可以在excel里被直接使用,也就是放在对象脚本里的无法使用
- 使用方法和普通函数一样 =func(b1,b2)
Function func1(a, b)
func1 = a + b
Debug.Print func1
End Function
Function func2()
Cells(1, 3).Value = 111
End Function
五 return 在VBA的特殊意义
- VBA里,return不是用于函数返回值的,而是配合 gosub return使用的
- gosub 和 goto 区别,就是 gosub 带 return
- 语法结构1
- gosub subname1
- subname1:
- return '返回之前gosub位置的下一句
- 语法结构2
- goto label1
- label1: