确定现有Outlook实例是否已打开

sta*_*tor 5 excel outlook vba excel-vba

在阅读了如何使用自动化发送消息后,我不清楚是否可以避免打开一个新的Outlook实例,如果我已经打开了一个.如果是这样,我不确定如何搜索确定现有Outlook实例是否已打开的示例.

-----包括建议--------

我有以下代码段,但我发现无法正确创建实例.我基本上都是按照这个例子.我要么获得此屏幕截图,要么出现"未定义用户定义类型"的错误.有什么建议?

Sub Example()
    'Dim w As Outlook.Application

    Const ERR_APP_NOTRUNNING As Long = 429
    On Error Resume Next


' Handle Microsoft outlook
    Set w = GetObject(, "Outlook.Application")
    If Err = ERR_APP_NOTRUNNING Then
      'Set w = New Outlook.Application
      Set w = CreateObject("Outlook.Application")
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

Jim*_*ena 11

我知道这个问题已得到解答,但我想我会添加像Outlook这样的应用程序(我相信PowerPoint也是单实例应用程序) - 没有必要确定Outlook是否已经打开,因为你只能拥有Outlook运行的一个副本.

http://msdn.microsoft.com/en-us/library/aa164542(v=office.10).aspx

如果需要实例化Outlook,只需使用CreateObject创建实例; 如果Outlook已在运行,则对象引用将指向现有实例.如果没有,您将创建该类.绑定(晚期或早期)是无关紧要的.

例如,假设Outlook未运行.我们可以使用此代码来创建实例:

Sub testOutlook()

Dim olApp As Object ' Outlook.Application

Set olApp = CreateObject("Outlook.Application")
  MsgBox (olApp2 Is Nothing)

End Sub
Run Code Online (Sandbox Code Playgroud)

这将打印"False",因为我们创建了实例.

我们假设Outlook正在运行.我们可以使用此代码来验证使用GetObject和CreateObject将引用现有实例:

Sub testOutlook()

Dim olApp As Object ' Outlook.Application
Dim olApp2 As Object ' Outlook.Application

Set olApp = GetObject(, "Outlook.Application")
  MsgBox (olApp Is Nothing)

Set olApp2 = CreateObject("Outlook.Application")
  MsgBox (olApp2 Is Nothing)
  MsgBox "Same object? " & (olApp Is olApp2)

End Sub
Run Code Online (Sandbox Code Playgroud)

这将打印"False"(现有实例),"False"(我们所谓的"新实例"),但最后一个消息框为"True",因为新实例实际上是与现有实例相同的对象.

那么,如果我们不知道Outlook是否正在运行,我们该怎么办?如上所示,CreateObject要么创建了一个新实例(如果不存在,如第一个示例中所示),要么在Outlook已经打开时挂钩现有实例(如第二个示例中所示).


Jea*_*ett 6

我在你的问题中看到你注释掉了

'Dim w As Outlook.Application
Run Code Online (Sandbox Code Playgroud)

大概是因为这会给你"用户定义的类型未定义"错误.

这可能是因为您尚未在Excel-VBA项目中设置对Outlook库的引用.这可以通过以下方式完成:工具>引用>选中"Microsoft Outlook xx.x对象库".然后你可以写这个

Dim w As Outlook.Application
Set w = New Outlook.Application
' or, 
'Set w = CreateObject("Outlook.Application")
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这会导致编译时(或"早期")绑定.并为您提供Outlookintellisense对象.

或者,您可以省略设置引用并声明w为通用对象,并让它在运行时绑定

Dim w As Object
Set w = CreateObject("Outlook.Application")
Run Code Online (Sandbox Code Playgroud)

运行时(或"后期")绑定效率较低.

做任何最好的事情 - 我会继续冒险尝试机会,你不会注意到效率的差异.我最近转换为早期绑定的东西,真的只是因为intellisense.

编辑所以你已经创建了一个新的Outlook应用程序,但你看不到它.如果您查看Windows任务管理器,您将看到该进程在那里,正在运行 - 但它只是没有显示在屏幕上.不幸的是,微软的一位杰出工程师认为Outlook不应该拥有Visible像Word或Excel这样的属性,所以我们必须使用一个尴尬的解决方法.打开其中一个特殊文件夹,例如收件箱,如下所示:

Dim w As Outlook.Application
Dim wInbox As Outlook.MAPIFolder

Set w = New Outlook.Application
Set wInbox = w.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)

wInbox.Display 'This makes Outlook visible
Run Code Online (Sandbox Code Playgroud)