今天翻了一下之前老师布置的练习题,题目是这样的:用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))
至此,这段代码就结束了,大家如果写好了代码,可以到单元格中试一下自己写的自定义函数哦。
有话要说...