1

我试图遍历消息以复制多个附件,但没有成功,我收到 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
4

2 回答 2

2

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

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

在 For 循环中,您有一个为您增加的计数器变量,您不必增加它。
(例如i = i + 1
但是,如果您正在访问一个集合,您必须自己检索当前项目。
(例如,或者您可以使用VBA 中隐含myAttachments.Item(i)的较短的等效语法myAttachments(i)as ).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 对象,它们是集合的一种类型,但不是唯一的集合类型。

于 2013-08-26T16:18:07.253 回答
1

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

您收到不匹配错误,因为您正在执行以下操作:

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

您已经分配myAttachments了 asMsg.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
于 2013-08-26T15:26:38.143 回答