首先,您需要知道您的电子邮件对于 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> </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