VBA中的Instr函数可以查找指定字符首次出现的位置,但是有时需要查找的字符第N此出现的位置,VBA并没有提供可以支持这个功能的函数。
实例:查找字符串A123-B1234-C12345-D12345
中减号第3次出现的位置。
- 方法1:
Sub Demo1()
msg = "A123-B1234-C12345-D12345"
cnt = 0
nth_pos = 3
For i = 1 To Len(msg)
If Mid(msg, i, 1) = "-" Then
cnt = cnt + 1
If cnt = nth_pos Then
MsgBox "定位位置:" & i
Exit Sub
End If
End If
Next
End Sub
代码解析:
第4行代码指定查找第3次出现的位置。
第5~13行代码循环判断个字符。
第6行判断第N个字符是否为减号。
如果满足条件,第7行代码计数器加一。
第8行代码判断到当前位置,指定字符出现的次数,如果恰好满足定位条件,那么低9行代码输出信息,第10行代码结束代码过程。
逐个判断每个字符是常规思路,但是如果字符串较长,那么耗时也就比较多,
- 方法2:
Sub Demo2()
msg = "A123-B1234-C12345-D12345"
nth_pos = 3
arr = Split(msg, "-")
For i = 0 To nth_pos - 1
cnt = cnt + Len(arr(i)) + 1
Next
MsgBox "定位位置:" & cnt
End Sub
代码解析:
第3行代码指定查找第3次出现的位置。
第4行代码split函数将字符串拆分为数组。
第5~7行代码为For循环,split函数返回值数组的下标下届是从零开始的,因此循环终止值设置为nth_pos-1
。
第6行代码循环累计数组元素字符个数,最后加一相当于是分隔符。
第8行代码输出信息。
使用split函数拆分为数组之后,可以有效的减少循环次数,提升代码效率。
注意:示例代码中并没有容错机制,如果指定次数超过源字符串中被查找字符出现的次数,那么将产生错误结果。