VBA中,方法的函数式调用和过程式调用的差别

Posted 业余爱好

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBA中,方法的函数式调用和过程式调用的差别相关的知识,希望对你有一定的参考价值。

因见到有人求助批量设置工作簿中的超链接,尝试写了一段代码:

 1 Sub AddHyperlinks()
 2 
 3 Dim strName As String, source As String, target As String
 4 Dim i  As Integer
 5 
 6 i = 5
 7 source = "目录!a1"
 8 
 9 Do While Cells(i, "d") <> ""
10 
11     strName = Cells(i, "d").Text
12     target = strName & "!A1"
13     
14     cells(i,"e")单元格链接到表名为strName的工作表的[a1]单元格
15     Sheets("目录").Hyperlinks.Add Cells(i, "e"), "", target
16     
17     表名为strName的工作表的[a1]单元格,反向链接到表名为“目录”的[a1]单元格
18     Sheets(strName).Hyperlinks.Add Sheets(strName).[a1], "", source, TextToDisplay:="返回目录"
19     
20     Sheets("目录").Hyperlinks.add(Cells(i, "e"), "").SubAddress = target
21     Sheets(strName).Hyperlinks.add(Sheets(strName).[a1], "", source).TextToDisplay = "返回目录"
22     
23     i = i + 1
24 Loop
25    
26    MsgBox "共批量设置" & i - 5 & "条超链接"
27     
28 End Sub

 

测试发现如果使用20/21两行代替15/18,整段代码的速度会慢的非常多。什么原因呢?(说明:函数=方法)

虽然同样是"表达式.Hyperlinks.add",但两个方式的差别在于参数的使用方式不同。

方式一(15/18行):表达式.Hyperlinks.add   参数1,参数2...

方式二(20/21行):表达式.Hyperlinks.add  (参数1.参数2...)

要点在于VB中有返回值的函数:

1、可以用过程形式调用,不要括号,不要返回值;(方式一)
2、也可以用函数形式调用,要加括号,且有返回值。(方式二)

如果使用“方式二”Hyperlinks.add返回一个Hyperlink对象(即方法的返回值),在do...wile循环中不断的创建对象,显然极大的影响运行效率,在这段代码中我只要超链接方便实现跳转,对Hyperlink对象并不关心,所以使用“方式一”不要返回值的调用方式就是最好的选择。

 

另外如下边这段简单函数:

1 Function Add(a As Integer, b As Integer) As Integer
2     Add = a + b
3 End Function

Add函数有返回值,但我们可以不要返回值,这样调用:

1 Sub Test()
2    Add 1, 2
3 End Sub

也可以使用返回值,这样调用Add:

1 Sub Test()
2     Dim result As Integer
3     result = Add(1, 2)
4     MsgBox result
5 End Sub

但如果像下面这样去调用,就会报错,提示“编译错误,缺少=”,语法已经不对了。

Sub Test()
    语法有误
    add(a,b)
End Sub

这个VB中的语法错误可以这样理解,以函数方式调用有返回值,返回值要拿来用的,它可以用来给一个变量赋值,也可以像开篇中第20/21行语句那样,使用Hyperlinks.add方法创建出的Hyperlink对象(方法的返回值),分别对对象的SubAddress/TextToDisplay做赋值。

但如果以函数方式调用了了一个有返回值的方法,但却不使用返回值,就会报错。

个人属业余爱好,以上内容有一部分只是感觉和推测。

以上是关于VBA中,方法的函数式调用和过程式调用的差别的主要内容,如果未能解决你的问题,请参考以下文章

PHP函数式编程

整活函数式编程

每日问答,Spring事务

函数式编程入门教程

函数式编程入门教程

从 vba 代码调用 Excel 的工作表函数