Sunday, September 20, 2015

VBA Spreadsheet Function for Substring Inbetween Strings

Function Substring2(theString As String, str1 As String, repstr1 As Integer, Optional str2 As Variant, Optional repStr2 As Variant) As String

'****************************************************************************************************************
'author: kay cichini
'date: 04112014
'purpose: find substring deligned by the x-th repition of one string at the left side
' and anothers string x-th repition at the right side
'str1: first string to be matched
'str2: second string to be matched, optional
'repstr1: nth repition of str1 to be matched
'repstr2: nth repition of str2 to be matched, optional
' with optional arguments ommited function will return substring ending with the last character of the
' searchstring
'----------------------------------------------------------------------------------------------------------------
'example: Substring2("1234 678 101214 xxxx"; " "; 2; "x"; 3)
' will match position 10 after the second repition of str1, find position 20 after the third "x"
' then apply a mid-function with signature 'mid(string, start, length)',
' where the position 10 is the start and length is position 20 - len("x") - 10 = 9
' and the result is "101214 xx"
'****************************************************************************************************************

Dim start1, start2, lenStr1, lenStr2, length As Integer

If IsMissing(str2) And IsMissing(repStr2) Then

'case when last char in string should be matched
'-----------------------------------------------

start1 = 1
lenStr1 = Len(str1)

If InStr(start1, theString, str1) = 0 Then
'0 -> String couldn't be matched!
Exit Function
End If

For i = 0 To repstr1 - 1
start1 = InStr(start1, theString, str1) + lenStr1
Next i

length = Len(theString) - start1 + 1
Substring2 = Mid(theString, start1, length)

Else

'other cases
'-----------
start1 = 1
lenStr1 = Len(str1)
start2 = 1
lenStr2 = Len(str2)

If InStr(start1, theString, str1) = 0 Or InStr(start2, theString, str2) = 0 Then
'0 -> String couldn't be matched!
Exit Function
End If

For i = 0 To repstr1 - 1
start1 = InStr(start1, theString, str1) + lenStr1
Next i

For i = 0 To repStr2 - 1
start2 = InStr(start2, theString, str2) + lenStr2
Next i

length = start2 - lenStr2 - start1
Substring2 = Mid(theString, start1, length)

End If

End Function

No comments:

Post a Comment