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 就不是了,在模块内都是私有了。
  • 总结
  1. 默认和public都是跨模块生效的
  2. 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

vb.net过程名与参数列表 vba过程_调用函数

 

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 调用代码)

  • 功能差别较大
  1. sub是一个最小可执行代码单位,而function是1个“调用代码”的最小可执行单位
  2. sub可以被直接被手动执行,函数不可以
  3. 函数一定有返回值(如果不设置,默认为none),而sub没有返回值
  4. 代码执行时,按顺序执行到sub就开始执行sub 而执行到函数那并不执行,而是函数调用时才执
  5. 与 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: