【问题标题】:Grab an email with specific subject that was received today only获取仅在今天收到的带有特定主题的电子邮件
【发布时间】:2022-01-26 17:39:54
【问题描述】:

我正在尝试从 Outlook 中提取一封电子邮件并获取该电子邮件中附加的 Excel 表格。代码工作正常,除了我不明白如何让 VBA 代码只抓取今天的电子邮件,否则它会继续抓取前几天的电子邮件并保存当前日期的大量文件。

这是我的代码:

Sub ExportOutlookTableToExcel()
Dim oLookInspector As Inspector
Dim oLookMailitem As MailItem

Dim oLookWordDoc As Word.Document
Dim oLookWordTbl As Word.Table

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlWrkSheet As Excel.Worksheet

'Grab Email Item
 Set oLookMailitem = Application.ActiveExplorer.CurrentFolder.Items("Apples Sales")

 Set oLookInspector = oLookMailitem.GetInspector

 Set oLookWordDoc = oLookInspector.WordEditor

 'Create a New Excel App
 Set xlApp = New Excel.Application

xlApp.Visible = True

Set xlBook = xlApp.Workbooks.Add
Set xlWrkSheet = xlBook.Worksheets.Add

Set oLookWordTbl = oLookWordDoc.Tables(2)
oLookWordTbl.Range.Copy
xlWrkSheet.Paste Destination:=xlWrkSheet.Range("A1")
xlBook.SaveAs FileName:="xxx" & Format(Now, "yyyy-mm-dd") & ".xlsx"

End Sub

【问题讨论】:

标签: excel vba outlook ms-word


【解决方案1】:

你需要先对Items集合进行排序,然后抓取第一个匹配项:

set folder = Application.ActiveExplorer.CurrentFolder
set items = fodler.Items
items.Sort "ReceivedTime", true 'sort in descending order
set oLookMailitem = items.Find("[Subject] = 'Apples Sales'")
if not (oLookMailitem is Null) Then
  ..
End If

【讨论】:

  • 去掉括号(见上文)。
  • 谢谢!它有效!
  • 如果帖子回答了您的问题,请将其标记为此类。谢谢!
【解决方案2】:

要在 Outlook 中仅查找今天的电子邮件,您可以使用 Items 类的 Find/FindNextRestrict 方法。在以下文章中详细了解这些方法:

例如,要查找特定日期的项目,您可以在 C# 中使用以下代码:

private void FindItems(Outlook.MAPIFolder folder)
{
    string dateTimeStart = DateTime.Now.ToString("MM/dd/yyyy hh:mm tt");
    DateTime dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                               DateTime.Now.Day, 0, 0, 0, 0);
    string dateTimeEnd = dt.ToString("MM/dd/yyyy hh:mm tt");
    string searchCriteria = "[ReceivedTime]<=\"" + dateTimeEnd + "\"";
    StringBuilder strBuilder = null;
    int counter = default(int);
    Outlook.MailItem mailItem = null;
    Outlook.Items folderItems = null;
    object resultItem = null;
    try
    {
        folderItems = folder.Items;
        folderItems.Sort("[ReceivedTime]");
        if (folderItems.Count > 0)
        {
            resultItem = folderItems.Find(searchCriteria);
            if (resultItem != null)
            {
                strBuilder = new StringBuilder();
                do
                {
                    if (resultItem is Outlook.MailItem)
                    {
                        counter++;
                        mailItem = resultItem as Outlook.MailItem;
                        strBuilder.AppendLine("#" + counter.ToString() +
                                              "\tSubject: " + appItem.Subject);
                    }
                    Marshal.ReleaseComObject(resultItem);
                    resultItem = folderItems.FindNext();
                }
                while (resultItem != null);
            }
        }
        if (strBuilder != null)
            Debug.WriteLine(strBuilder.ToString());
        else
            Debug.WriteLine("There is no match in the " +
                               folder.Name + " folder.");
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
    }
    finally
    {
        if (folderItems != null) Marshal.ReleaseComObject(folderItems);
    }
}

在 VBA 中,您可以使用 Format 函数准备日期时间对象以在 Outlook 搜索条件中使用:

sFilter = "[ReceivedTime] > '" & Format("12/28/2021 0:00am", "ddddd h:nn AMPM") & "'"

注意,您可以将搜索字符串与任何其他属性(例如 Subject 行)结合使用。只需在搜索字符串中使用 AND 运算符即可。在String (for Text fields) 部分阅读有关字符串运算符的更多信息。

您还可能会发现Application 类的AdvancedSearch 方法很有帮助。在 Outlook 中使用AdvancedSearch 方法的主要好处是:

  • 搜索在另一个线程中执行。您无需手动运行另一个线程,因为 AdvancedSearch 方法会在后台自动运行它。
  • 可以在任何位置(即超出某个文件夹的范围)搜索任何项目类型:邮件、约会、日历、便笺等。 RestrictFind/FindNext 方法可以应用于特定的 Items 集合(请参阅 Outlook 中 Folder 类的 Items 属性)。
  • 完全支持 DASL 查询(自定义属性也可用于搜索)。您可以在 MSDN 中的 Filtering 文章中阅读有关此内容的更多信息。为了提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅Store 类的IsInstantSearchEnabled 属性)。
  • 您可以随时使用Search 类的Stop 方法停止搜索过程。

Advanced search in Outlook programmatically: C#, VB.NET 文章中了解有关此方法的更多信息。

【讨论】:

  • 当我使用 Restrict(sFilter) Set oLookInspector = Items.GetInspector 时显示:“对象不支持此属性或方法”。这是我对代码的补充:` sFilter = "[Subject] = 'APPLES SALES' AND [ReceivedTime] = '" & Format(Now, "yyyy-mm-dd") & "'" Set Items = Inbox.Items .Restrict(sFilter) 设置 oLookInspector = Items.GetInspector`
  • GetInspector 方法可用于 Outlook 项目,例如 MailItem、AppointmentItem 等。但您似乎正试图针对 Items 集合对象调用它。相反,从集合中获取一个项目并调用GetInspector 方法。
猜你喜欢
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多