Outlook VBA宏无法识别

时间:2012-08-08 18:20:16

标签: vba outlook email-attachments outlook-vba

我很难让Outlook 2010 VBA识别我直接从网上复制的宏。该宏应该从电子邮件中提取附件的副本并将其保存到本地文件夹。它在几天前工作,但现在,当我尝试在VBA中运行代码(它作为Outlook.MailItem)时,Outlook不会将其识别为任何类型的宏。当我拿出它并且只留下括号时,它显示为一个宏,但是我得到一个424对象需要的错误并且无法运行宏。如果我这样做,该死的,如果我不这样做,该死的。

这是原始代码:

Public Sub saveAttachtoDisk(itm as Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder as String

saveFolder = "c:\temp\"
    For Each objAtt In itm.Attachments

        objAtt.SaveAsFile savefolder & "\" & objAtt.DisplayName

        Set objAtt = Nothing

    Next

End Sub

我已经尝试了一切,似乎没有任何工作。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

“那段代码会是什么样的?它会去哪里?”

通过单击Alt-F11打开Outlook Visual Basic编辑器,并将此代码粘贴到以前版本的宏上。它可能目前位于“此Outlook会话”中。

您可以像尝试一样从宏对话框中运行它。或者,您可以通过单击文件>选项>自定义功能区将其附加到功能区按钮。您还必须在“开发人员”选项卡中将“宏安全性”设置为“所有宏的通知”。它将要求您确认在任何给定的Outlook会话中第一次单击它时运行是安全的。

Public Sub saveAttachtoDisk()

Dim saveFolder As String
Dim objAtt As Outlook.Attachment
Dim itm As Outlook.MailItem

saveFolder = "c:\temp\"
For Each itm In ActiveExplorer.Selection
    For Each objAtt In itm.Attachments
        objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName
        Set objAtt = Nothing
    Next objAtt
Next itm
End Sub

此子项将附件保存在当前打开的文件夹中的所有选定项目中。您可以将其调整为仅执行当前所选文件夹中的所有项目,或静态文件夹(如收件箱)。您需要熟悉Outlook对象模型才能这样做。 JimmyPena的回答举例说明了使用所有收件箱项目。

答案 1 :(得分:1)

由于代码包含一个参数,您需要通过从另一个过程调用此过程来传递该参数。例如:

Sub CallMyProcedure()

Dim itms As Outlook.Items
Dim itm As Object

' loop through default Inbox items
Set itms = Session.GetDefaultFolder(olFolderInbox).Items

For Each itm In itms
  If TypeName(itm) = "MailItem" Then
    ' your code is called here
    saveAttachtoDisk itm
  End If
Next itm

End Sub

这个是您需要调用的过程,因为它没有参数,您应该可以在宏对话框中看到它。