【问题标题】:Outlook creating a new email with lookup to a csv file using vbaOutlook 创建新电子邮件并使用 vba 查找 csv 文件
【发布时间】:2020-05-05 22:08:37
【问题描述】:

我收到一封电子邮件。当它到达时,我需要一个规则来创建一个新的电子邮件(我已经可以在 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 运行的脚本中查找过外部文件。 这就是我需要帮助的地方。

【问题讨论】:

  • 不清楚您正在寻求什么帮助。您列出所需的操作,但不要说您不知道如何执行。请在关闭之前改进您的问题,因为它太模糊了。
  • 要在电子邮件到达时捕获并执行这些操作,您需要一个带有“运行脚本”的 Outlook 规则或一个新项目事件。默认情况下,“运行脚本”现在已禁用,但有些网站会告诉您如何启用它。电子邮件的正文是一个字符串。您可以将其拆分为vbCRLf & vbCRLf 以将每一行放入一个数组元素中,然后将这些行拆分为“:”以获取关键字和值。将 CSV 文件读入内存并在数组中拆分成行很容易。
  • 我了解如何使用脚本运行规则 - 我已经完成了很多工作,包括创建新电子邮件和输出文件。但我从未在 Outlook 运行的脚本中查找过外部文件。这就是我需要帮助的地方。如果输入电子邮件与外部文件匹配,那么我需要使用来自电子邮件和外部文件的信息创建一个输出文件,否则我需要忽略输入电子邮件。希望这更有意义。谢谢
  • 我的回答有帮助吗?

标签: vba outlook


【解决方案1】:

首先,您需要知道您的电子邮件对于 VBA 宏的外观。试试https://stackoverflow.com/a/58000707/973283 中的宏。这是一个诊断宏,可让您查看电子邮件的属性。特别是,它将整个 Text 和 Html 正文以人类可读的格式输出到文件中。 该宏需要引用“Microsoft Scripting Runtime”和“Microsoft ActiveX Data Objects n.n Library”。问你是否不知道那是什么意思。

在宏的顶部附近,您会找到#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。 “If LoadName:”后跟空格,您会看到类似‹s 5› 的内容,代表 5 个空格。

也可能有一个 Html 正文。如果它很简单,则从 Hmtl 正文中提取 LoadName 可能更容易:

<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”文件中看到的内容。

我给自己创建了一封电子邮件,其中包含一个表格,其中包含您电子邮件中的数据。我使用我的诊断宏来创建“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>|

由 Outlook 创建的 Html 正文充满了格式信息。可以从此 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

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2011-12-21
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    相关资源
    最近更新 更多