【问题标题】:Creating Outlook application from Excel generates type mismatch error从 Excel 创建 Outlook 应用程序会生成类型不匹配错误
【发布时间】:2018-11-11 06:51:07
【问题描述】:

我正在尝试使用 Outlook 模板创建 Outlook 电子邮件。

Set obApp = Outlook.Application 行,我收到错误:

错误:13 类型不匹配

我似乎使用了与本网站上其他帖子中有关该主题的相同语法。

我也尝试了Set obApp = CreateObject("Outlook.Applciation"),结果相同。

我有 OLE 自动化、Microsoft Outlook 16.0 对象库、Microsoft Office 16.0 库和 Microsoft Excel 16.0 对象库,以及 Visual Basic for Applications 都在 Tools-> References 中选中。

Sub CreateEmailfromTemplate()
    Dim obApp As Application
    Dim NewMail As Outlook.MailItem

    Set obApp = Outlook.Application 'THE PROBLEM IS HERE
    Set NewMail = obApp.CreateItemFromTemplate("F:\Folder1\Automation\EmailTemplates\TEST TEST.oft")
    NewMail.Display

End Sub

【问题讨论】:

  • 如果代码在 Outlook 中则无需设置应用程序,只需使用“Application.CreateItem”即可

标签: excel vba outlook type-mismatch


【解决方案1】:

您有两种选择:

选项 1:早期绑定

为了使用早期绑定,你需要设置一个引用:

Microsoft Outlook ##.# Object Library

这可以在 VBE > 工具 > 参考中完成。由于您已经声明变量的方式,我认为这是您更喜欢的方法。

使用此方法的代码中的问题是,在声明 Dim xxxx As Application 中,As Application 指的是 Excel 的对象模型。您需要指定要使用 Outlook。

Sub CreateEmailfromTemplate()

    Dim obApp As New Outlook.Application    '<-- Notice Change
    Dim NewMail As Outlook.MailItem

    Set NewMail = obApp.CreateItemFromTemplate("F:\Folder1\Automation\EmailTemplates\TEST TEST.oft")
    NewMail.Display

End Sub

选项 2:后期绑定

您不需要在此方法中设置引用,但 Outlook 的类型和常量在编译时将不可用。编译器会在运行时获取这些。

Sub CreateEmailfromTemplate()

    Dim obApp As Object
    Dim NewMail As Object

    Set obApp = CreateObject("Outlook.Application")
    Set NewMail = obApp.CreateItemFromTemplate("F:\Folder1\Automation\EmailTemplates\TEST TEST.oft")
    NewMail.Display

End Sub

注意此方法中 Outlook 的对象被声明为Object 类型。

【讨论】:

  • 值得一提的是,在案例 1(早期绑定)中,您可以使用 New 语法而不是 GetObject() - 即 Set obApp = New Outlook.Application,我觉得这样更简洁
  • @Greedo 取决于 - 如果一个对象已经在运行,我不一定想创建一个新对象。您能想象运行此代码 50 次并打开 50 个实例吗?当然,您可以在例程结束时关闭应用程序,但如果对象已经存在,那么为什么不使用它呢?我可能可以先添加一个检查以查看是否olApp Is Nothing,然后继续创建一个新对象。
  • 啊,如此真实,我误以为您在问题中使用了CreateObject()。没有与GetObject() 等效的早期绑定/New 样式吗?像Set obApp = Existing Outlook.Application 之类的东西(它的小好处是能够通过图书馆打点)。 GetObject() 的作用域是什么——相同的方法和公开声明的变量,还是以某种方式全局的?就像父方法是否应该担心孩子以这种方式劫持其实例?
  • 不幸的是,对于早期绑定和后期绑定,没有 As New...GetObject() 的等价物。而“...以这种方式劫持它的实例”:我想这最终归结为安全性。任何恶意软件都可以通过这种方式访问​​ ActiveX/COM 程序,这就是为什么让您的操作系统和防病毒软件保持最新很重要,@Greedo。
  • 哦不,我不是在暗示任何如此邪恶的事情。我想知道的是,在正常情况下,GetObject 是否可以看到不在方法范围内的变量。如果Sub aSet a = CreateObject("foo.bar"),可以Sub b 在不同的范围内执行Set b = GetObject("foo.bar") 来获取a 的对象,其中Set b = a 会给出一个变量未定义由于范围不同而出错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
相关资源
最近更新 更多