我需要从Excel在特定时间范围内计算Outlook中的电子邮件。我暂时把时间表硬编码了。这部分似乎起作用了,至少计数是正确的。
我需要新邮件的数量。它计算每一封电子邮件,而不仅仅是原件。
我看了看.GetConversation
,然后读到conversationID
随着每封电子邮件的变化而变化,所以原件有44个字符。我认为这将是一个很好的方式来过滤,但我不明白什么是在该属性,因为它不工作。
它一直工作,直到它尝试按会话ID进行筛选。
Sub cntEmail()
'I WILL NEVER COUNT EMAILS AGAIN, dangit
Dim ns As Namespace: Set ns = GetNamespace(Type:="MAPI")
Dim fldr As Folder, fldrDone As Outlook.Folder
Dim inboxItems As Items, doneItems As Items, sFilter As String
Set fldr = ns.Folders("Call Center").Folders("Inbox")
Set fldrDone = ns.Folders("Call Center").Folders("DONE")
Set inboxItems = fldr.Items
Set doneItems = fldrDone.Items
sFilter = "[LastModificationTime] > '" & Format("1/13/2023 17:00", "ddddd h:mm AMPM") & "' AND [LastModificationTime] < '" & Format("1/20/2023 16:59", "ddddd h:mm AMPM") & "'"
Set inboxItems = inboxItems.Restrict(sFilter)
Set doneItems = doneItems.Restrict(sFilter)
Debug.Print "Total Inbox Count: " & inboxItems.Count
Debug.Print "Total Done Count: " & doneItems.Count
'Everything above this comment works
Set inboxItems = inboxItems.Restrict("[ConversationID] < 45")
Set doneItems = doneItems.Restrict("[ConversationID] < 45")
Debug.Print "Total Inbox Count: " & inboxItems.Count
Debug.Print "Total Done Count: " & doneItems.Count
Set fldr = Nothing
Set fldrDone = Nothing
Set ns = Nothing
End Sub
2条答案
按热度按时间06odsfpq1#
会话ID
据我所知,
ConversationID
是一个属性,对于属于同一个会话的所有mailItem都具有相同的值(更多的是here)。这意味着,如果您回复了一封电子邮件,并且对方回复了您的回复,则您从他们那里收到的第二封电子邮件应该具有相同的
ConversationID
。我假设,当你说你想计算“原始电子邮件”,你的意思是你想避免计算第二封电子邮件,因为它是由第一封(原始)电子邮件发起的对话的一部分。
因此,基本上,您需要计算mailItem中有多少个唯一的ConversationID值。
我没有使用过
.Restrict
,所以我不确定是否可以将其用于此目的,但有一些方法可以通过在MailItems
上循环并计算唯一值来获得ConversationID
的唯一值总数。选项一:使用集合
一种方法是使用集合。因为一个集合不能包含两个键相同的元素,所以我们可以用它来计算唯一值的数量。
例如:
选项二:使用字典
字典解决方案更优雅一点,因为我们不需要使用
On error
语句。当我们使用字典时,我们不会得到错误的原因是,当键已经存在于字典中时,我们只会覆盖存储的值。
例如:
如果你有很多电子邮件,字典方法通常更快,但我没有注意到我做的小测试有很大的区别。
fdbelqdn2#
您不能创建像
[ConversationID] < 45
这样的属性长度限制(在Extended MAPI中可以,但只能在C++或 Delphi 中使用)。尝试创建PR_SUBJECT_PREFIX
MAPI属性为空字符串的限制。在回复上是"RE"
,在转发上是"FW"
。在代码中: