我们经常会遇到要用逗号(或者其他连接符)连接文本,但是好像excel里并没有非常方便的连接文本的功能,我们来看下面一个简单的例子:
我们想把A1:A3的文本字符串用逗号连接起来,只能用字符连接符&,如上面的B2的公式,而concatenate这个函数只能连接字符,不能用特定的符号连接,如果想连接的话,那只能把特定的符号写入单元格,然后在用concatenate函数,现在的问题是如果我们连接几个单元格字符还好,如果需要连接很多个单元格,再用这样的方法就很繁琐,效率低,就像下面的图片,根本停不下来。
excel 没有方便的功能,我们只能通过vba开发一个自定义函数来满足我们特定的需求,则看下面的图片
完成了相同的连接功能,但是公式书写起来就方便了很多,没有那么麻烦,其中这个join函数就是我们自己开发的自定义函数
这个join函数是怎么实现的那?
我们来看下它的代码:
Option Explicit
Public Function Join(rng As Range, delimiter As String) As String
Dim cell As Range
For Each cell In rng
Join = Join & cell.Text & delimiter
Next cell
' 去掉最后1个分隔符
Join = Left(Join, Len(Join) - Len(delimiter))
看不懂没有关系,我们来庖丁解牛的讲解一下这个自定义的函数是怎么运作的.
Public Function Join(rng As Range, delimiter As String) As String
这个函数有2个参数,第一参数是单元格区域,第2个参数是字符分隔符,返回的结果就是用给定的字符分隔符连接所引用的单元格区域的文本。
下面的函数语句才是真正建立起我们想要的结果字符串
For Each cell In rng
这里我们主要通过循环单元格区域rng,把每一个文本用字符分隔符不断累加连接并返回join函数
Join = Join & cell.Text & delimiter
假如我们表格里有这样的3个文本:
A1 = one
然后像下面这样写join函数
=Join(A1:A3,",")
下面我们把每一步生成的结果分解一下:
A1
对于A1单元格来说, Join = ""
, cell.Text = "one"
, and delimiter = ","
.
所以这行代码:
Join = Join & cell.Text & delimiter
变成了下面的结果:
Join = "" & "one" & ","
A2
现在语句的内容是, Join = "one,"
, cell.Text = "two"
, and delimiter = ","
.
通过下一次的循环,变成了下面的结果,可以看到第一个和第二个文本连接起来了:
Join = "one," & "two" & ","
A3
第三次循环,生成了我们最终的想要的结果:
Join = "one,two," & "three" & ","
现在循环已经结束了,但得到的结果是 Join = "one,two,three,"
.
然而我们不想要最后一个逗号分隔符,所以我们必须想办法把它去掉,我们可以执行下面的语句来完成去掉最后一个逗号
Join = Left(Join, Len(Join) - Len(delimiter))
我们分别把相应的内容添加进去,效果如下:
Join = Left("one,two,three,", 14 - 1)
最后留个问题给大家思考一下,为什么不用
Join =Left(Join, Len(Join) – 1)?
,