使用SetColumns方法时如何访问项目数据?
我已使用myItems.SetColumns ("SentOn")
缓存了SentOn数据。
Item.Body返回“”。
Sub HowManyEmails()
Dim objOutlook As Object, objnSpace As Object, objFolder As MAPIFolder
Dim EmailCount As Integer
Set objOutlook = CreateObject("Outlook.Application")
Set objnSpace = objOutlook.GetNamespace("MAPI")
On Error Resume Next
Set objFolder = objnSpace.Folders("Inbox")
If Err.Number <> 0 Then
Err.Clear
MsgBox "No such folder."
Exit Sub
End If
EmailCount = objFolder.Items.Count
MsgBox "Number of emails in the folder: " & EmailCount, , "email count"
Dim dateStr As String
Dim myItems As Outlook.Items
Dim myItem As Outlook.MailItem
Dim dict As Object
Dim msg As String
Dim CurrDate
Set CurrDate = Now
Dim opnTkt
Dim clsTkt As Integer
Dim omntrRprt As Integer
Dim webCht As Integer
Set dict = CreateObject("Scripting.Dictionary")
Set myItems = objFolder.Items
myItems.SetColumns ("SentOn")
'Determine date of each message:
For Each myItem In myItems
dateStr = GetDate(myItem.SentOn)
If Month(dateStr) <> Month(Now) Then
Defaults = Defaults + 1
'here myItem.Body return ""
ElseIf InStr(myItem.Body, "Process started") > 0 Then
omntrRprt = omntrRprt + 1
Else
def = def + 1
End If
Next myItem
'Output counts per day:
msg = ""
msgs = "omniture: " & vbCrLf & omntrRprt & "Web Chat:" & webCht & vbCrLf
MsgBox msgs
Set objFolder = Nothing
Set objnSpace = Nothing
Set objOutlook = Nothing
End Sub
Function GetDate(dt As Date) As String
GetDate = Year(dt) & "-" & Month(dt) & "-" & Day(dt)
End Function
答案 0 :(得分:0)
Thanx为您的解决方案,实际上当我们使用'SetColumns()'并设置任何变量的值,就像我使用myItems.SetColumns ("SentOn")
一样,您无法访问该项目的其他属性。所以只需删除它并运行代码即可。 :)
please go through the link
答案 1 :(得分:0)
如果您使用的是SetColumns,则无法访问Body或HTMLBOdy。来自https://msdn.microsoft.com/en-us/vba/outlook-vba/articles/items-setcolumns-method-outlook?f=255&MSPPError=-2147217396:
在集合的特定属性上应用SetColumns方法后,您无法读取该集合的其他属性;未缓存的属性将返回空。您也不能写入该集合的任何属性。或者,如果您需要读写,快速访问一组项目,请使用Table对象。
无法使用SetColumns,并且会导致出现任何返回对象的属性的错误。它不能与以下属性一起使用:
| AutoResolvedWinner | InternetCodePage | |车身| MeetingWorkspaceURL | | BodyFormat | MEMBERCOUNT | |分类| ReceivedByEntryID | |儿童| ReceivedOnBehalfOfEntryID | |类| RecurrenceState | |公司| ReplyRecipients | |的DLName | ResponseState | | DownloadState |保存| |的EntryID |发送| | HTMLBody |提交| | IsConflict | VotingOptions |无法使用SetColumns方法缓存ConversationIndex属性。但是,此属性不会像上面列出的其他属性那样导致错误。
答案 2 :(得分:0)
我在尝试通过VBA(在excel中)访问Outlook邮件时遇到了类似的情况。 但是,对于我来说,它要慢得多:每秒1封电子邮件!
无论如何,我通过使用SetColumnns(例如https://docs.microsoft.com/en-us/office/vba/api/Outlook.Items.SetColumns)成功地设法提高了速度
我知道..我知道..这仅适用于一些属性,例如“主题”和“接收时间”,不适用于身体! 但是再想一想,您是否真的想通读所有电子邮件的正文?还是仅仅是一个子集?可能基于其主题行或“接收时间”? 我的要求是只是进入电子邮件正文,以防其主题与特定字符串匹配。
因此,我做了以下事情:
我添加了另一个名为“ myFilterItemCopyForBody”的“ Outlook.Items” obj,并在其他“ Outlook.Items”上应用了相同的过滤器。 因此,现在我有两个'Outlook.Items':'myFilterItem'和'myFilterItemCopyForBody'都具有相同的电子邮件项,因为在这两个条件上都应用了相同的限制条件。
“ myFilterItem”-仅保存相关邮件的“ Subject”和“ ReceivedTime”属性(使用SetColumns完成) 'myFilterItemCopyForBody'-保存邮件的所有属性(包括正文)
现在,“ myFilterItem”和“ myFilterItemCopyForBody”都使用“ ReceivedTime”进行了排序,以使它们具有相同的顺序。
排序后,两者都会在每个循环的嵌套中同时循环,并在下面的代码中(在计数器的帮助下)选择相应的属性。
Dim myFilterItem As Outlook.Items
Dim myItems As Outlook.Items
Set myItems = olFldr.Items
Set myFilterItemCopyForBody = myItems.Restrict("@SQL=""urn:schemas:httpmail:datereceived"" > '" & startTime & "' AND ""urn:schemas:httpmail:datereceived"" < '" & endTime & "'")
Set myFilterItem = myItems.Restrict("@SQL=""urn:schemas:httpmail:datereceived"" > '" & startTime & "' AND ""urn:schemas:httpmail:datereceived"" < '" & endTime & "'")
myFilterItemCopyForBody.Sort ("ReceivedTime")
myFilterItem.Sort ("ReceivedTime")
myFilterItem.SetColumns ("Subject, ReceivedTime")
For Each myItem1 In myFilterItem
iCount = iCount + 1
For Each myItem2 In myFilterItemCopyForBody
jCount = jCount + 1
If iCount = jCount Then
'Display myItem2.Body if myItem1.Subject contain a specific string
'MsgBox myItem2.Body
jCount = 0
Exit For
End If
Next myItem2
Next myItem1
注意1: 。请注意,使用与“ myFilterItemCopyForBody”相对应的“ myItem2”访问Body属性。
注2: :编译器进入循环以访问body属性的次数越少越好!您可以通过使用限制和逻辑来减少编译器必须循环遍历逻辑的次数,从而进一步提高效率。
希望这会有所帮助,即使这不是新事物!