从Excel / VBA调用Notes时,是否需要显式关闭会话?

时间:2015-03-13 16:52:56

标签: excel-vba lotus-notes vba excel

我使用Excel通过对Notes服务器的VBA调用,根据Notes数据库中的数字绘制财务结果。它实际上是一个实时的更新"程序。 代码开始了:

Set Session = CreateObject("Lotus.NotesSession") 'Start a session to notes
Call Session.Initialize
Set nam = Session.CreateName(Session.UserName)

但我没有明确指示会话结束。我是不是该?我甚至可以这样做吗?

我喜欢几次微调之后整个事情变慢了,但这可能是其他事情!

如果没有明确关闭它会使会话保持打开状态,如何重新连接它(不再登录)?

1 个答案:

答案 0 :(得分:0)

您需要的方法是 Session.Close

是的,user2864740非常正确:你必须明确地将对象设置为Nothing。

此外,我建议你关闭Session创建的每一个对象,将它们设置为Nothing:你不应该假设任何对象在超出范围时被解雇和清理 - 如果它们中的任何一个都处于活动状态,它可以保持对父对象的引用,使会话保持活动状态,并且无法访问您关闭它的尝试。

如果您没有明确关闭会话,并且在您丢弃了指向它的每个对象变量后它仍然处于打开状态,则可能是VBA无法触及的。

如果某些对象已经在运行,可以通过GetObject()调用来获取这些对象,但Lotus Notes会话对象不支持该接口。

下一步是使用API​​调用来枚举正在运行的进程,按名称选择Lotus Notes会话PID并终止进程

使用' Process' API调用是WMI脚本,MSDN在此处有相关调用的VBScript列表:

https://msdn.microsoft.com/en-us/library/aa394599%28v=vs.85%29.aspx

这比API调用更安全,但您仍然应该将此视为最后的手段:它可能会终止您现有的邮件会话,这就是为什么任务管理器(您的UI用于枚举进程和终止PID)的原因为您提供有关未保存工作和系统不稳定性的警告。