Question

How parse out first/last name?

Asked by: RobertNZana

Using an access 2007 database.  There is a field 'contact' that has hundreds of names in it.  There are many formats:
Mr. FirstName LastName
Mrs. FirstName LastName
FirstName LastName
FirstName LastName-LastName2
FirstName LastName LastName2 Jr/Sr

I want to automatically get them into 2 columns: firstname, lastname

First, I am going to strip out ALL Mr., Mrs., Ms. to make it simple.  So I know the first token is FirstName and the REST is LastName.  

How can I accomplish this?  Please be detailed.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-10-20 at 08:06:50ID24827170
Tags

access 2007

Topics

Microsoft Access Database

,

Access Coding/Macros

,

SQL Query Syntax

Participating Experts
5
Points
500
Comments
12

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Capital LastName FirstName
    Is there any routine out there that will take string of first name and last name a capitalize the first character in first name and in last name. Example: john doe: John Doe
  2. MySQLFront: Combine FirstName + LastName
    Hello, MySQLFront, Server: Linux Apache, System: WINXP I've searched the forum for similar questions, and there all pretty damn close to getting me finalized, but no cigar. What I am looking to do is combine two fields in the same table to populate another field in the sam...
  3. One column has (lastname, firstname) -- Need to cov…
    One column has (lastname, firstname) -- Need to covert it to (firstname lastname)
  4. Parsing firstname,middlename, lastname and title
    I'm looking for a script/idea on how to parse out first,middle (if any),lastname and title (ifany) from a field in a table... The field can have: FirstName Lastname FirstName Middlename LastName FirstName MiddleName LastName Tiltle(ex: Sr, Jr,Mr ,etc) FirstName LastName Titl...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: leewPosted on 2009-10-20 at 08:16:47ID: 25615048

When you don't know, it's not easy.  Make a backup of the database

I would run a series of SQL statements with replace:

Update TableName Set Contact = Replace(Contact, 'Mr. ', '')
Update TableName Set Contact = Replace(Contact, 'Mrs. ', '')
Update TableName Set Contact = Replace(Contact, 'Ms. ', '')
Update TableName Set Contact = Replace(Contact, 'Dr. ', '')
Update TableName Set Contact = Replace(Contact, 'Mr ', '')
Update TableName Set Contact = Replace(Contact, 'Mrs ', '')
Update TableName Set Contact = Replace(Contact, 'Ms ', '')
Update TableName Set Contact = Replace(Contact, 'Dr ', '')
etc

(It's important that you include the space following the salutation - skipping it will result in Mr. John Drake looking like Mr. John ake)


 

by: capricorn1Posted on 2009-10-20 at 08:18:42ID: 25615066

to parse the Contact field with FirstName LastName values and put them in the respective fields  FName, LName

Update tableX
Set FName=Trim(Left([Contact],Instr([Contact], " ")-1)),
LName=Trim(Mid([Contact],Instr([Contact], " ")+1))


to remove the Mr.mrs, ms. you can use a replace function

update tableX
set [contact]=replace(replace(replace([Contact],"Mr.",""),"mrs.",""),"ms.","")

run this first before parsing the contact field



 

by: matthewspatrickPosted on 2009-10-20 at 08:18:50ID: 25615068

RobertNZana said:
>>First, I am going to strip out ALL Mr., Mrs., Ms. to make it simple.  So I know the first token is FirstName and
>>the REST is LastName.  

With respect, you know nothing of the sort.  You yourself indicated that some of the names have suffixes such
as Jr/Sr (and one can imagine III, IV, etc., and/or Ph.D., Esq., M.D, etc.).

There is also the possibility of first and/or last names composed of multiple words.  For example:

Oscar de la Renta

We "know" just by looking at that name that Oscar is the first name and de la Renta is the surname.  However,
suppose we had:

John Paul Van Stone

How could we write a rule that acurately determines where the first name ends and the surname starts?

 

by: Q-riderPosted on 2009-10-20 at 08:23:48ID: 25615112

Dear RobertNZana,

is this a task to be done once or will it be done on a regular base?
How many names do you have in fact?

Say you have about 500 names and you have to transform it once I would suggest you to do this in excel and paste the result into your access.

Because: What about Names like John F. Kenedy or Lydia Parker Bowls? You are not able to let this be done by a simple query.

Best Regards
Andreas

 

by: GRayLPosted on 2009-10-20 at 08:27:59ID: 25615159

This forum is replete with questions similar to this one, and of course, just a wide a variety of answers to try and cover all the possibilities as Patrick suggests.  In Search, by entering  - parse first name and last name - I got over 2300 hits.

 

by: GRayLPosted on 2009-10-20 at 08:28:52ID: 25615164

Maybe you will find one in the list from the Search that you like ;-)

 

by: capricorn1Posted on 2009-10-20 at 08:29:12ID: 25615167

as the other experts have noted, other variations of names will not be easy to parse.
to handle the FirstName LastName (single Name and single LastName format) and ignore the rest (which you have to deal with separately, run this query)


Update tableX
Set FName=Trim(Left([Contact],Instr([Contact], " ")-1)),
LName=Trim(Mid([Contact],Instr([Contact], " ")+1))
Where Instr([Contact], " ")=Instrrev([Contact], " ")

 

by: leewPosted on 2009-10-20 at 08:42:57ID: 25615311

I should have verified this - but I was working on the assumption that the asker is planning on creating a mail-merge - in which case, he would need the first name to be separate of the rest of the name.  So names like "Oscar de la Renta" are not an issue - First Name gets Oscar, last name gets everything else.

If that's not the purpose, then for only 500 or so names, I would export the data into an excel file and break it up based on spaces - then do some manual tweaking but ensure the fields for Salutation, FirstName, MiddleName(s), LastName, and Suffix were al; correct  (I've done this with THOUSANDS of names).  By doing this in excel, those that don't conform are fairly easily found and adjusted.

In the end though, you need someone reviewing EVERYTHING when you don't have a properly designed database where the initial layout did not specify those fields in the beginning.

 

by: RobertNZanaPosted on 2009-10-20 at 08:54:00ID: 25615433

Thanks for your feedback.  This is a one time import of data.  I will mull over your comments and award points soon.  Thanks.

 

by: matthewspatrickPosted on 2009-10-20 at 09:34:36ID: 25615830

RobertNZana,

Here is a Regular Expressions attempt at it.  For more info on this approach, see:
http://www.experts-exchange.com/articles/Programming/Languages/Visual_Basic/Using-Regular-Expressions-in-Visual-Basic-for-Applications-and-Visual-Basic-6.html

The following appears to work, assuming the following:

Title prefixes: Dr, Dr., Mrs, Mrs., Ms, Ms., Miss, Mr, Mr., Rev, Rev.
Suffixes: MD, M.D., PhD, Ph.D., Ph D, Ph. D., Esq, Esq., Esquire, Jr, Jr., Sr, Sr., III, IV
Zero or one comma plus one or more spaces separate suffix from surname
One or more spaces separate title from first name
First name is first "word" (may be hyphenated) following title, if present
Surname is *all* words not returned as title, first name, or suffix

Add the code below to a regular module in your VBA project, and then use it like this:

SELECT NameColumn,
      RegExpFindSubmatch([NameColumn],"(^Dr|Mrs|Ms|Miss|Mr|Rev)(?=\.? +)",1,1,FALSE) AS Title,
      RegExpFindSubmatch([NameColumn],"^((Dr|Mrs|Ms|Miss|Mr|Rev)?(\.? +))?([a-z]+-?[a-z]*)",1,4,FALSE) AS FirstName,
      RegExpReplace([NameColumn],"(^((Dr|Mrs|Ms|Miss|Mr|Rev)\.? +)?[a-z]+-?[a-z]* +)|(,? +(MD|M\.D\.|Ph ?D|Ph\.D\.|Esq\.?|Esquire|Jr\.?|Sr\.?|III|IV)$)","",TRUE,FALSE) AS Surname,
      RegExpFindSubmatch([NameColumn],"(MD|M\.D\.|Ph ?D|Ph\. ?D\.|Esq\.?|Esquire|Jr\.?|Sr\.?|III|IV)?$",1,1,FALSE) AS Suffix
FROM YourTable

Please note that this will fail utterly with 2-word first names.

Patrick

Function RegExpReplace(LookIn As String, PatternStr As String, Optional ReplaceWith As String = "", _
    Optional ReplaceAll As Boolean = True, Optional MatchCase As Boolean = True, _
    Optional MultiLine As Boolean = False)
    
    ' Function written by Patrick G. Matthews.  You may use and distribute this code freely,
    ' as long as you properly credit and attribute authorship and the URL of where you
    ' found the code
    
    ' For more info, please see:
    ' http://www.experts-exchange.com/articles/Programming/Languages/Visual_Basic/Using-Regular-Expressions-in-Visual-Basic-for-Applications-and-Visual-Basic-6.html
    
    ' This function relies on the VBScript version of Regular Expressions, and thus some of
    ' the functionality available in Perl and/or .Net may not be available.  The full extent
    ' of what functionality will be available on any given computer is based on which version
    ' of the VBScript runtime is installed on that computer
    
    ' This function uses Regular Expressions to parse a string, and replace parts of the string
    ' matching the specified pattern with another string.  The optional argument ReplaceAll
    ' controls whether all instances of the matched string are replaced (True) or just the first
    ' instance (False)
    
    ' If you need to replace the Nth match, or a range of matches, then use RegExpReplaceRange
    ' instead
    
    ' By default, RegExp is case-sensitive in pattern-matching.  To keep this, omit MatchCase or
    ' set it to True
    
    ' If you use this function from Excel, you may substitute range references for all the arguments
    
    ' Normally as an object variable I would set the RegX variable to Nothing; however, in cases
    ' where a large number of calls to this function are made, making RegX a static variable that
    ' preserves its state in between calls significantly improves performance
    
    Static RegX As Object
    
    If RegX Is Nothing Then Set RegX = CreateObject("VBScript.RegExp")
    With RegX
        .Pattern = PatternStr
        .Global = ReplaceAll
        .IgnoreCase = Not MatchCase
        .MultiLine = MultiLine
    End With
    
    RegExpReplace = RegX.Replace(LookIn, ReplaceWith)
    
End Function 
Function RegExpFindSubmatch(LookIn As String, PatternStr As String, Optional MatchPos, _
    Optional SubmatchPos, Optional MatchCase As Boolean = True, _
    Optional MultiLine As Boolean = False)
    
    ' Function written by Patrick G. Matthews.  You may use and distribute this code freely,
    ' as long as you properly credit and attribute authorship and the URL of where you
    ' found the code
    
    ' For more info, please see:
    ' http://www.experts-exchange.com/articles/Programming/Languages/Visual_Basic/Using-Regular-Expressions-in-Visual-Basic-for-Applications-and-Visual-Basic-6.html
    
    ' This function relies on the VBScript version of Regular Expressions, and thus some of
    ' the functionality available in Perl and/or .Net may not be available.  The full extent
    ' of what functionality will be available on any given computer is based on which version
    ' of the VBScript runtime is installed on that computer
    
    ' This function uses Regular Expressions to parse a string (LookIn), and return "submatches"
    ' from the various matches to a pattern (PatternStr).  In RegExp, submatches within a pattern
    ' are defined by grouping portions of the pattern within parentheses.
    
    ' Use MatchPos to indicate which match you want:
    ' MatchPos omitted               : function returns results for all matches
    ' MatchPos = 1                   : the first match
    ' MatchPos = 2                   : the second match
    ' MatchPos = <positive integer>  : the Nth match
    ' MatchPos = 0                   : the last match
    ' MatchPos = -1                  : the last match
    ' MatchPos = -2                  : the 2nd to last match
    ' MatchPos = <negative integer>  : the Nth to last match
    
    ' Use SubmatchPos to indicate which match you want:
    ' SubmatchPos omitted               : function returns results for all submatches
    ' SubmatchPos = 1                   : the first submatch
    ' SubmatchPos = 2                   : the second submatch
    ' SubmatchPos = <positive integer>  : the Nth submatch
    ' SubmatchPos = 0                   : the last submatch
    ' SubmatchPos = -1                  : the last submatch
    ' SubmatchPos = -2                  : the 2nd to last submatch
    ' SubmatchPos = <negative integer>  : the Nth to last submatch
    
    ' The return type for this function depends on whether your choice for MatchPos is looking for
    ' a single value or for potentially many.  All arrays returned by this function are zero-based.
    ' When the function returns a 2-D array, the first dimension is for the matches and the second
    ' dimension is for the submatches
    ' MatchPos omitted, SubmatchPos omitted: 2-D array of submatches for each match.  First dimension
    '                                        based on number of matches (0 to N-1), second dimension
    '                                        based on number of submatches (0 to N-1)
    ' MatchPos omitted, SubmatchPos used   : 2-D array (0 to N-1, 0 to 0) of the specified submatch
    '                                        from each match
    ' MatchPos used, SubmatchPos omitted   : 2-D array (0 to 0, 0 to N-1) of the submatches from the
    '                                        specified match
    ' MatchPos used, SubmatchPos used      : String with specified submatch from specified match
    
    ' For any submatch that is not found, the function treats the result as a zero-length string
    
    ' If MatchCase is omitted or True (default for RegExp) then the Pattern must match case (and
    ' thus you may have to use [a-zA-Z] instead of just [a-z] or [A-Z]).
    
    ' If you use this function in Excel, you can use range references for any of the arguments.
    ' If you use this in Excel and return the full array, make sure to set up the formula as an
    ' array formula.  If you need the array formula to go down a column, use TRANSPOSE()
    
    ' Normally as an object variable I would set the RegX variable to Nothing; however, in cases
    ' where a large number of calls to this function are made, making RegX a static variable that
    ' preserves its state in between calls significantly improves performance
    
    Static RegX As Object
    Dim TheMatches As Object
    Dim Mat As Object
    Dim Answer() As String
    Dim Counter As Long
    Dim SubCounter As Long
    
    ' Evaluate MatchPos.  If it is there, it must be numeric and converted to Long
    
    If Not IsMissing(MatchPos) Then
        If Not IsNumeric(MatchPos) Then
            RegExpFindSubmatch = ""
            Exit Function
        Else
            MatchPos = CLng(MatchPos)
        End If
    End If
    
    ' Evaluate SubmatchPos.  If it is there, it must be numeric and converted to Long
    
    If Not IsMissing(SubmatchPos) Then
        If Not IsNumeric(SubmatchPos) Then
            RegExpFindSubmatch = ""
            Exit Function
        Else
            SubmatchPos = CLng(SubmatchPos)
        End If
    End If
    
    ' Create instance of RegExp object
    
    If RegX Is Nothing Then Set RegX = CreateObject("VBScript.RegExp")
    With RegX
        .Pattern = PatternStr
        .Global = True
        .IgnoreCase = Not MatchCase
        .MultiLine = MultiLine
    End With
        
    ' Test to see if there are any matches
    
    If RegX.Test(LookIn) Then
        
        ' Run RegExp to get the matches, which are returned as a zero-based collection
        
        Set TheMatches = RegX.Execute(LookIn)
        
        ' If MatchPos is missing, user either wants array of all the submatches for each match, or an
        ' array of all the specified submatches for each match.  Build it and assign it as the
        ' function's return value
        
        If IsMissing(MatchPos) Then
            
            ' Return value is a 2-D array of all the submatches for each match
            
            If IsMissing(SubmatchPos) Then
                For Counter = 0 To TheMatches.Count - 1
                    Set Mat = TheMatches(Counter)
                    
                    ' To determine how many submatches there are we need to first evaluate a match.  That
                    ' is why we redim the array inside the for/next loop
                    
                    If Counter = 0 Then
                        ReDim Answer(0 To TheMatches.Count - 1, 0 To Mat.Submatches.Count - 1) As String
                    End If
                    
                    ' Loop through the submatches and populate the array.  If the Nth submatch is not
                    ' found, RegExp returns a zero-length string
                    
                    For SubCounter = 0 To UBound(Answer, 2)
                        Answer(Counter, SubCounter) = Mat.Submatches(SubCounter)
                    Next
                Next
            
            ' Return value is a 2-D array of the specified submatch for each match.
            
            Else
                For Counter = 0 To TheMatches.Count - 1
                    Set Mat = TheMatches(Counter)
                    
                    ' To determine how many submatches there are we need to first evaluate a match.  That
                    ' is why we redim the array inside the for/next loop.  If SubmatchPos = 0, then we want
                    ' the last submatch.  In that case reset SubmatchPos so it equals the submatch count.
                    ' Negative number indicates Nth to last; convert that to applicable "positive" position
                    
                    If Counter = 0 Then
                        ReDim Answer(0 To TheMatches.Count - 1, 0 To 0) As String
                        Select Case SubmatchPos
                            Case Is > 0: 'no adjustment needed
                            Case 0, -1: SubmatchPos = Mat.Submatches.Count
                            Case Is < -Mat.Submatches.Count: SubmatchPos = -SubmatchPos
                            Case Else: SubmatchPos = Mat.Submatches.Count + SubmatchPos + 1
                        End Select
                    End If
                    
                    ' Populate array with the submatch value.  If the submatch value is not found, or if
                    ' SubmatchPos > the count of submatches, populate with a zero-length string
                    
                    If SubmatchPos <= Mat.Submatches.Count Then
                        Answer(Counter, 0) = Mat.Submatches(SubmatchPos - 1)
                    Else
                        Answer(Counter, 0) = ""
                    End If
                Next
            End If
            RegExpFindSubmatch = Answer
            
        ' User wanted the info associated with the Nth match (or last match, if MatchPos = 0)
        
        Else
            
            ' If MatchPos = 0 then make MatchPos equal the match count.  If negative (indicates Nth
            ' to last), convert to equivalent position.
            
            Select Case MatchPos
                Case Is > 0: 'no adjustment needed
                Case 0, -1: MatchPos = TheMatches.Count
                Case Is < -TheMatches.Count: MatchPos = -MatchPos
                Case Else: MatchPos = TheMatches.Count + MatchPos + 1
            End Select
            
            ' As long as MatchPos does not exceed the match count, process the Nth match.  If the
            ' match count is exceeded, return a zero-length string
            
            If MatchPos <= TheMatches.Count Then
                Set Mat = TheMatches(MatchPos - 1)
                
                ' User wants a 2-D array of all submatches for the specified match; populate array.  If
                ' a particular submatch is not found, RegExp treats it as a zero-length string
                
                If IsMissing(SubmatchPos) Then
                    ReDim Answer(0 To 0, 0 To Mat.Submatches.Count - 1)
                    For SubCounter = 0 To UBound(Answer, 2)
                        Answer(0, SubCounter) = Mat.Submatches(SubCounter)
                    Next
                    RegExpFindSubmatch = Answer
                
                ' User wants a single value
                
                Else
                    
                    ' If SubmatchPos = 0 then make it equal count of submatches.  If negative, this
                    ' indicates Nth to last; convert to equivalent positive position
                    
                    Select Case SubmatchPos
                        Case Is > 0: 'no adjustment needed
                        Case 0, -1: SubmatchPos = Mat.Submatches.Count
                        Case Is < -Mat.Submatches.Count: SubmatchPos = -SubmatchPos
                        Case Else: SubmatchPos = Mat.Submatches.Count + SubmatchPos + 1
                    End Select
                    
                    ' If SubmatchPos <= count of submatches, then get that submatch for the specified
                    ' match.  If the submatch value is not found, or if SubmathPos exceeds count of
                    ' submatches, return a zero-length string.  In testing, it appeared necessary to
                    ' use CStr to coerce the return to be a zero-length string instead of zero
                    
                    If SubmatchPos <= Mat.Submatches.Count Then
                        RegExpFindSubmatch = CStr(Mat.Submatches(SubmatchPos - 1))
                    Else
                        RegExpFindSubmatch = ""
                    End If
                End If
            Else
                RegExpFindSubmatch = ""
            End If
        End If
    
    ' If there are no matches, return empty string
    
    Else
        RegExpFindSubmatch = ""
    End If
    
Cleanup:
    ' Release object variables
    Set Mat = Nothing
    Set TheMatches = Nothing
    
End Function

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:

Select allOpen in new window

 

by: matthewspatrickPosted on 2009-10-20 at 09:40:17ID: 25615892

RobertNZana,

Here are some results using sample data I contrived to hit various issues you will have to face.

Note the result for "Missy Andrea Wiggin".  The code assumes a multi-word last name here, but it could just
as easily be a multi-word first name...

Patrick

NameColumn                    Title   FirstName     Surname           Suffix
----------------------------------------------------------------------------
Dr. Andrew Wiggin             Dr      Andrew        Wiggin            
Dr Andrew Wiggin              Dr      Andrew        Wiggin            
Andrew Wiggin, M.D.                   Andrew        Wiggin            M.D.
Andrew Wiggin, MD                     Andrew        Wiggin            MD
Andrew Wiggin MD                      Andrew        Wiggin            MD
Mr. Andrew Wiggin             Mr      Andrew        Wiggin            
Mr Andrew Wiggin              Mr      Andrew        Wiggin            
Missy Andrea Wiggin                   Missy         Andrea Wiggin     
Ms. Andrea Wiggin             Ms      Andrea        Wiggin            
Ms Andrea Wiggin              Ms      Andrea        Wiggin            
Mrs. Andrea Wiggin            Mrs     Andrea        Wiggin            
Mrs Andrea Wiggin             Mrs     Andrea        Wiggin            
Andrea Wiggin, PhD                    Andrea        Wiggin            PhD
Andrea Wiggin, Ph.D.                  Andrea        Wiggin            Ph.D.
Andrea Wiggin, Esq                    Andrea        Wiggin            Esq
Andrea Wiggin, Esq.                   Andrea        Wiggin            Esq.
Andrea Wiggin, Esquire                Andrea        Wiggin            Esquire
Andrea Wiggin Ph D                    Andrea        Wiggin            Ph D
Andrea Wiggin Ph.D.                   Andrea        Wiggin            Ph.D.
Andrea Wiggin Esq                     Andrea        Wiggin            Esq
Andrea Wiggin Esq.                    Andrea        Wiggin            Esq.
Andrea Wiggin Esquire                 Andrea        Wiggin            Esquire
Mrs. Andrea Wiggin III        Mrs     Andrea        Wiggin            III
Mrs. Andrea Wiggin iv         Mrs     Andrea        Wiggin            iv
Mrs. Andrea Wiggin Jr.        Mrs     Andrea        Wiggin            Jr.
Mrs. Andrea Wiggin Sr         Mrs     Andrea        Wiggin            Sr
Mrs. Andrea Wiggin Sr.        Mrs     Andrea        Wiggin            Sr.
Rev. Andrew Wiggin-Smith      Rev     Andrew        Wiggin-Smith      
Rev Andrew Wiggin             Rev     Andrew        Wiggin            
Jean-Claude Van Dam                   Jean-Claude   Van Dam           
Mr Oscar de la Renta          Mr      Oscar         de la Renta       

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:

Select allOpen in new window

 

by: RobertNZanaPosted on 2009-10-20 at 09:41:59ID: 25615917

Got it! Thanks

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...