【不带变量调用】
一般在VBA里,我们调用某个过程,都会用Call语句,先说说用Call语句直接调用某个过程的方法
例如你有一个过程aa如下:
Sub aa()
Msgbox "喵喵", 64
End Sub
那么调用这个过程的方法为:
Sub Call_aa_01()
aa
End Sub
这里,call语句里的call是可以省略的,但为了令代码更清晰,一般程序员会喜欢加上去,以表示aa是一个过程:
Sub Call_aa_02()
Call aa
End Sub
如果aa是一个带有参数的过程,如:
Sub aa(str As String)
MsgBox str, 64
End Sub
那么在用call语句调用的时候,就要这样(不带Call):
Sub Call_aa_03()
aa "喵喵"
End Sub
或者这样(带Call):
Sub Call_aa_04()
Call aa ("喵喵")
End Sub
这里值得注意的是,调用过程的名称如果在整个过程里不是唯一的,即其他模块也有相同名称的过程,那么在调用其他模块里的同名过程时,需要加上模块的名称,如模块1和模块2同时存在过程aa,在模块1里想调用模块2的过程aa,那么必须加上模块2做前缀,否则只会调用同模块下的aa:
Sub Call_aa_05()
Call 模块2.aa
End Sub
如果aa是在另外一个工作簿里,需要先在VBE-工具-引用,添加引用的工作簿(通常会显示该工作簿的工程名称,如VBAProject1;有多个工程相同时应把自身的工程名删除后再添加personal的工程名),再加上工程名加以调用,这里要注意,相互调用的工作簿是要打开的,而且工程名称不能重复,不然不能引用。如:
Sub call_aa_06()
Call VBAProject1.模块2.aa
End Sub
同时,有多个过程aa时,一样需要加上模块名称,只有一个的话模块名称可省略:
Sub call_aa_07()
Call VBAProject1.aa
End Sub
【带变量调用】
好了,以上是传统的调用方法,如果过程名称aa是一个变量呢?我们注意到用Call语句,后面的过程名称不可以是变量,例如以下的调用是行不通的:
Sub Call_aa_08()
Dim str As String
str = "aa"
Call str
End Sub
我们要用另一种方法,Application.run方法来调用过程名是变量的过程:
Sub Call_aa_09()
Dim str As String
str = "aa"
Application.Run str
End Sub
如果用run方法来调用带参数的过程,则这样,多个参数用逗号分隔:
Sub Call_aa_10()
Dim str As String
str = "aa"
Application.Run str, "喵喵"
End Sub
Run方法处理同名过程和Call语句不一样,只要在工作簿中存在相同的名称,即使是工作表里定义的名称,像上一个过程的写法就会报错(没有找到过程或者工程错误),也必须在过程名前加上模块名称(注意点不要漏了),如:
Sub Call_aa_11()
Dim str As String
str = "aa"
Application.Run "模块2." & str, "喵喵"
End Sub
引用其他工作簿(该工作簿必须是打开的),如Book1里的过程则需要加上工作簿名称(注意引号不要漏了),如:
Sub Call_aa_12()
Dim str As String
str = "aa"
Application.Run "Book1!模块2." & str, "喵喵"
End Sub