Vba 使用SetColumns方法时如何访问项目数据?

Vba 使用SetColumns方法时如何访问项目数据?,vba,dictionary,outlook,Vba,Dictionary,Outlook,使用SetColumns方法时如何访问项目数据 我用myItems.SetColumns(“SentOn”)缓存了SentOn数据 项。正文返回“” Sub HowManyEmails() Dim objOutlook为对象,objnSpace为对象,objFolder为MAPIFolder 将电子邮件计数为整数 设置objOutlook=CreateObject(“Outlook.Application”) 设置objnSpace=objOutlook.GetNamespace(“MAPI”)

使用SetColumns方法时如何访问项目数据

我用
myItems.SetColumns(“SentOn”)
缓存了SentOn数据

项。正文返回“”

Sub HowManyEmails()
Dim objOutlook为对象,objnSpace为对象,objFolder为MAPIFolder
将电子邮件计数为整数
设置objOutlook=CreateObject(“Outlook.Application”)
设置objnSpace=objOutlook.GetNamespace(“MAPI”)
出错时继续下一步
设置objFolder=objnSpace.Folders(“收件箱”)
如果错误号为0,则
呃,明白了
MsgBox“没有这样的文件夹。”
出口接头
如果结束
EmailCount=objFolder.Items.Count
MsgBox“文件夹中的电子邮件数:”&EmailCount,“电子邮件数”
Dim dateStr作为字符串
将myItems暗显为Outlook.Items
将myItem设置为Outlook.MailItem
作为对象的Dim dict
作为字符串的Dim msg
暗咖喱
设置当前日期=现在
Dim opnTkt
Dim clsTkt作为整数
Dim OMNTRRPT为整数
Dim webCht作为整数
Set dict=CreateObject(“Scripting.Dictionary”)
设置myItems=objFolder.Items
myItems.SetColumns(“SentOn”)
'确定每条消息的日期:
对于myItems中的每个myItem
dateStr=GetDate(myItem.SentOn)
如果月份(dateStr)月份(现在)那么
默认值=默认值+1
'此处为myItem.Body返回“”
ElseIf InStr(myItem.Body,“进程已启动”)>0然后
omntrrpt=omntrrpt+1
其他的
def=def+1
如果结束
下一个我的项目
'每天的输出计数:
msg=“”
msgs=“omniture:&vbCrLf&omntrrpt&”网络聊天:&webCht&vbCrLf
MsgBox msgs
设置objFolder=Nothing
设置objnSpace=Nothing
设置objOutlook=Nothing
端接头
函数GetDate(dt作为日期)作为字符串
GetDate=年(dt)&“-”月(dt)&“-”日(dt)
端函数

Thanx对于您的解决方案,实际上,当我们使用“SetColumns()”并像我使用的
myItems.SetColumns(“SentOn”)一样设置任何变量的值时,您无法访问该项的其他属性。因此,只需删除它并运行代码即可

如果使用SetColumns,则无法访问Body或HTMLBOdy。发件人:

对集合的特定属性应用SetColumns方法后,无法读取该集合的其他属性;未缓存的属性返回为空。您也不能写入该集合的任何属性。或者,如果需要对一组项进行读写、快速访问,请使用表对象

对于返回对象的任何属性,都不能使用SetColumns,这将导致错误。它不能与以下属性一起使用:


|(12)自主权回归者(12)中文中文中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)互联网版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版)中文版(12)中文版(12)中文版(12)中文版(12)中文版)中文版(12)中文版(12)中文版(12)中文版(12)中文版)互联网网页网页网页网页网页网页网页网页网页网页网页网页网页(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版(12)中文版)网页)|投票选项|选举无法使用SetColumns方法缓存ConversationIndex属性。但是,此属性不会像上面列出的其他属性那样导致错误。

我在尝试通过VBA(excel)访问Outlook邮件时遇到类似情况。 然而,在我的例子中,速度要慢得多:每秒发送一封电子邮件

无论如何,我成功地通过使用setColumns(例如)提高了速度

我知道。。我知道。。这只适用于少数属性,如“Subject”和“ReceivedTime”,而不适用于body! 但是再想想,你真的想通读你所有电子邮件的正文吗?或者它只是一个子集?可能是基于它的主题行或“Receivedtime”? 我的要求是进入邮件的正文,以防邮件的主题与特定字符串匹配

因此,我做了以下工作:

我添加了第二个名为“myFilterItemCopyForBody”的“Outlook.Items”对象,并在另一个“Outlook.Items”对象上应用了与我相同的过滤器。 因此,现在我有两个“Outlook.Items”:“myFilterItem”和“myFilterItemCopyForBody”都具有相同的电子邮件项目,因为对这两个项目应用了相同的限制条件

“myFilterItem”-仅保存相关邮件的“主题”和“接收时间”属性(使用SetColumns完成) “myFilterItemCopyForBody”-保存邮件的所有属性(包括正文)

现在,“myFilterItem”和“myFilterItemCopyForBody”都使用“ReceivedTime”进行排序,使它们的顺序相同

排序后,这两个循环将同时在嵌套for each循环中循环,并拾取相应的属性(在计数器的帮助下),如下面的代码所示

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
将myFilterItem暗显为Outlook.Items
将myItems暗显为Outlook.Items
设置myItems=olFldr.Items
设置myFilterItemCopyForBody=myItems.Restrict(@SQL=”“urn:schemas:httpmail:datereceived“>”&startTime&“和”urn:schemas:httpmail:datereceived“<”&endTime&“限制”)
设置myFilterItem=myItems.Restrict(“@SQL=”“urn:schemas:httpmail:datereceived”“>”&startTime&”“urn:schemas:httpmail:datereceived”“<”&endTime&“”)
myFilterItemCopyForBody.Sort(“ReceivedTime”)
myFilterItem.Sort(“ReceivedTime”)
myFilterItem.SetColumns(“主题,接收时间”)
对于myFilterItem中的每个myItem1
iCount=iCount+1
对于myFilterItemCopyForBody中的每个myItem2
jCount=jCount+1
如果iCount=jCount,则
'如果myItem1.Subject包含特定字符串,则显示myItem2.Body
'MsgBox myItem2.正文
jCount=0
退出
如果结束
下一个myItem2
下一个myItem1
注意1:请注意,Body属性是使用与“myFilterItemCopyForBody”对应的“myItem2”访问的

注2:编译器进入循环访问的次数越少