Определение того, открыт ли существующий экземпляр Outlook - PullRequest
4 голосов
/ 26 июня 2011

После прочтения того, как использовать автоматизацию для отправки сообщения, мне неясно, можно ли избежать открытия нового экземпляра Outlook, если он уже открыт. Если это так, я не уверен, как искать примеры, определяющие, открыт ли существующий экземпляр Outlook.

----- Включая предложение --------

У меня есть следующий фрагмент, но я обнаружил, что не могу правильно создать экземпляр. Я в основном следую этому примеру . Я либо получаю этот снимок экрана , либо ошибка "Пользовательский тип не определен". Есть предложения?

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

Ответы [ 3 ]

10 голосов
/ 31 августа 2011

Я знаю, что на этот вопрос дан ответ, но я подумал, что добавлю, что такие приложения, как 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», поскольку новый экземпляр на самом деле является тем же объектом, что и существующий экземпляр.

Так что же нам делать, если мы не знаем, запущен Outlook или нет?Как показано выше, CreateObject либо создает новый экземпляр (если он не существует, как в первом примере), либо подключает существующий экземпляр, если Outlook уже открыт (как во втором примере).

5 голосов
/ 26 июня 2011

Я вижу в вашем вопросе, что вы закомментировали

'Dim w As Outlook.Application

предположительно, потому что это приводит к ошибке «Пользовательский тип не определен».

Вероятно, это связано с тем, что вы не указали ссылку на библиотеку Outlook в своем проекте Excel-VBA. Это делается следующим образом: Инструменты> Ссылки> проверка «Библиотека объектов Microsoft Outlook xx.x». Тогда вы можете написать это

Dim w As Outlook.Application
Set w = New Outlook.Application
' or, 
'Set w = CreateObject("Outlook.Application")

, что, кстати, приводит к привязке во время компиляции (или "раннему"). И дает вам Outlook объект intellisense.

В качестве альтернативы, вы можете опустить установку ссылки и объявить w как универсальный объект и позволить ему связываться во время выполнения

Dim w As Object
Set w = CreateObject("Outlook.Application")

но привязка во время выполнения (или "позднее") менее эффективна.

Делайте то, что чувствуете лучше - я собираюсь пойти дальше и рискну, что есть вероятность, вы не заметите разницу в эффективности. Я недавно перешел на раннее связывание, на самом деле просто из-за intellisense.

РЕДАКТИРОВАТЬ Итак, вы создали новое приложение Outlook, но не видите его. Если вы посмотрите в диспетчере задач Windows, то увидите, что процесс уже запущен, но он просто не отображается на экране. К сожалению, какой-то гениальный инженер из Microsoft решил, что в Outlook не должно быть свойства Visible, как в Word или Excel, поэтому мы должны использовать неловкий обходной путь. Откройте одну из специальных папок, например Входящие как это:

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
1 голос
/ 26 июня 2011
    Set w = GetObject(, "Outlook.Application")

это должен запустить запущенный экземпляр, если ни один не запускает ошибку catch и выполните CreateObject

...