Кодировка VBA гиблое место. Еле вставил, к сожалению с потерей отступов. Если в коде будет ошибка - то это ошибка по причине кодировки. Если кому нужно вышлю на почту/выложу в файлообменник bas-файл.
А теперь пояснения. Работает без вставки связей (references). Чтобы макрос сработал открываем инспектор письма и запускаем процедуру main. Вот и все. Протестировано на MS Office 2010 x86.
Теперь по настройкам. При активном Outlook'e нажимаем alt + F11, далее поочередно (заранее переключившись на латиницу) alt → i → m. В появившемся модуле сохраняем приведенный макрос.
В самом верху макроса нужно будет поменять 2-3 константы (начинается на Const):
*separator - то чем отделяется строка в парсируемом сообщении (скорее всего менять не нужно будет)
*wbkAddress - адрес папки, в которой находится файл для вставки значений
*fileName - название файла с расширением.
Файл должен соответствовать приведенному шаблону. Это касается как таблицы (адрес колонок), так и листа (все операции по вставки проводятся на первом по счету листе).
Чтобы воспользоваться горячими клавишами alt + цифра, делаем вот что:
Открываем инспектор письма (для 2010, возможно и для 2013), настройка панели быстрого доступа, Выбрать команды из → выбираем макросы, далее выбираем процедуру main. Похоже, что все.
Ах да, про возможные ошибки при выполнении. Если инспектор сообщения не открыт - выдаст удобочитаемую ошибку, если сообщение не парсится - выдаст ту же ошибку. По завершении макрос извести об успешном завершении операции вставки. Возможно надо будет доработать макрос в том смысле, что могут возникнуть проблемы, если файл уже открыт. В таком случае нужно будет вставить несколько строк, которые содержат функцию Dir, но это уже совсем другая история.
Код |
---|
'---------------------------------------------------------------------------------------
' Module : Final
' Author : Fjedor/Vse_Pro100 @ PlanetaExcel.ru
' Date : 23.01.2015
' Purpose : moves parsed data into excel workbook.
' Miscelaneous: Please, make sure the code is properly attributed when used.
'---------------------------------------------------------------------------------------
Option Explicit
Const keys As String = _
"сервер - клиент:клиент - сервер:тестовый объем" ':Пользователь:Дата/время"
Const separator As String = vbNewLine
Const wbkAddress = "C:\book\"
Const fileName = "Test.xlsx"
Const userPattern = "\.*пользователем\s(\.*)\s*в\s*(\d+.\d+.\d+\s\d+:\d+:\d+).*"
Enum ColNames
U = 1 'user
SC = 2 'server-client
CS = 3 'client-server
TV = 4 'test volume
dt = 5 'date/time
End Enum
Function ExtractFromMail(mi As MailItem, Optional sep = vbNewLine)
Dim key, val
Dim StartPos&, EndPos&
Dim txtBody: txtBody = mi.Body
Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
Dim user$, dt$
With CreateObject("vbscript.regexp")
.Pattern = userPattern
With .Execute(txtBody)(0)
user = .SubMatches(0)
dt = .SubMatches(1)
End With
End With
On Error Resume Next
For Each key In Split(keys, ":")
val = Split(txtBody, key)(1)
val = Split(val, separator)(0)
val = Replace(val, ": ", "")
dic.Add key, val
Next key
dic.Add "Пользователь", user
dic.Add "Дата/время", dt
On Error GoTo 0
Set ExtractFromMail = dic
End Function
Sub main()
Dim xl As Object: Set xl = CreateObject("Excel.Application") ': xl.Visible = False ': Set xl = New Excel.Application:
Dim wbk As Object: Set wbk = xl.Workbooks.Open(wbkAddress & fileName)
Dim rng As Object: Set rng = wbk.Worksheets(1).[a2].CurrentRegion
Dim lastRow&: lastRow = rng.Rows.Count
Dim mi As MailItem
Dim i&
On Error Resume Next
Set mi = ActiveInspector.CurrentItem
Dim dic As Object: Set dic = ExtractFromMail(mi)
With rng.Parent
.Cells(lastRow + 1, ColNames.U) = dic("Пользователь")
.Cells(lastRow + 1, ColNames.SC) = dic("сервер - клиент")
.Cells(lastRow + 1, ColNames.CS) = dic("клиент - сервер")
.Cells(lastRow + 1, ColNames.TV) = dic("тестовый объем")
.Cells(lastRow + 1, ColNames.dt) = dic("Дата/время")
End With
On Error GoTo 0
If Err.Number <> 0 Or dic Is Nothing Then
Dim str As String
str = "Инспектор для сообщения не вызван либо сообщение не валидно"
MsgBox str, vbCritical, "Ошибка"
wbk.Close SaveChanges:=False
GoTo Handler
End If
wbk.Close SaveChanges:=True
MsgBox "Записи успешно занесены", vbInformation
Handler:
xl.Quit
Set xl = Nothing: Set wbk = Nothing: Set dic = Nothing
End Sub |