在阅读了如何使用自动化发送消息后,我不清楚是否可以避免打开一个新的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
答案 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