【问题标题】:VBA Outlook Run-time error '438': Object doesn't support this property or methodVBA Outlook 运行时错误“438”:对象不支持此属性或方法
【发布时间】:2020-06-25 15:30:15
【问题描述】:

我正在尝试运行此宏以将电子邮件附件从我的收件箱中的文件夹(称为工具包下载)移动到我桌面上的文件夹中并重命名附件。

我明白了

运行时错误“438”:对象不支持此属性或方法

Sub OSP()

Dim oOutlook As Outlook.Application
Dim oNs As Outlook.NameSpace 'Main Outlook Today
Dim oFldrSb As Outlook.MAPIFolder 'Sub Folder in Outlook Today
Dim oFldrSbSb As Outlook.MAPIFolder 'Sub in Sub Folder
Dim oFldrSbSbsb As Outlook.MAPIFolder 'Sub in Sub in Sub Folder

Dim oMessage As Object
Dim sPathName As String
Dim oAttachment As Outlook.Attachment
Dim Ictr As Integer
Dim iAttachCnt As Integer

sPathName = "H:\Desktop\Toolkit Downloads\" 'My Folder Path where to save attachments

Set oOutlook = New Outlook.Application
Set oNs = oOutlook.GetNamespace("MAPI")
Set oFldrSb = oNs.Folders("Joe.Bloggs@test.co.uk")
Set oFldrSbSb = oFldrSb.Folders("Inbox")
Set oFldrSbSbsb = oFldrSbSb.Folders("Toolkit Downloads")

For Each oMessage In oFldrSbSbsb.Items

    With oMessage.Attachments 
        iAttachCnt = .Count

        If iAttachCnt > 0 Then
            For Ictr = 1 To iAttachCnt
                .Item(Ictr).SaveAsFile sPathName _
                & .Item(Ictr).Parent
            Next Ictr
        End If
    End With

DoEvents

Next oMessage

SaveAttachments = True

MsgBox "All Indepol Download files have been moved !!" & vbCrLf & vbCrLf & "It worked... Yahoo"

End Sub

【问题讨论】:

  • 哪个语句给出错误 438?
  • 文件夹(“工具包下载”)中是否有任何不是 MailItem 的内容?只有 MailItem 有附件。
  • 为什么使用 .Item(Ictr).Parent 作为输出文件名的一部分?我从未尝试过,但我会猜测附件的父级是 MailItem MailItem 不是字符串,因此不能以这种方式使用。你不能保证像这样的任何名字都是独一无二的,没有经过测试。
  • 嗨托尼非常感谢您的回复。我不得不承认我是 VBA 的新手,并且获得了要使用的脚本,所以我不确定为什么要使用 Item(Ictr).Parent。错误 438 似乎没有突出显示一个语句。我可以确认带有附件的 ionly 电子邮件位于 Toolkit 下载文件夹中。
  • 嗨托尼刚发现错误,好像在.Item(Ictr).SaveAsFile sPathName _ & .Item(Ictr).Parent

标签: vba outlook


【解决方案1】:

您正在尝试将 MailItem 对象用作方法 SaveAsFile 中的字符串,因此错误。

我猜您想将邮件的主题包含在新文件名中:

.Item(Ictr).SaveAsFile sPathName _
    & .Item(Ictr).Parent.Subject

如果您有多个附件,我会在其中添加初始文件名:

.Item(Ictr).SaveAsFile sPathName _
    & .Item(Ictr).Parent.Subject
    & .Item(Ictr).FileName

完整代码:

Sub OSP()

Dim oOutlook As Outlook.Application
Dim oNs As Outlook.NameSpace 'Main Outlook Today
Dim oFldrSb As Outlook.MAPIFolder 'Sub Folder in Outlook Today
Dim oFldrSbSb As Outlook.MAPIFolder 'Sub in Sub Folder
Dim oFldrSbSbsb As Outlook.MAPIFolder 'Sub in Sub in Sub Folder

Dim oMessage As Object
Dim sPathName As String
Dim oAttachment As Outlook.Attachment
Dim Ictr As Integer
Dim iAttachCnt As Integer

sPathName = "H:\Desktop\Toolkit Downloads\" 'My Folder Path where to save attachments

Set oOutlook = Application
Set oNs = oOutlook.GetNamespace("MAPI")
Set oFldrSb = oNs.Folders("Joe.Bloggs@test.co.uk")
Set oFldrSbSb = oFldrSb.Folders("Inbox")
Set oFldrSbSbsb = oFldrSbSb.Folders("Toolkit Downloads")

For Each oMessage In oFldrSbSbsb.items

    With oMessage.Attachments
        iAttachCnt = .Count

        If iAttachCnt > 0 Then
            For Ictr = 1 To iAttachCnt
                .Item(Ictr).SaveAsFile sPathName _
                & .Item(Ictr).Parent.Subject
                & .Item(Ictr).FileName
            Next Ictr
        End If
    End With

DoEvents

Next oMessage

SaveAttachments = True

MsgBox "All Indepol Download files have been moved !!" & vbCrLf & vbCrLf & "It worked... Yahoo"

End Sub

【讨论】:

  • 感谢 R3uK 的帮助,我将尝试运行它
【解决方案2】:

首先,如果您在 Outlook 中运行 VBA 宏,则无需创建新的 Outlook 应用程序实例:

Set oOutlook = New Outlook.Application

改为使用默认模块中的Application 属性。

Attachment 类的SaveAsFile 方法接受一个字符串,该字符串表示保存附件的位置。确保在那里传递了一个字符串。

一般来说,我建议逐行调试代码并找出究竟是哪个属性或方法产生了错误。您可能会发现 Getting Started with VBA in Outlook 2010 文章很有帮助。

【讨论】:

  • 非常感谢尤金,我会看看这篇文章。调试突出显示 .Item(Ictr).SaveAsFile sPathName _ & .Item(Ictr).Parent
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多