学习Excel技术,关注微信公众号:
excelperfect
本文继续学习wellsr.com中提供VBA程序。经常研究优秀的VBA程序代码,理解其中的编程方法和技巧,往往能够取得事半功倍的效果。
下面的用户自定义函数SuperMid函数能够在一段文本中提取两个字符、分隔符、单词等之间的子文本(字符串)。其中,分隔符可以相同,也可以不同。
SuperMid函数的代码如下:
'提取字符串中在两个子字符串str1和str2之间的字符串
'如果指定参数reverse为True,则从字符串结尾开始查找
'并提取最后满足条件的子字符串
Public Function SuperMid(ByVal strMain As String, _
str1 As String, str2 As String, _
Optional reverse As Boolean) As String
Dim i As Integer, j As Integer, temp AsVariant
On Error GoTo errhandler:
If reverse = True Then
i = InStrRev(strMain, str1)
j = InStrRev(strMain, str2)
If Abs(j - i) < Len(str1) Then
j = InStrRev(strMain, str2, i)
End If
If i = j Then '尝试查找字符串的第2部分
j = InStrRev(strMain, str2, i - 1)
End If
Else
i = InStr(1, strMain, str1)
j = InStr(1, strMain, str2)
If Abs(j - i) < Len(str1) Then
j = InStr(i + Len(str1), strMain,str2)
End If
If i = j Then '尝试查找字符串的第2部分
j = InStr(i + 1, strMain, str2)
End If
End If
If i = 0 And j = 0 Then GoTo errhandler:
'仅让其变得任意大
If j = 0 Then j = Len(strMain) + Len(str2)
If i = 0 Then i = Len(strMain) + Len(str1)
If i > j And j <> 0 Then '交换顺序
temp = j
j = i
i = temp
temp = str2
str2 = str1
str1 = temp
End If
i = i + Len(str1)
SuperMid = Mid(strMain, i, j - i)
Exit Function
errhandler:
MsgBox "提取字符串错误. 请核查你的输入" & vbNewLine _
& vbNewLine & "中止", , "字符串没有找到"
End Function
在工作表中使用
如下图1所示,可以像内置的工作表函数一样使用superMid函数。
图1
在VBA代码中使用
提取两个单词之间的字符串
Sub ExtractSubstring()
Dim str1 As String, str2 As String
str1 = "USER: myusername ADDRESS:unknown"
str2 = SuperMid(str1, "USER:","ADDRESS:")
Debug.Print str2 '结果为; myusername
End Sub
提取两个分隔符之间的字符串
Sub ExtractSubstring2()
Dim str1 As String, str2 As String
str1 = "abc-123-xyz-000"
str2 = SuperMid(str1, "-","-")
Debug.Print str2 '结果为123
End Sub
提取开始两个“-”之间的字符串。
提取两个字符串之间最后出现的字符串
Sub ExtractSubstring3()
Dim str1 As String, str2 As String
str1 = "abc-123-xyz-000"
str2 = SuperMid(str1, "-","-", True)
Debug.Print str2 '结果为xyz
End Sub
提取最后两个“-”之间的字符,此时将第4个参数值设置为True。
提取某个单词之后的所有文本
Sub ExtractSubstring4()
Dim str1 As String, str2 As String
str1 = "How now brown cow"
str2 = SuperMid(str1, "now","anyrandomstring")
Debug.Print str2 '结果为brown cow
End Sub
从路径中提取文件名
Sub ExtractFileName()
Dim str1 As String, str2 As String
str1 = "C:\Users\完美Excel\excelperfect.txt"
str2 = SuperMid(str1, "\",".txt", True)
Debug.Print str2 '结果为excelperfect
End Sub