I'm not sure I answered your question correctly, but here is my implementation (hopefully) that you want:
Function GetName(arg As String) As String parts = Split(arg, ",") For Each p In parts kv = Split(p, "=") Key = kv(0) Value = kv(1) If Key = "CN" Then commonName = Value End If Next p regIndex = InStr(1, commonName, "(") region = Mid(commonName, regIndex, Len(commonName) - regIndex + 1) parts = Split(commonName, " ") first = parts(0) last = parts(1) GetName = first & ", " & last & " " & region End Function Sub test() 'Prints "John, Smith (region)" Debug.Print GetName("CN=John Smith (region),OU=Legal,DC=example,DC=comand") End Sub
This illustrates the use of the Split and Mid functions.
This is a quick and dirty implementation, serving only illustrative purposes. To use it in real code, you need to add a few checks (for example, that the kv and parts collections contain at least two elements).
UPD: To cover the two possible CN field formats, namely "last\, first (region)" and "first last (region)" and make things a little less messy, I would use a regex approach.
Function GetName(arg As String) As String Dim RE As Object, REMatches As Object Set RE = CreateObject("vbscript.regexp") With RE .MultiLine = False .Global = False .IgnoreCase = True .Pattern = "CN=(\w+)\s*?(\\,)?.*?," End With Set REMatches = RE.Execute(arg) If REMatches.Count < 1 Then GetName = "" Return End If cn = REMatches(0).Value withComma = (InStr(1, cn, "\,") > 0) If withComma Then lastIndex = 0 firstIndex = 2 regionIndex = 3 patt = "(\w+)\s*?(\\,)?\s*?(\w+)\s*(\(.*?\))" Else lastIndex = 1 firstIndex = 0 regionIndex = 2 patt = "(\w+)\s*?(\w+)\s*(\(.*?\))" End If Set RE = CreateObject("vbscript.regexp") With RE .MultiLine = False .Global = False .IgnoreCase = True .Pattern = patt End With Set REMatches = RE.Execute(arg) If REMatches.Count < 1 Then GetName = "" Return End If Set m = REMatches(0) first = m.SubMatches(firstIndex) last = m.SubMatches(lastIndex) region = m.SubMatches(regionIndex) GetName = first & ", " & last & " " & region End Function Sub test() ' Prints "first, last (AAA-somewhere)" two times. Debug.Print GetName("CN=last\, first (AAA-somewhere),OU=IT,OU=Users,OU=somewhere - aaa,OU=place,DC=aaa,DC=com") Debug.Print GetName("CN=first last (AAA-somewhere),OU=IT,OU=Users,OU=somewhere - aaa,OU=place,DC=aaa,DC=com") End Sub