Определение того, открыт ли существующий экземпляр 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

4 ответа

Решение

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

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

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

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

РЕДАКТИРОВАТЬ Итак, вы создали новое приложение 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

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

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

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

Если хотите, используйте это.
Это не идеальное решение, но вы можете открыть приложение Outlook, когда оно не открыто.

      Function OpenOutlookApp(isSend As Boolean) As Boolean

    ' If it has opened, return true.
    ' my office version is 2016.

    Dim oApp As Object

    On Error GoTo ErrorHandle

    On Error Resume Next

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

    On Error GoTo 0

    If oApp Is Nothing Then

        Set oApp = CreateObject("Outlook.Application")

        oApp.GetNamespace("MAPI").GetDefaultFolder(6).Display

    End If

    If isSend Then Call SendAndReceiveOutlookMail(False)

    OpenOutlookApp = True

    GoTo NonErrorHandle

    ErrorHandle:
        
    NonErrorHandle:

    On Error GoTo 0

End Function

Sub SendAndReceiveOutlookMail(isQuit As Boolean)

    Dim oApp As New Outlook.Application

    On Error Resume Next

    Call oApp.Session.LogOn("Outlook", "")

    Call oApp.Session.SendAndReceive(True)

    If isQuit Then oApp.Quit

    Set oApp = Nothing

    On Error GoTo 0

End Sub
Другие вопросы по тегам