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

时间:2017-01-09 10:50:49

标签: dictionary outlook outlook-vba

使用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

3 个答案:

答案 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属性的次数越少越好!您可以通过使用限制和逻辑来减少编译器必须循环遍历逻辑的次数,从而进一步提高效率。

希望这会有所帮助,即使这不是新事物!