在前几天分享的文章【快速对比数据】中,使用了如下代码,有小朋友问为什么要再第20行代码中使用Trim
函数呢?是否可以在构建字符串时直接处理呢?本文将就讲一下VBA中快速连接字符串的几种方法。
我们使用一个简单的示例,提取1-10中的偶数并输出结果,判断偶数非常简单,程序主框架如下。
Sub Demo()
Dim i As Integer, msg As String
For i = 1 To 10
If Int(i / 2) = (i / 2) Then '构建字符串msg
Next
Debug.Print "偶数:" & msg
End Sub
假设以空格分隔结果。
- 方法1:最经典的教科书式的用法为:
Sub Demo1()
Dim i As Integer, msg As String
For i = 1 To 10
If Int(i / 2) = (i / 2) Then
If Len(msg) = 0 Then
msg = CStr(i)
Else
msg = msg & " " & CStr(i)
End If
End If
Next
Debug.Print "偶数:" & msg
End Sub
【代码解析】
第5行代码判断msg
变量是否为空,如果为空则说明是第一个偶数,那么第6行代码直接赋值,否则第8行代码在msg
变量之后追加空格和偶数。
- 方法2:输出时取巧
对于追求极致,希望代码行数近可能的少的开发者来说,则会采用如下代码,代码行数精简了近一半。
Sub Demo2()
Dim i As Integer, msg As String
For i = 1 To 10
If Int(i / 2) = (i / 2) Then msg = msg & " " & CStr(i)
Next
Debug.Print "偶数:" & Trim(msg)
End Sub
【代码解析】
第4行代码构建输出结果时,不再对第一个偶数做特殊处理,这样产生的字符串为" 2 4 6 8 10"
,第一个数字之前会有一个多余的前导空格,幸运的是VBA中提供了相应函数去除空格,第6行代码中使用Trim
函数将可以实现完美输出了,效果和方法1完全相同。
- 方法3:灵活万能法
看到这里有的读者可能会有疑问,如果分隔符不是空格,怎么办?VBA中没有去除其他前导字符的函数,再写个自定义函数,有些南辕北辙了吧!
其实这样的场景实现起来也很简单,例如分隔符改为逗号。
Sub Demo3()
Dim i As Integer, msg As String
For i = 1 To 10
If Int(i / 2) = (i / 2) Then msg = msg & "," & CStr(i)
Next
Debug.Print "偶数:" & Mid(msg, 2)
End Sub
【代码解析】
与方法2相比,区别仅仅在于第6行代码,使用Mid
函数去除第一个字符(多余的逗号),同样简洁。
- 方法4:通用扩展法
有时开发代码时分隔符个数并不确定,那么方法3去除多余的前导字符时,可能就会出问题,只要做一下简单扩建,就可以完美适配这样的场景。
Sub Demo4()
Dim i As Integer, msg As String
Const STR_DELI = "||"
For i = 1 To 10
If Int(i / 2) = (i / 2) Then msg = msg & STR_DELI & CStr(i)
Next
Debug.Print "偶数:" & Mid(msg, Len(STR_DELI)+1)
End Sub
【代码解析】
第3行代码定义分隔符常量,用于模拟任意长度的分隔符(单个或多个字符)。
第7行代码输出时Mid
函数的第二个参数使用Len
函数获取分隔符的长度,从其之后一位开始截取字符串,就可以得到正确的结果。
同一个问题,解决方法有多种,条条大路通罗马。