5

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

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

我有以下代码片段,但我发现无法正确创建实例。我基本上在关注这个例子.我要么得到这个屏幕截图,或“未定义用户定义类型”的错误。有什么建议吗?

子示例()'调暗为Outlook。应用程序常量ERR_APP_NOTRUNNING As Long=429出错时继续下一步'处理Microsoft outlook设置w=GetObject(,“Outlook.Application”)如果Err=Err_APP_NOTRUNNING,则'设置w=新Outlook。应用程序设置w=CreateObject(“Outlook.Application”)End If(结束条件)结束Sub

4个答案4

重置为默认值
11

我知道这个问题已经得到了回答,但我想补充一下,像Outlook(我也相信PowerPoint)这样的应用程序是单实例应用程序,不需要确定Outlook是否已经打开,因为您只能运行一个Outlook副本。

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

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

例如,假设Outlook没有运行。我们可以使用此代码创建实例:

子测试Outlook()Dim olApp As Object的Outlook。应用程序设置olApp=CreateObject(“Outlook.Application”)消息框(olApp2为空)结束Sub

这将打印“False”,因为我们创建了实例。

假设Outlook正在运行。我们可以使用此代码验证使用GetObject和CreateObject是否会引用现有实例:

子测试Outlook()Dim olApp As Object的Outlook。应用程序Dim olApp2 As Object的Outlook。应用程序设置olApp=GetObject(,“Outlook.Application”)消息框(olApp什么都不是)设置olApp2=CreateObject(“Outlook.Application”)消息框(olApp2为空)消息框“相同对象?”&(olApp是olApp2)结束Sub

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

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

  • 它可能是单个实例,但我有一个VB6应用程序,我可以让用户发送电子邮件。因此,我将Dim oApp作为Outlook。应用。然后我会将oApp设置为新Outlook。应用程序,这在Windows7中工作得很好(打开outlook),但在Windows10中不工作-知道吗? 评论 2017年7月13日13:54
  • @吉米-我知道这是个老问题,但我看到你最近很活跃。。。我不相信你的答案是正确的。在较新的版本中,这是否会发生变化?由于输入错误,您的第一个代码示例返回FALSE:变量未声明。尽管如此,修复后,无论是否存在Outlook实例,它仍然返回FALSE。 评论 2018年3月9日10:06
  • 我确认windows 10和Office 365都是64位的,这种行为仍然存在;使用CreateObject,它会获得一个已经打开的实例。 评论 2019年8月18日14:48
6

我在你的问题中看到了你的评论

'调暗为Outlook。应用程序

可能是因为这会导致“未定义用户定义的类型”错误。

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

前景黯淡。应用程序设置w=新Outlook。应用程序'或,'设置w=CreateObject(“Outlook.Application”)

顺便说一下,这会导致编译时(或“早期”)绑定。并为您提供见解对象智能感知。

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

Dim w As对象设置w=CreateObject(“Outlook.Application”)

但是运行时(或“延迟”)绑定效率较低。

做任何感觉最棒的事——我会继续冒险,你不会注意到效率上的差异。我是最近才转向早期绑定的东西,真的是因为智能感知。

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

前景黯淡。应用程序Dim wInbox作为Outlook。MAPI文件夹设置w=新Outlook。应用程序设置wInbox=w.GetNamespace(“MAPI”)。获取默认文件夹(olFolderInbox)w收件箱。显示“这使Outlook可见”
4
  • 我已经做了更改,但无论Setw=NewOutlook是否打开,我都没有看到新的Outlook应用程序。执行应用程序或Set w=CreateObject(“Outlook.Application”)。这正常吗? 评论 2011年6月27日0:57
  • @标语者:如果你有很多不同/连续的问题,请将每个问题单独发布。我将在我的答案的编辑中回答最后一个问题。 评论 2011年6月27日8:59
  • 弗朗索瓦·科贝特:谢谢你的编辑。我不确定我的后续问题是否与原始问题处于相同的上下文中,因此我在评论中添加了它,以避免重复。 评论 2011年6月27日19:29
  • 今天关于可见性的编辑对我很有帮助。我发现了一种更通用的方法,它使用Parent属性,在某些情况下可能对其他人有帮助,例如,Set-outApp=CreateObject(“Outlook.Application”):Set-outMail=outApp。CreateItem(olMailItem):outMail。起源。显示器 评论 2011年11月24日17:30
1
设置w=GetObject(,“Outlook.Application”)

如果没有运行catch错误的实例,则应该获取正在运行的实例并执行CreateObject

2
  • 谢谢你的建议。我已经更新了关于这次尝试的问题。知道我调用函数的方式有什么问题吗? 评论 2011年6月26日1:10
  • CreateObject以前在Outlook上工作过吗。应用程序?您的计算机上似乎存在COM注册问题。我不知道您使用的是什么版本,但您可能需要注册Outlook类型库。请发布所有相关版本 评论 2011年6月26日15:52
0

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

函数OpenOutlookApp(isSend As Boolean)作为Boolean'如果它已打开,则返回true。“我的办公室版本是2016年。Dim oApp As对象出错时转到错误句柄出错时继续下一步设置oApp=GetObject(,“Outlook.Application”)出错时转到0如果oApp什么都不是那么设置oApp=CreateObject(“Outlook.Application”)o应用程序。GetNamespace(“MAPI”)。GetDefaultFolder(6)。显示器End If(结束条件)如果是Send,则调用SendAndReceiveOutlookMail(False)OpenOutlookApp=真转到非错误句柄错误句柄:非错误句柄:出错时转到0End函数Sub Send and ReceiveOutlookMail(isQuit As Boolean)将oApp设为新Outlook。应用程序出错时继续下一步呼叫oApp。会议。登录(“Outlook”,“”)调用oApp。会议。发送和接收(True)如果是Quit,则为oApp。退出设置oApp=无出错时转到0结束Sub
0

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.