[offtop]Пользуясь удобным случаем, поделюсь давно терзающими меня смутными сомнениями, что при работающем Outlook (ранее запущенном) и CreateObject, и GetObject создают ссылку на этот ранее запущенный объект. По крайней мере, у меня следующий нехитрый код, который вроде как должен создавать новый экземпляр и тут же гасить его, на самом деле гасит ранее запущенный работающий Outlook. [vba]
Код
Sub test() Dim olApp 'Set olApp = GetObject(, "Outlook.Application") Set olApp = CreateObject("Outlook.Application") MsgBox "Загляни в Диспетчер задач и посчитай экземпляры Outlook, пока не закрыл это сообщение" olApp.Quit End Sub
[/vba]Не гасит только в том случае, если в Outlook в данный момент есть какой-то несохраненный материал, например, недописанное письмо. Возможно, существует какой-то параметр, который отвечает за "множественность", но мне такой параметр не известен...
[offtop]Пользуясь удобным случаем, поделюсь давно терзающими меня смутными сомнениями, что при работающем Outlook (ранее запущенном) и CreateObject, и GetObject создают ссылку на этот ранее запущенный объект. По крайней мере, у меня следующий нехитрый код, который вроде как должен создавать новый экземпляр и тут же гасить его, на самом деле гасит ранее запущенный работающий Outlook. [vba]
Код
Sub test() Dim olApp 'Set olApp = GetObject(, "Outlook.Application") Set olApp = CreateObject("Outlook.Application") MsgBox "Загляни в Диспетчер задач и посчитай экземпляры Outlook, пока не закрыл это сообщение" olApp.Quit End Sub
[/vba]Не гасит только в том случае, если в Outlook в данный момент есть какой-то несохраненный материал, например, недописанное письмо. Возможно, существует какой-то параметр, который отвечает за "множественность", но мне такой параметр не известен...Gustav
VIDEO56, с точки зрения процесса всё запускается. И пока не закрыто сообщение MsgBox, Outlook виден в списке процессов в Диспетчере задач. После нажатия на OK в MsgBox выполняется выход из Outlook при помощи оператора Quit и Outlook закрывается, так и не успев показаться пользователю.
Но даже если удалить оператор Quit, то время жизни Outlook все равно будет ограничено временем выполнения процедуры test. Ситуация меняется, если вынести описание переменной Outlook из процедуры на уровень модуля: [vba]
Код
Option Explicit Dim olApp Sub test() Set olApp = CreateObject("Outlook.Application") MsgBox "Загляни в Диспетчер задач и посчитай экземпляры Outlook, пока не закрыл это сообщение" End Sub
[/vba] В этом случае Outlook остается в списке процессов по окончании процедуры, но пользователь по-прежнему его не видит на экране и работать с ним не может.
Чтобы Outlook "вышел из тумана" и оставался на экране, надо после создания объекта его как-то визуализировать, скажем, показать обзор какой-нибудь папки, например, "Входящие" ("Inbox"): [vba]
Код
Sub showOutlook() Dim olApp Set olApp = CreateObject("Outlook.Application") olApp.Session.GetDefaultFolder(6).Display '6 = olFolderInbox End Sub
[/vba] Разумеется, если мы хотим дальше работать с запущенным таким способом Outlook, то оператор olApp.Quit в нашей процедуре не нужен.
VIDEO56, с точки зрения процесса всё запускается. И пока не закрыто сообщение MsgBox, Outlook виден в списке процессов в Диспетчере задач. После нажатия на OK в MsgBox выполняется выход из Outlook при помощи оператора Quit и Outlook закрывается, так и не успев показаться пользователю.
Но даже если удалить оператор Quit, то время жизни Outlook все равно будет ограничено временем выполнения процедуры test. Ситуация меняется, если вынести описание переменной Outlook из процедуры на уровень модуля: [vba]
Код
Option Explicit Dim olApp Sub test() Set olApp = CreateObject("Outlook.Application") MsgBox "Загляни в Диспетчер задач и посчитай экземпляры Outlook, пока не закрыл это сообщение" End Sub
[/vba] В этом случае Outlook остается в списке процессов по окончании процедуры, но пользователь по-прежнему его не видит на экране и работать с ним не может.
Чтобы Outlook "вышел из тумана" и оставался на экране, надо после создания объекта его как-то визуализировать, скажем, показать обзор какой-нибудь папки, например, "Входящие" ("Inbox"): [vba]
Код
Sub showOutlook() Dim olApp Set olApp = CreateObject("Outlook.Application") olApp.Session.GetDefaultFolder(6).Display '6 = olFolderInbox End Sub
[/vba] Разумеется, если мы хотим дальше работать с запущенным таким способом Outlook, то оператор olApp.Quit в нашей процедуре не нужен.Gustav