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

时间:2011-06-26 00:33:56

标签: vba excel-vba outlook excel

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

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

我有以下代码段,但我发现无法正确创建实例。我基本上跟随this example。我要么得到this screenshot,要么出现“未定义用户定义类型”的错误。有什么建议吗?

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

4 个答案:

答案 0 :(得分:10)

我知道这个问题已经得到解答,但我想我会添加像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

这将打印“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

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

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

答案 1 :(得分:5)

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

'Dim w As Outlook.Application

大概是因为这会给你“用户定义的类型未定义”错误。

这可能是因为您尚未在Excel-VBA项目中设置对Outlook库的引用。这样做如下:工具>参考文献>检查“Microsoft Outlook xx.x对象库”。然后你可以写这个

Dim w As Outlook.Application
Set w = New Outlook.Application
' or, 
'Set w = CreateObject("Outlook.Application")
顺便说一下,

会导致编译时(或“早期”)绑定。并为您提供Outlook对象智能感知。

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

Dim w As Object
Set w = CreateObject("Outlook.Application")

runtime (or "late") binding的效率较低。

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

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

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

答案 2 :(得分:1)

    Set w = GetObject(, "Outlook.Application")

这应该运行实例,如果没有运行catch错误并且执行CreateObject

答案 3 :(得分:0)

如果你喜欢,就用这个。
这不是一个完美的解决方案,但您可以在未打开的情况下打开 Outlook App。

Function OpenOutlookApp(isSend As Boolean) As Boolean

    ' If it has opened, return true.
    ' my office version is 2016.

    Dim oApp As Object

    On Error GoTo ErrorHandle

    On Error Resume Next

    Set oApp = GetObject(, "Outlook.Application")

    On Error GoTo 0

    If oApp Is Nothing Then

        Set oApp = CreateObject("Outlook.Application")

        oApp.GetNamespace("MAPI").GetDefaultFolder(6).Display

    End If

    If isSend Then Call SendAndReceiveOutlookMail(False)

    OpenOutlookApp = True

    GoTo NonErrorHandle

    ErrorHandle:
        
    NonErrorHandle:

    On Error GoTo 0

End Function

Sub SendAndReceiveOutlookMail(isQuit As Boolean)

    Dim oApp As New Outlook.Application

    On Error Resume Next

    Call oApp.Session.LogOn("Outlook", "")

    Call oApp.Session.SendAndReceive(True)

    If isQuit Then oApp.Quit

    Set oApp = Nothing

    On Error GoTo 0

End Sub
相关问题