因見到有人求助批量設置工作簿中的超鏈接,嘗試寫了一段代碼:
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做賦值。
但如果以函數方式調用了了一個有返回值的方法,但卻不使用返回值,就會報錯。
個人屬業余愛好,以上內容有一部分只是感覺和推測。