循环以复制多个Outlook附件类型不匹配错误

时间:2013-08-26 14:56:43

标签: vba outlook outlook-vba

我试图循环显示邮件以复制多个附件,但没有成功,我得到13 - 类型不匹配错误!!!

任何建议都将受到赞赏。

我的代码如下,

Private Sub Items_ItemAdd(ByVal item As Object)

On Error GoTo ErrorHandler

    'Only act if it's a MailItem
    Dim Msg As Outlook.MailItem
    If TypeName(item) = "MailItem" Then
        Set Msg = item


        'Set folder to save in.
        Dim olDestFldr As Outlook.MAPIFolder
        Dim myAttachments As Outlook.Attachments
        Dim Att As String
        Dim i As Integer
        'location to save in.  Can be root drive or mapped network drive.
        Const attPath As String = "C:\Users\pkshahbazi\Documents\EmailAttachments\"
        i = 0
        'save attachment
        Set myAttachments = item.Attachments
        If Msg.Attachments.Count <> 0 Then
            For Each myAttachments In Msg.Attachments
                Att = myAttachments.item(i).DisplayName
                myAttachments.item(i).SaveAsFile attPath & Att
                'mark as read
                i = i + 1
            Next myAttachments
            Msg.UnRead = False
        End If
    End If

ProgramExit:
  Exit Sub

ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description
  Resume ProgramExit
End Sub

2 个答案:

答案 0 :(得分:2)

你好像混淆了两种不同的循环。 For Each...NextFor...Next语句具有不同的结构。您可能需要阅读上述链接参考中的文档和示例。

在For Each循环中,您没有跟踪索引的计数器变量。它会自动从集合中检索每个项目。

在For循环中,你有一个为你增加的计数器变量,你不必增加它 (例如i = i + 1
但是,如果您要访问集合,则必须自己检索当前项目 (例如myAttachments.Item(i),或者您可以使用myAttachments(i)的更短等效语法,因为VBA中隐含了.Item

这是一个工作示例,它使用每种类型的for循环将当前活动消息的附件的文件名打印到立即窗口。

Public Sub TestAttachments()
    Dim message As MailItem
    Dim myAttachment As Attachment
    Dim i As Long

    Set message = ThisOutlookSession.ActiveInspector.CurrentItem

    Debug.Print "For Each...Next"
    For Each myAttachment In message.Attachments
      Debug.Print "Filename: " & myAttachment.FileName
    Next myAttachment

    Debug.Print "For...Next Statement"
    For i = 1 To message.Attachments.Count
      Set myAttachment = message.Attachments(i)
      Debug.Print "Index: " & i & " Filename: " & myAttachment.FileName
    Next i
End Sub

正如您所看到的,For Each循环要简单得多。但是,For循环可以在访问索引集合时为您提供更多控制和信息。通常你会想要使用For Each循环。

另请注意,VBA中用于集合的术语存在一些混淆。有多种不同的集合。还有Collection objects,它们是一种集合,但不是唯一的集合类型。

答案 1 :(得分:1)

您在可迭代集合(myAttachments)上使用索引循环,这是不必要的。它不是错误的来源,但我看到的错误与您的迭代有关:

你正在做错配错误:

For each myAttachments in Msg.Attachments
   '...
Next

您已将myAttachments指定为Msg.Attachments,且类型为Outlook.Attachments。这是一个可迭代的集合,但您需要使用Outlook.Attachment类型变量进行迭代。

Dim olAttch as Outlook.Attachment

然后,修改您的循环(未经测试):

    Set myAttachments = Msg.Attachments
        For Each olAttch In myAttachments
            Att = olAttch.DisplayName
            olAttch.SaveAsFile attPath & Att
        Next olAttch
        Msg.UnRead = False