2015-03-13 2 views
1

Я использую Excel для построения финансовых результатов на основе цифр в базе данных Notes через вызовы VBA на сервер Notes. Это эффективная процедура «обновления» в реальном времени. Код начинается:При вызове Notes из Excel/VBA мне нужно явно закрыть сеанс?

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

, но я явно не инструктируют сессии, чтобы закрыть. Нужно ли мне? Могу ли я это сделать?

Мне кажется, что после нескольких макросов все это замедляется, но это может быть что-то еще!

И если явное закрытие не закрывает сессию, как я могу подключиться к ней (без входа в систему снова)?

+1

CreateObject возвращает COM-объект. Он будет (ну, * должен *) «распоряжаться»/«закрыть» сам, когда все ссылки будут удалены. Потому что это, ай, COM, а не .CLR. Я нашел, что лучше всего вручную «отпустить» ссылки на код (например, когда это делается, «Установить сеанс = ничего»). См. Http://stackoverflow.com/questions/19038350/when-should-an-excel-vba-variable-be-killed-or-set-to-nothing Эффект тот же *, когда * переменная выходит за рамки , но наблюдайте за переменным временем жизни. Я рекомендую строгую очистку жизни для * всех * объектов, полученных таким образом. – user2864740

ответ

0

метод вы хотите Session.Close

И да, user2864740 вполне корректно: вы должны явно указать объект в настоящее время.

Кроме того, я бы рекомендовал вам закрыть каждый объект, созданный сеансом, и установить их в «Ничто»: вы никогда не должны предполагать, что любой объект был уволен и очищен, когда он выходит из области действия - и если какой-либо из них оставлен в живых, он может хранить ссылку на родительский объект, сохраняя сеанс живым и недоступным вашим попыткам закрыть его.

Если вы не закрыли сессию явно, и она по-прежнему открыта после того, как вы отбросили каждую переменную объекта, указывающую на нее, это, вероятно, вне досягаемости VBA.

Есть объекты, которые могут быть получены вызовом GetObject(), если они уже запущены, но объект сеанса Lotus Notes не поддерживает этот интерфейс.

Следующего шаг будет использовать API вызовы для перечисления запущенных процессов, выбрать в Session PID Lotus Notes по имени, и убить процесс

Альтернативы использования вызовов «Process» API являются сценариями WMI, и MSDN есть список VBScript для соответствующих вызовов здесь:

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

Это безопаснее, чем вызовы API, но вы все равно должны рассматривать это как последнее средство: он, вероятно, убить существующую почтовую сессию и есть причина, по которой диспетчер задач (ваш пользовательский интерфейс для перечисления процессов и k недействительные PID) дает вам предупреждения о несохраненной работе и нестабильности системы.

+0

попытался вызвать session.close из VBA - он сказал, что метод не поддерживается! – Dave45

+0

Интересно: похоже, вы звоните в другой набор библиотек Lotus Notes, затем. Try 'Quit' и 'Exit'. Альтернативно, объект уже закрыт и не сообщает об этом правильно - он поднимает ошибку «не поддерживается», а не говорит вам, что «закрыть» доступно только на открытом объекте. –

+0

Немного больше работы ...Если вы перейдете в меню VBE Tools и объявите ссылку на Lotus Automation Classes, в обозревателе объектов будут перечислены все свойства и методы классов NotesSession и NotesDatabase. Я немного обеспокоен тем, что метод «ЗАКРЫТЬ» для этих классов можно увидеть только в том случае, если вы щелкните правой кнопкой мыши панель «Участники» для «показать скрытые элементы». Это говорит о том, что close больше не поддерживает интерфейс для этих классов, и он может быть недоступен в более поздних версиях, хотя метод Session.Close все еще работает в среде рабочего стола моего текущего клиента. –

Смежные вопросы