Поиск, основанный на подстановочных знаках, ограничен тем, что могут предоставить подстановочные знаки, что лучше, чем ничего, но все же не очень много.
Для этого Outlook использует функции Word, поэтому применяется документация VBA для Word .Сами применимые символы подстановки можно увидеть с помощью кнопки «Специальные» в диалоговом окне «Найти» (F4 в Outlook) после того, как флажок «использовать символы подстановки».
Насколько мне известно, понятия «необязательно»«части в подстановочных поисках, что означает, что вам нужно использовать несколько шаблонов, чтобы покрыть ваш случай« иногда есть буква впереди ».
Так что общий подход основан на этих знаниях и на вашем примере кода, будет
- Выберите текущий выбранный
MailItem
в ActiveExplorer
- Для каждого предопределенного шаблона подстановочного знака
- сбросьте диапазон поиска для всего электронного письма
- выполнить поиск по шаблону
- , пока есть результаты поиска
- показать результат, позволить пользователю выбрать или отменить поиск
Таким образом, можно определить несколько паттернов, и у вас есть шанс перейти к следующему удару, если первый удар окажется ложноположительным.
Я нашел паттерн [0-9-]{8;9}
plus MatchWholeWord
доРаботает достаточно хорошо (блоки цифр и тире, длиной от 8 до 9 символов), но реальные данные часто бывают неожиданными.Вам, вероятно, нужно будет добавить больше шаблонов.Обратите внимание: для меня Outlook хочет ;
вместо ,
.Это может зависеть от локали системы, я не уверен.
Также я не фанат "тихого" On Error Resume
.Если есть ошибка, я предпочитаю видеть фактическое сообщение об ошибке.Если есть условие, которое можно проверить, чтобы предотвратить ошибку, я предпочитаю проверять это условие явно.Это делает код более надежным и облегчает отладку.По этой причине в моем Sub
нет строки On Error
.
В коде это будет выглядеть так:
Sub GetCustomer()
Dim olItem As Outlook.MailItem
Dim oRng As Object
Dim sCustomer As String
Dim patterns As Variant, pattern As Variant
Dim answer As VbMsgBoxResult
' bail out if the preconditions are not right
If ActiveExplorer.Selection.Count = 0 Then Exit Sub
If Not (TypeOf ActiveExplorer.Selection.item(1) Is MailItem) Then Exit Sub
Set olItem = ActiveExplorer.Selection.item(1)
Set oRng = olItem.GetInspector.WordEditor.Range
' add more wildcard patterns in descending order of likelyhood
patterns = Array("[0-9-]{8;9}", "[A-Z][0-9-]{8;9}")
For Each pattern In patterns
oRng.WholeStory
While oRng.Find.Execute(findText:=pattern, MatchWildcards:=True, MatchWholeWord:=True)
answer = MsgBox(oRng.Text, vbYesNoCancel + vbQuestion, "Customer Number")
If answer = vbYes Then
With New DataObject
.SetText oRng.Text
.PutInClipboard
End With
Exit For
ElseIf answer = vbCancel Then
Exit For
End If
Wend
Next pattern
End Sub
Установка переменных в Nothing
в концефункция лишняя.