【问题标题】:Excel VBA Error "user-defined type not defined" with OutlookExcel VBA 错误“未定义用户定义的类型”与 Outlook
【发布时间】:2017-11-19 12:43:34
【问题描述】:

我在我的计算机上使用 Office 2016,并且我有一个 VBA 代码,可以将电子邮件发送到文件中的邮件列表。每次我想用我的命令按钮自动发送电子邮件时,我都会收到错误消息:“未定义用户定义的类型”。 我在网上做了一些研究,发现有一个解决方案: VB Editor ----> Tools ----> Referenced ----> Microsoft Outlook 16.0 Object Library

但是 下次我打开文件时,同样的错误会一次又一次地运行。有人能找到我永久的解决方案吗?我不知道该怎么做,然后我已经做了。

Public Sub sendMail()
    Call ini_set

    If mail_msg.Cells(200, 200) = 1 Then
        lr = main_dist.Cells(main_dist.Rows.Count, "A").End(xlUp).row

        On Error Resume Next
        For i = 2 To lr

            Application.DisplayAlerts = False
            Dim applOL As Outlook.Application
            Dim miOL As Outlook.MailItem
            Dim recptOL As Outlook.Recipient
            mail_msg.Visible = True
            mailSub = mail_msg.Range("B1")
            mailBody = mail_msg.Range("B2")
            mail_msg.Visible = False
            Set applOL = New Outlook.Application
            Set miOL = applOL.CreateItem(olMailItem)
            Set recptOL = miOL.Recipients.Add(main_dist.Cells(i, 5))
            recptOL.Type = olTo

            tempPath = ActiveWorkbook.Path & "\" & main_dist.Cells(i, 4) & ".xlsm"

            With miOL
                .Subject = mailSub
                .Body = mailBody
                .Attachments.Add tempPath
                .send

            End With
            Set applOL = Nothing
            Set miOL = Nothing
            Set recptOL = Nothing
            Application.DisplayAlerts = True


        Next i
End Sub

这是基于VB编辑器的问题:

Dim applOL As Outlook.Application

【问题讨论】:

  • 通常当您在文档中添加引用时,它应该永远保留在那里。您确定要在添加参考后保存文档吗?
  • 您也可以使用后期绑定,这样您就不必引用库。所以Dim applOL As Outlook.Application 会变成Dim applOL As object 等等。
  • @CallumDA -- 所以,如果有人提到了一个可能在其他地方提到过的潜在修复,这会立即使它成为一个重复的问题,即使它在原始问题中没有被问到? sigh 我在这个问题的“可能重复”中没有看到 任何 术语。 ...我并不是说这是一个很好的问题,但它不是重复,至少不是你的例子。
  • @ashleedawg,这样说吧。如果 OP 遵循链接,他们将了解如何正确进行早期绑定和后期绑定。其中之一必须是 OP 可以接受的,因为根本没有其他方法。 重复问题并不意味着问题需要看起来相同,但这确实意味着该问题的答案已经存在于网站的其他地方。根据这个定义,我确实认为这是重复的。

标签: vba excel outlook


【解决方案1】:

正如我在评论中所建议的,您可以像下面这样编辑您的代码(参见三个注释行),并且应该能够在没有引用的情况下运行。 我假设代码是正确的,并且它提供了预期的结果

Public Sub sendMail()
    Call ini_set

    If mail_msg.Cells(200, 200) = 1 Then
        lr = main_dist.Cells(main_dist.Rows.Count, "A").End(xlUp).Row

        On Error Resume Next
        For i = 2 To lr

            Application.DisplayAlerts = False
            Dim applOL As Object       '\\Outlook.Application
            Dim miOL As Object         '\\Outlook.MailItem
            Dim recptOL As Object      '\\Outlook.Recipient
            mail_msg.Visible = True
            mailSub = mail_msg.Range("B1")
            mailBody = mail_msg.Range("B2")
            mail_msg.Visible = False
            Set applOL = New Outlook.Application
            Set miOL = applOL.CreateItem(olMailItem)
            Set recptOL = miOL.Recipients.Add(main_dist.Cells(i, 5))
            recptOL.Type = olTo

            tempPath = ActiveWorkbook.Path & "\" & main_dist.Cells(i, 4) & ".xlsm"

            With miOL
                .Subject = mailSub
                .Body = mailBody
                .Attachments.Add tempPath
                .send

            End With
            Set applOL = Nothing
            Set miOL = Nothing
            Set recptOL = Nothing
            Application.DisplayAlerts = True


        Next i
End Sub

后期绑定在其他一些情况下也有帮助,尤其是当有多个用户并且他们在软件版本方面有不同的设置时!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多