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

 Sub AddHyperlinks()

 Dim strName As String, source As String, target As String
Dim i As Integer i =
source = "目录!a1" Do While Cells(i, "d") <> "" strName = Cells(i, "d").Text
target = strName & "!A1" 'cells(i,"e")单元格链接到表名为strName的工作表的[a1]单元格
Sheets("目录").Hyperlinks.Add Cells(i, "e"), "", target '表名为strName的工作表的[a1]单元格,反向链接到表名为“目录”的[a1]单元格
Sheets(strName).Hyperlinks.Add Sheets(strName).[a1], "", source, TextToDisplay:="返回目录" 'Sheets("目录").Hyperlinks.add(Cells(i, "e"), "").SubAddress = target
'Sheets(strName).Hyperlinks.add(Sheets(strName).[a1], "", source).TextToDisplay = "返回目录" i = i +
Loop MsgBox "共批量设置" & i - & "条超链接" End Sub

测试发现如果使用20/21两行代替15/18,整段代码的速度会慢的非常非常多。什么原因?

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

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

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

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

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

再来回顾一下开篇代表两种调用方式的几句代码

方式一的两句:

Sheets("目录").Hyperlinks.Add Cells(i, "e"), "", target
Sheets(strName).Hyperlinks.Add Sheets(strName).[a1], "", source, TextToDisplay:="返回目录"

方式一,在Hyperlinks.Add方法内部创建过Hyperlink对象后,对象可能就已经被丢弃(变量的生命周期---->在跳出Add方法后变量被销毁),创建对象的同时超链接已经做好,不影响实际要做的要求,工作表单元格的超链接是在Hyperlinks.Add方法内部就已经全部完成的,同时Hyperlink对象是创建一个销毁一个。

方式二的两句:

Sheets("目录").Hyperlinks.add(Cells(i, "e"), "").SubAddress = target
Sheets(strName).Hyperlinks.add(Sheets(strName).[a1], "", source).TextToDisplay = "返回目录"

方式二,Hyperlinks.add返回的Hyperlink对象(即方法的返回值),在do...wile循环中不断的被创建和代入了AddHyperlinks方法内部,访问对象的属性SubAddress/TextToDisplay,给属性赋值后,工作表单元格的超链接才全部完成,而这些对象在整个AddHyperlinks方法未结束前不会销毁,极大的影响运行效率。(VB对复杂对象的内存管理能力可能很差)

我的需求,只要超链接方便实现跳转,对Hyperlink对象并不关心,所以使用“方式一”不要返回值的调用方式就是最好的选择。

如下边这段简单函数:

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

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

 Sub Test()
Add ,
End Sub

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

 Sub Test()
Dim result As Integer
result = Add(, )
MsgBox result
End Sub

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

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

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

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

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

VBA中方法的函数式调用和过程式调用的差别的更多相关文章

  1. VBA中方法传参

    将变量做为参数传递给方法 Sub Test() Dim a As Integer a = Add a Debug.Print a '引用传递,a的值发生了变化,输出101 End Sub Functi ...

  2. 在VBA中使用Windows API

    VBA是一种强大的编程语言,可用于自定义Microsoft Office解决方案.通过使用VBA处理一个或多个Office应用程序对象模型,可以容易地修改Office应用程序的功能或者能够使两个或多个 ...

  3. 在VBA中调用excel函数

    以前不太会用VBA时,都是在excel中使用函数来计算一些数据.毕竟函数不如代码,效率比较低.所以,就学着怎么在VBA中引用Excel函数.平时我用得比较多的函数就是countif和sumif函数.1 ...

  4. C#中方法的调用

    C#中方法的调用 1.同一个类中方法的调用: 静态方法可以直接调用静态方法 静态方法不能直接调用非静态方法,静态方法先生成. 非静态方法可以直接调用静态方法 如果静态方法要调用非静态的方法,必须使用实 ...

  5. VBA中find的一些使用方法

    用excel处理数据的时候,无论是使用VBA还是函数,查找和引用都是两大主要的工作,VBA中的find系列的方法(find.findnext.Range.FindPrevious)返回range对象, ...

  6. 在VBA中调用工作表函数

    虽然VBA几乎可以完成所有工作表函数的功能,但是有时候在无法打开思路的时候,适当调用一些工作表函数也未尝不可,在VBA中调用工作表函数需要用到 WorksheetFunction对象,例如: Work ...

  7. C#反射调用程序集类中方法

    建立类 class OperatorClass { /// <summary> /// 加法 /// </summary> /// <param name="x ...

  8. java中方法调用

    JAVA中方法的调用[基础] 一.调用本类中的方法 方法一.被调用方法声明为static ,可以在其他方法中直接调用.示例代码如下: public class HelloWord { /** * @p ...

  9. Java中方法定义和调用的学习

    方法其实就是若干语句的功能集合. 参数(原料):就是进入方法的数据.返回值(原产物):就是从方法中出来的数据. 定义方法的完整格式:修饰符  返回值类型  方法名称(参数类型 参数名称,...){ 方 ...

随机推荐

  1. android 项目学习随笔三(Fragment )

    1.在主页面(activity引用Fragment )的布局文件中定义FrameLayout ,加载Fragment  <FrameLayout xmlns:android="http ...

  2. 【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.6.Dialog控件

    习惯上,我们播放一条简短的信息,或向浏览者询问一个问题,都会用到dialog. 创建一个基本的dialog 使用dialog 选项 形式 启用内置动画 给dialog添加按钮 使用dialog回调函数 ...

  3. iOS 序列化与反序列化

    开篇 1到底这个序列化有啥作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教 ...

  4. HDU 1269:迷宫城堡(强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=1269 题意:确定是否是一个强连通图. 思路:裸的tarjan算法. #include <cstdio> ...

  5. java String 深入理解

    说出下面程序的输出 class StringEqualTest { public static void main(String[] args) { String s1 = "Program ...

  6. recycleview + checkbox 实现单选

    使用map集合记录checkbox的选中状态 private HashMap<Integer,Boolean> positionMap; positionMap = new HashMap ...

  7. PostgreSQL连接python,postgresql在python 连接,创建表,创建表内容,插入操作,选择操作,更新操作,删除操作。

    安装 PostgreSQL可以用Python psycopg2模块集成. sycopg2是Python编程语言的PostgreSQL数据库的适配器. 其程序代码少,速度快,稳定.不需要单独安装这个模块 ...

  8. python8

    编译和解释性语言的区别 编译 典型的C C++ 编译完成之后是可执行文件. 机器码-底层(外文书,但是不懂中文,翻译成中文就可以看) 解释性语言----看一句英文书,让翻译解释一句 解释器写的代码便于 ...

  9. CountDownLatch使用例子

    CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则处于等待状态,调用countDown()方法 ...

  10. CI分页,搜索之后翻页不能用问题

     最近在学习用php的CI框架写一个自己的CMS,遇到了些问题.其中一个就是CI分页的时候,我的URL带有其他参数,才能查出我想要的数据.于是我翻遍了谷歌度娘,终于找到了解决办法,和我想的差不多,就贴 ...