Outlook создает новое письмо с поиском в CSV-файле с помощью VBA - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть входящее письмо. Когда он прибывает, мне нужно правило для создания нового электронного письма (я уже могу сделать это успешно в VBA). Я хочу использовать значение в теле письма для поиска в файле CSV, чтобы увидеть, должно ли входящее письмо генерировать исходящее письмо или нет, а также получить полное имя из файла CSV. Я думал о загрузке файла CSV в массив в VBA ?? например, Файл

Name             Full Name
CEEABS           Absolute Scent
CEEJKL           Jelly and Kohl
ANDFED           Overall Federation

В теле входящего письма будет что-то вроде

Description:  This is a communication from the Estates
LoadName:     CEEJKL
ProviderName: The Nice to have company
ID:           45672-ddc4-4leo-ba6d-faci1b631
TinyID:       6919

Спасибо - Крисси

Я понимаю, как запускать правила с помощью сценариев - у меня есть загрузки уже сделано, включая создание новых писем и выходных файлов. Но я никогда не искал внешний файл из скрипта, запущенного из Outlook. Вот с чем мне нужна помощь.

1 Ответ

0 голосов
/ 05 мая 2020

Сначала вам нужно узнать, как выглядит ваша электронная почта в макросе VBA. Попробуйте макрос в { ссылка }. Это макрос диагностики c, который позволяет просматривать свойства электронной почты. В частности, он выведет весь текст и Html тела в файл в удобочитаемом формате. Макрос нуждается в ссылках на «Среду выполнения сценариев Microsoft» и «Объекты данных Microsoft ActiveX в библиотеке». Спросите, если вы не знаете, что это значит.

В верхней части макроса вы найдете #Const Selected = True. Замените это на #Const Selected = False. Выберите одно из этих писем и запустите макрос InvestigateEmails(). Изучите файл InvestigateEmails.txt, который будет на вашем рабочем столе. Я предполагаю, что текстовое тело будет выглядеть примерно так:

Description:‹t›This is a communication from the Estates‹c›‹l›
LoadName:‹t›CEEJKL‹c›‹l›
ProviderName:‹t›The Nice to have company‹c›‹l›
ID:‹t›45672-ddc4-4leo-ba6d-faci1b631‹c›‹l›
TinyID:‹t›6919‹c›‹l›

В приведенном выше предположении: ‹t› представляет tab, ‹c› представляет carriage return и ‹l› представляет linefeed. «Если LoadName:» сопровождается пробелами, вы увидите что-то вроде ‹s 5›, которое представляет 5 пробелов.

Также может быть тело Html. Может быть проще извлечь LoadName из тела Hmtl, если это что-то простое:

<table>
  <tr><td>Description:</td><td>This is a communication from the Estates</td></tr>
  <tr><td>LoadName:</td><td>CEEJKL</td></tr>
  <tr><td>ProviderName:</td><td>The Nice to have company</td></tr>
  <tr><td>ID:</td><td>45672-ddc4-4leo-ba6d-faci1b631</td></tr>
  <tr><td>TinyID:</td><td>6919</td></tr>
</table>

Пожалуйста, сообщите, что вы видите в файле «InvestigateEmails.txt».

Я создал электронное письмо, содержащее таблицу с данными из вашего письма. Я использовал свой макрос диагноза c для создания «InvestigateEmails.txt». Важный раздел этого текстового файла:

Text: |Description:‹2 crlf›|
      |This is a communication from the Estates‹2 crlf›|
      |LoadName:‹2 crlf›|
      |CEEJKL‹2 crlf›|
      |ProviderName:‹2 crlf›|
      |The Nice to have company‹2 crlf›|
      |ID:‹2 crlf›|
      |45672-ddc4-4leo-ba6d-faci1b631‹2 crlf›|
      |TinyID:‹2 crlf›|
      |6919‹2 crlf›|
      | ‹crlf›|
Html: |<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmln|
 : : : : : :
      |WordSection1><table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 style='border-collapse:c|
      |ollapse;border:none'><tr><td width=312 valign=top style='width:233.75pt;border:solid windowtext 1.0p|
      |t;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span style='font-size:10.0pt;font-family:"inherit|
      |",serif;color:#242729;border:none windowtext 1.0pt;padding:0cm;mso-fareast-language:EN-GB'>Descripti|
      |on:</span><o:p></o:p></p></td><td width=312 valign=top style='width:233.75pt;border:solid windowtext|
      | 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span style='font-size:10.0p|
      |t;font-family:"inherit",serif;color:#242729;border:none windowtext 1.0pt;padding:0cm;mso-fareast-lan|
      |guage:EN-GB'>This is a communication from the Estates</span><o:p></o:p></p></td></tr><tr><td width=3|
      |12 valign=top style='width:233.75pt;border:solid windowtext 1.0pt;border-top:none;padding:0cm 5.4pt |
      |0cm 5.4pt'><p class=MsoNormal><span style='font-size:10.0pt;font-family:"inherit",serif;color:#24272|
      |9;border:none windowtext 1.0pt;padding:0cm;mso-fareast-language:EN-GB'>LoadName:</span><o:p></o:p></|
      |p></td><td width=312 valign=top style='width:233.75pt;border-top:none;border-left:none;border-bottom|
      |:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt'><p class=Ms|
      |oNormal><span style='font-size:10.0pt;font-family:"inherit",serif;color:#242729;border:none windowte|
      |xt 1.0pt;padding:0cm;mso-fareast-language:EN-GB'>CEEJKL</span><o:p></o:p></p></td></tr><tr><td width|
      |=312 valign=top style='width:233.75pt;border:solid windowtext 1.0pt;border-top:none;padding:0cm 5.4p|
      |t 0cm 5.4pt'><p class=MsoNormal><span style='font-size:10.0pt;font-family:"inherit",serif;color:#242|
      |729;border:none windowtext 1.0pt;padding:0cm;mso-fareast-language:EN-GB'>ProviderName:</span><o:p></|
      |o:p></p></td><td width=312 valign=top style='width:233.75pt;border-top:none;border-left:none;border-|
      |bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt'><p cl|
      |ass=MsoNormal><span style='font-size:10.0pt;font-family:"inherit",serif;color:#242729;border:none wi|
      |ndowtext 1.0pt;padding:0cm;mso-fareast-language:EN-GB'>The Nice to have company</span><o:p></o:p></p|
      |></td></tr><tr><td width=312 valign=top style='width:233.75pt;border:solid windowtext 1.0pt;border-t|
      |op:none;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span style='font-size:10.0pt;font-family:"i|
      |nherit",serif;color:#242729;border:none windowtext 1.0pt;padding:0cm;mso-fareast-language:EN-GB'>ID:|
      |</span><o:p></o:p></p></td><td width=312 valign=top style='width:233.75pt;border-top:none;border-lef|
      |t:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0c|
      |m 5.4pt'><p class=MsoNormal><span style='font-size:10.0pt;font-family:"inherit",serif;color:#242729;|
      |border:none windowtext 1.0pt;padding:0cm;mso-fareast-language:EN-GB'>45672-ddc4-4leo-ba6d-faci1b631<|
      |/span><o:p></o:p></p></td></tr><tr><td width=312 valign=top style='width:233.75pt;border:solid windo|
      |wtext 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span style='font-size:1|
      |0.0pt;font-family:"inherit",serif;color:#242729;border:none windowtext 1.0pt;padding:0cm;mso-fareast|
      |-language:EN-GB'>TinyID:</span><o:p></o:p></p></td><td width=312 valign=top style='width:233.75pt;bo|
      |rder-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.|
      |0pt;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span style='font-size:10.0pt;font-family:"inher|
      |it",serif;color:#242729;border:none windowtext 1.0pt;padding:0cm;mso-fareast-language:EN-GB'>6919</s|
      |pan><o:p></o:p></p></td></tr></table><p class=MsoNormal><o:p>&nbsp;</o:p></p></div></body></html>|

Тело Html, созданное в Outlook, полно информации о форматировании. Из этого Html можно извлечь данные, но было бы легче извлечь его из текста. Почти каждое письмо, которое я получаю с телом Html, имеет текстовое тело в этом формате. Я уверен, что когда Outlook получает электронное письмо без текстового тела, оно создает его, беря тело Html, отбрасывая все теги и вставляя два vbCrLfs после каждого отброшенного тега блока. Результирующее текстовое тело обычно легко обрабатывать.

Игнорируя проблему извлечения кода компании из электронного письма до тех пор, пока не будет известен формат электронного письма, этот макрос Outlook демонстрирует, как открыть рабочую книгу и извлечь значение ячейки.

Option Explicit
Sub DemoGetCompanyName()

  ' Required reference to "Microsoft Excel nn.n Object Library" where "nn.n"
  ' depends on the version of Office installed.

  ' Change to reference your workbook and worksheet
  Const WbkName As String = "CompanyCodes.xlsx"
  Const WshtName As String = "Codes"

  ' I avoid names starting "xl" or "ol" so as to prevent a clash
  ' with a Microsoft name

  Dim CompCode As String
  Dim CompName As String
  Dim ExlApp As Excel.Application
  Dim Path As String
  Dim Rng As Excel.Range
  Dim WbkComp As Excel.Workbook
  Dim WshtCodes As Excel.Worksheet

  ' Replace with code to extract company code from email
  CompCode = "CEEJKL"

  Path = CreateObject("WScript.Shell").specialfolders("Desktop")

  Set ExlApp = Application.CreateObject("Excel.Application")

  With ExlApp
    .Visible = True         ' This slows your macro but helps during debugging
    .ScreenUpdating = False ' Reduces flash and increases speed if you write to workbook
    ' Open workbook read only
    Set WbkComp = .Workbooks.Open(Path & "\" & WbkName, , True)
  End With

  With WbkComp
    Set WshtCodes = .Worksheets(WshtName)
  End With

  With WshtCodes
    Set Rng = Cells.Find(What:=CompCode, After:=.Range("A1"), LookIn:=xlValues, _
                         LookAt:=xlWhole, SearchOrder:=xlByRows, _
                         SearchDirection:=xlNext, MatchCase:=False, _
                         SearchFormat:=False)
    If Rng Is Nothing Then
      ' Code not found
      Debug.Assert False
      CompName = ""
    Else
      CompName = .Cells(Rng.Row, 2).Value
    End If
  End With

  ' Close workbook and tidy up
  Set WshtCodes = Nothing
  WbkComp.Close
  Set WbkComp = Nothing
  ExlApp.Quit
  Set ExlApp = Nothing

  Debug.Print CompCode & " -> " & CompName

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...