zoukankan      html  css  js  c++  java
  • 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、也可以用函数形式调用,要加括号,且有返回值。(方式二)

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

    式一的两句:

    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对象并不关心,所以使用“方式一”不要返回值的调用方式就是最好的选择。

    如下边这段简单函数:

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

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

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

  • 相关阅读:
    Coolite comboBox控件动态显示树形结构(无限树)
    WinXP 允许搜索PHP格式
    LINQ To DataSet 几个常用示例
    在Windows系统上安装PHP工作环境
    将LINQ To DataSet 传回之对象集转成DataTable的函数
    .net wsdl文件用法
    上班了,抱怨一下
    写在情人节
    快乐云南行
    单车骑天下 VS 公益旅游活动
  • 原文地址:https://www.cnblogs.com/zzstone/p/5509810.html
Copyright © 2011-2022 走看看