今天翻了一下之前老師布置的練習題,題目是這樣的:用VBA編寫一個自定義函數,以實現按照任意指定字符連接所選單元格區域的各單元格的值
如:其中A3:A9是所選區域,星号是指定連接符号,能夠實現C2單元格的效果即可。
這個題目有點2016版本TextJoin函數功能的意思,VBA實現起來也比較簡單,所以今天我們就來看看這個問題的代碼應該怎麼來寫吧。
看代碼:
效果圖:
代碼解釋:
1、自定義函數的代碼結構
Function 函數名(參數)返回值
代碼段
End Function
MyTextJoin為函數名:函數寫好之後,在表格中就調用該函數
rng、str 是給定的兩個參數,range即表示該函數需要給定一個單元格的區域,str則表示用來連接給定單元格值之間的“字符串”。
最後函數需要返回一個字符串類型的結果,所以在括号後面跟了一個返回值的類型。
2、代碼的含義
2.1:由于函數的用意是用某個字符串對單元格區域進行兩兩連接,所以我們知道參數中的單元格區域中單元格的個數是在兩個及以上的,所以定義了一個數組arr用來接收将來給定的單元格區域,用來後續循環得到數組中的每個獨立值(之所以用數組,是因為數組的速度快)
arr = rng.Value
2.2:定義兩個循環變量i和j,因為将單元格區域的值賦值給變量我們會得到一個二維的數組,所以我們需要獲得二維數組的每一個維度的最大下标,以便我們能夠通過數組的角标獲取到對應各單元格的單個值。
For i = 1 To UBound(arr)
For j = 1 To UBound(arr, 2)
Next j
Next i
2.3:判斷給定區域的值是否為空,隻對不為空的單元格的值進行連接,忽略空值,并定義一個變量strResult用來存儲每次更新的連接結果
If Len(arr(i, j)) <> 0 Then
strResult = strResult & arr(i, j) & str
End If
3、返回值
函數名=返回的結果,由于strResult每次連接的時候都将連接符連接在最後,所以以上循環連接結果最後還多出了一個連接符,所以我們需要将該連接符去除得到我們最終想要的完全正确的結果
MyTextJoin = Left(strResult, Len(strResult) - Len(str))
至此,這段代碼就結束了,大家如果寫好了代碼,可以到單元格中試一下自己寫的自定義函數哦。
有話要說...