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

Прочитав, как использовать автоматизацию для отправки сообщения, я не понимаю, возможно ли избежать открытия нового экземпляра 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

Ответ 1

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

'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")

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

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

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

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

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

EDIT Итак, вы создали новое приложение 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

Ответ 2

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

Ответ 3

    Set w = GetObject(, "Outlook.Application")

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