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做賦值。

但如果以函數方式調用了了一個有返回值的方法,但卻不使用返回值,就會報錯。

個人屬業余愛好,以上內容有一部分只是感覺和推測。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM