Використання регулярних виразів в VBA для вилучення тексту з повідомлень Outlook

  1. Отримання двох і більше значень з повідомлення
  2. Використання функції RegEx
  3. Корисні посилання

Є кілька способів пошуку певного тексту в тілі листа за допомогою VBA. Можна скористатися функціями InStr, Len, Left або Right, щоб знайти і витягти текст, а можна скористатися регулярними виразами. Саме про застосування регулярних виразів в коді VBA піде мова в даній статті.

Наприклад, потрібно витягти код відстеження посилки UPS, відправленої з Amazon.com. Такий код має формат як на скріншете нижче:

Потрібно знаходити в тексті слова «Carrier Tracking ID», потім, можливо, пробіл і двокрапка.

.Pattern = "(Carrier Tracking ID \ s * [:] + \ s * (\ w *) \ s *)"

Такий вираз витягне з тексту з прикладу цифро-буквений код 1Z2V37F8YW51233715.

Використовуйте \ s * для визначення невідомої кількості прогалин (прогалини, символи табуляції, перекладу рядка і т.д.)
Використовуйте \ d * для визначення тільки цифр
Використовуйте \ w * для визначення цифро-буквених символів, як використовуються в кодах відстеження кур'єрської служби UPS.

Щоб використовувати цей зразок коду відкрийте редактор VBA за допомогою комбінації Alt + F11. Правою кнопкою миші натисніть на Проекті і виберіть Insert> Module. Скопіюйте та вставте код макросу в модуль. Для роботи макросу потрібно задіяти бібліотеку Microsoft VBScript Regular Expressions 5.5 в меню Tools -> References ... VBA-редактора:

Якщо включена бібліотека VBScript Expressions 1, то вимкніть її знявши відповідну галочку. Неможливо одночасно використовувати v1 і v5.5.

Sub GetValueUsingRegEx () 'Підключіть бібліотеку VB Script' Microsoft VBScript Regular Expressions 5.5 Dim olMail As Outlook.MailItem Dim Reg1 As RegExp Dim M1 As MatchCollection Dim M As Match Set olMail = Application.ActiveExplorer (). Selection (1) 'Debug.Print olMail.Body Set Reg1 = New RegExp '\ ​​s * = приховані прогалини' \ d * = цифри '\ w * = цифро-буквені вирази With Reg1 .Pattern = "Carrier Tracking ID \ s * [:] + \ s * ( \ w *) \ s * ".Global = True End With If Reg1.test (olMail.Body) Then Set M1 = Reg1.Execute (olMail.Body) For Each M In M1 'M.SubMatches (1) is the ( \ w *) in the pattern 'use M.SubMatches (2) for the second one if you have two (\ w *) Debug. Print M.SubMatches (1) Next End If End Sub

Sub GetValueUsingRegEx () 'Підключіть бібліотеку VB Script' Microsoft VBScript Regular Expressions 5.5 Dim olMail As Outlook.MailItem Dim Reg1 As RegExp Dim M1 As MatchCollection Dim M As Match Set olMail = Application.ActiveExplorer (). Selection (1) 'Debug.Print olMail.Body Set Reg1 = New RegExp '\ ​​s * = приховані прогалини' \ d * = цифри '\ w * = цифро-буквені вирази With Reg1 .Pattern = "Carrier Tracking ID \ s * [:] + \ s * ( \ w *) \ s * ".Global = True End With If Reg1.test (olMail.Body) Then Set M1 = Reg1.Execute (olMail.Body) For Each M In M1 'M.SubMatches (1) is the ( \ w *) in the pattern 'use M.SubMatches (2) for the second one if you have two (\ w *) Debug.Print M.SubMatches (1) Next End If End Sub

Якщо будемо шукати тільки двокрапка .Pattern = "([:] + \ s * (\ w *) \ s *)", тоді код поверне тільки перше слово після двокрапки з кожного рядка:

UPS
May
Standard
1Z2V37F8YW51233715
Diane

Це тому, що (\ w *) вказує, що потрібно отримати наступну після двокрапки цифро-буквену рядок, не всю рядок, і не включати прогалини.

Отримання двох і більше значень з повідомлення

Якщо вам потрібно використовувати два або кілька шаблонів, то можна повторити частину c With Reg1 до End If, для кожного з шаблонів або скористатися оператором Case.

Код нижче здійснює пошук по трьом шаблонами, створює рядок і додає її в поле теми повідомлення. Кожен Case представляє свій шаблон. У цьому прикладі відшукується тільки перше входження кожного шаблону. .Global = False вказує, що потрібно зупинитися, коли знаходиться перший збіг.

Дані, які ми шукаємо мають такий вигляд:

Order ID: VBNSA-123456
Order Date: 09 AUG 2013
Total $ 54.65

/ N в кінці шаблону відповідає кінцю рядка, а strSubject = Replace (strSubject, Chr (13), "") видаляє будь-які переноси рядки.

Sub GetValueUsingRegEx () Dim olMail As Outlook.MailItem Dim Reg1 As RegExp Dim M1 As MatchCollection Dim M As Match Dim strSubject As String Dim testSubject As String Set olMail = Application.ActiveExplorer (). Selection (1) Set Reg1 = New RegExp For i = 1 To 3 With Reg1 Select Case i Case 1 .Pattern = "(Order ID \ s [:] ([\ w- \ s] *) \ s *) \ n" .Global = False Case 2 .Pattern = " (Date [:] ([\ w- \ s] *) \ s *) \ n ".Global = False Case 3 .Pattern =" (([\ d] * \. [\ d] *)) \ s * \ n ".Global = False End Select End With If Reg1.test (olMail.Body) Then Set M1 = Reg1.Execute (olMail.Body) For Each M In M1 Debug. Print M.SubMatches (1) strSubject = M.SubMatches (1) strSubject = Replace (strSubject, Chr (13), "") testSubject = testSubject & ";" & Trim (strSubject) Debug. Print i & testSubject Next End If Next i Debug. Print olMail.Subject & testSubject olMail.Subject = olMail.Subject & testSubject olMail.Save Set Reg1 = Nothing End Sub

Sub GetValueUsingRegEx () Dim olMail As Outlook.MailItem Dim Reg1 As RegExp Dim M1 As MatchCollection Dim M As Match Dim strSubject As String Dim testSubject As String Set olMail = Application.ActiveExplorer (). Selection (1) Set Reg1 = New RegExp For i = 1 To 3 With Reg1 Select Case i Case 1 .Pattern = "(Order ID \ s [:] ([\ w- \ s] *) \ s *) \ n" .Global = False Case 2 .Pattern = " (Date [:] ([\ w- \ s] *) \ s *) \ n ".Global = False Case 3 .Pattern =" (([\ d] * \. [\ d] *)) \ s * \ n ".Global = False End Select End With If Reg1.test (olMail.Body) Then Set M1 = Reg1.Execute (olMail.Body) For Each M In M1 Debug.Print M.SubMatches (1) strSubject = M .SubMatches (1) strSubject = Replace (strSubject, Chr (13), "") testSubject = testSubject & ";" & Trim (strSubject) Debug.Print i & testSubject Next End If Next i Debug.Print olMail.Subject & testSubject olMail.Subject = olMail.Subject & testSubject olMail.Save Set Reg1 = Nothing End Sub

Використання функції RegEx

Ця функція дозволяє використовувати регулярний вираз в більш ніж одному макросі.

Якщо вам потрібно використовувати більш ніж один шаблон з функцією, задайте для шаблон в макросі regPattern = "([0-9] {4})" і використовуйте це в функції: regEx.Pattern = regPattern. Не забудьте додати Dim regPattern As String в верхній частині модуля.

Function ExtractText (Str As String) 'As String Dim regEx As New RegExp Dim NumMatches As MatchCollection Dim M As Match' цей шаблон шукає 4 поспіль йдуть цифри в темі листа regEx.Pattern = "([0-9] {4})" 'використовуючи це, якщо потрібно задвать різні шаблони' regEx.Pattern = regPattern Set NumMatches = regEx.Execute (Str) If NumMatches.Count = 0 Then ExtractText = "" Else Set M = NumMatches (0) ExtractText = M.SubMatches (0 ) End If code = ExtractText End Function

Function ExtractText (Str As String) 'As String Dim regEx As New RegExp Dim NumMatches As MatchCollection Dim M As Match' цей шаблон шукає 4 поспіль йдуть цифри в темі листа regEx.Pattern = "([0-9] {4})" 'використовуючи це, якщо потрібно задвать різні шаблони' regEx.Pattern = regPattern Set NumMatches = regEx.Execute (Str) If NumMatches.Count = 0 Then ExtractText = "" Else Set M = NumMatches (0) ExtractText = M.SubMatches (0 ) End If code = ExtractText End Function

Цей макрос показує, як використовувати функцію Regex. Якщо в темі листа є відповідна шаблоном комбінація (в приклад функції, 4-х значне число), то буде створено відповідь. Якщо немає, то з'являється вікно з повідомленням. Щоб використовувати функцію з різними макросами, розкоментуйте рядки, що містять regPattern.

Dim code As String 'Dim regPattern As String Sub RegexTest () Dim Item As MailItem Set Item = Application.ActiveExplorer.Selection.Item (1)' використовуйте для передачі шаблону в функцію 'regPattern = "([0-9] {4} ) "ExtractText (Item.Subject) If Not code =" "Then Set myReply = Item.Reply myReply.Display Else MsgBox" Тема не містить 4-х значного числа "End If End Sub

Dim code As String 'Dim regPattern As String Sub RegexTest () Dim Item As MailItem Set Item = Application.ActiveExplorer.Selection.Item (1)' використовуйте для передачі шаблону в функцію 'regPattern = "([0-9] {4} ) "ExtractText (Item.Subject) If Not code =" "Then Set myReply = Item.Reply myReply.Display Else MsgBox" Тема не містить 4-х значного числа "End If End Sub

джерело

Корисні посилання