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