Excel VBA Code to strip IdNumbers and Names from a long string imported from another system
I am trying to isolate the employeeID and name from a long string which contains many records with this information. I want to extract the 2 fields per record from the string and store them in a range on the excel sheet.
The problem is the data is not normalized. Sometimes it has employee ID and name for each record, sometimes just a name and sometimes the string has both types in the same string.
If I can find the no visible character in the string which separates the records it should be fairly easy to separate the records and then extract the data from each record
I attach an excel file and would love to get some code which can extract the data from the 3 cases on the sheet
I have spent hours getting lost in endless loops on this but I know the best way is to find the record breaker first I just don't know What it is ExpertsExchange.xlsx
VBAMicrosoft ExcelMicrosoft Office
Last Comment
Fabrice Lambert
8/22/2022 - Mon
Fabrice Lambert
It looks like employeeID is a number encoded on 5 digits.
So, I would use a regex:
Option ExplicitOption Base 0Public Sub test() Dim rawData As String Dim row(0 To 1) As String Dim data As Collection Dim rx As Object Dim matchs As Object Dim match As Object rawData = ThisWorkbook.Worksheets(1).Range("C2").Value Set data = New Collection Set rx = CreateObject("VBScript.Regexp") rx.MultiLine = True rx.Global = True rx.Pattern = "(?:(\d{5}) )?([^\r\n""]+)$" Set matchs = rx.Execute(rawData) For Each match In matchs row(0) = match.SubMatches(0) '// employeeID if it exist row(1) = match.SubMatches(1) '// employee name data.Add row Next Set matchs = Nothing Set rx = Nothing '// do whatever you want with the data collection '// cleanup Set data = NothingEnd Sub
Try this, using line feed character (10) as delimiter
Option ExplicitSub GetDataFromString() Dim ws As Worksheet Dim arStr() As String Dim rw As Integer Set ws = ThisWorkbook.Worksheets("Sheet1") arStr = Split(ws.Range("C2").Value, Chr(10)) For rw = LBound(arStr, 1) To UBound(arStr, 1) If Len(arStr(rw)) > 0 Then If Asc(Left(arStr(rw), 1)) >= 48 And Asc(Left(arStr(rw), 1)) <= 57 Then ws.Range("B" & rw + 6) = Left(arStr(rw), InStr(1, arStr(rw), " ") - 1) ws.Range("C" & rw + 6) = Mid(arStr(rw), InStr(1, arStr(rw), " ") + 1, 100) Else ws.Range("C" & rw + 6) = arStr(rw) End If End If Next rwEnd Sub
So, I would use a regex:
Open in new window