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