我试图循环显示邮件以复制多个附件,但没有成功,我得到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
答案 0 :(得分:2)
你好像混淆了两种不同的循环。 For Each...Next和For...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