0
votes

I am looking to have a macro that will search through all messages in a folder and extract a partially unique number in each email. Example, I have an email that contains a number, 987654321 and another email that contains 987542132 both of these numbers have the first 3 didgets in common, '987'. How can i write in so it will search trough and extract all of those numbers from the message, but not the entire message? If I could place in specific date ranges for when the messages where recieved, that would be nice too.

Here is the current code I have, which when I select a folder in outlook, it will extract all the messages within that folder and export to a spreadsheet w/ the subject, received time and body. I just want those specific numbers though!

Sub ExportMessagesToExcel()
    Dim olkMsg As Object, _
        excApp As Object, _
        excWkb As Object, _
        excWks As Object, _
        intRow As Integer, _
        intVersion As Integer, _
       strFilename As String
        strFilename = InputBox("Enter a filename and path to save the messages to.", "Export Messages to Excel")
    If strFilename <> "" Then
        intVersion = GetOutlookVersion()
        Set excApp = CreateObject("Excel.Application")
        Set excWkb = excApp.Workbooks.Add()
        Set excWks = excWkb.ActiveSheet
        'Write Excel Column Headers
        With excWks
            .Cells(1, 1) = "Subject"
            .Cells(1, 2) = "Received"
            .Cells(1, 3) = "Body"
        End With
        intRow = 2
        'Write messages to spreadsheet
        For Each olkMsg In Application.ActiveExplorer.CurrentFolder.Items
            'Only export messages, not receipts or appointment requests, etc.
            If olkMsg.Class = olMail Then
                'Add a row for each field in the message you want to export
                excWks.Cells(intRow, 1) = olkMsg.Subject
                excWks.Cells(intRow, 2) = olkMsg.ReceivedTime
                excWks.Cells(intRow, 3) = FindNum(olkMsg.Body, "2014", 14)                    intRow = intRow + 1
            End If
        Next
        Set olkMsg = Nothing
        excWkb.SaveAs strFilename
        excWkb.Close
    End If
    Set excWks = Nothing
    Set excWkb = Nothing
    Set excApp = Nothing
    MsgBox "Completed.  A total of " & intRow - 2 & " messages were exported.", vbInformation + vbOKOnly, "Export messages to Excel"
End Sub

Function GetOutlookVersion() As Integer
    Dim arrVer As Variant
    arrVer = Split(Outlook.Version, ".")
    GetOutlookVersion = arrVer(0)
End Function

Function FindNum(bodyText As String, lead As String, numDigits As Integer) As String Dim counter As Long Dim test As String Dim digits As String For counter = 1 To numDigits - Len(4) digits = digits & "10" Next counter For counter = 1 To Len(bodyText) - numDigits test = Mid(bodyText, counter, numDigits) If test Like lead & digits Then FindNum = test Exit For End If Next counter End Function

1
Do these numbers always have the same number of digits?MattB
Yes, all the numbers will always be the same number of digits.Crosenb
See my answer below. You can pass the body text from the mailitem, the 3 digit lead, and the number of digits in the string you are looking for and it will return the first occurence of a string consisting only of numeric characters with the lead you specify from the body text of the message.MattB

1 Answers

1
votes

This will find and return a string of numeric only characters of a length you specify with a lead you specify from a longer string. Think of it as an InStr that uses a wildcard to only return a numeric value. I had to do something like this for a project once.

Function FindNum(bodyText As String, lead As String, numDigits As Integer) As String
Dim counter As Long
Dim test As String
Dim digits As String
For counter = 1 To numDigits - Len(lead)
    digits = digits & "#"
Next counter
For counter = 1 To Len(bodyText) - numDigits
    test = Mid(bodyText, counter, numDigits)
    If test Like lead & digits Then
        FindNum = test
        Exit For
    End If
Next counter
End Function