Outlook закрывается при нажатии кнопки отправить на сгенерированном VBA электронном письме

#ms-access #outlook #vba #ms-access-2013

#ms-access #outlook #vba #ms-access-2013

Вопрос:

Последние пару месяцев я работаю над базой данных для своей собственной организации. Я использую Office 2013. Я взял код из Интернета для отправки электронной почты своим клиентам с помощью Outlook. Но независимо от того, сколько я редактирую код, проблема все еще существует.

Я установил .Display свойство, чтобы пользователь мог видеть сообщение перед отправкой.Проблема в том, что он отображает мне сообщение, но когда я нажимаю на кнопку отправить, он закрывает Outlook. Однако, если я использую .Send свойство mail, проблем не возникает.

ЦЕЛЬ: я отправляю электронное письмо в формате html, я сохранил HTML-код в своей таблице, чтобы я мог получить шаблон одним нажатием кнопки. Которое будет доступно пользователю для дальнейшего редактирования. Альтернативы приветствуются! : D

 Private Sub CmdEmail_Click() 

Dim oApp As Object 
Dim oMail As Object 
Dim olAccount As Object 
Dim olAccounts As Object 
Dim olAccountTemp As Object 
Dim vallL As String 
Dim foundAccount As Boolean 
Dim strFrom As String 

On Error Resume Next 
Set oApp = CreateObject("Outlook.Application") 
Set oMail = oApp.CreateItem(olMailItem) 
Set olAccount = oApp.Account 
Set olAccountTemp = oApp.Account 

strFrom = CompanyEmail 
foundAccount = False 
Set olAccounts = oApp.Application.Session.Accounts 
For Each olAccountTemp In olAccounts 
 Debug.Print olAccountTemp.SmtpAddress 
 If (olAccountTemp.SmtpAddress = strFrom) Then 
  Set olAccount = olAccountTemp 
  foundAccount = True 
  Exit For 
 End If 
Next 

Set oMail.SendUsingAccount = olAccount 
If foundAccount Then 
 Debug.Print "ACCT FOUND!" 
 With oMail 
  .BodyFormat = olFormatHTML 'Set body format to HTML 
     vallL = DLookup("[Memo]", "HtmlEmailT", "[ID] = 1") amp; "rs!CliName" 
     vallL = vallL amp; DLookup("[Memo]", "HtmlEmailT", "[ID] = 2") amp; "rs!InvoiceId" 
     vallL = vallL amp; DLookup("[Memo]", "HtmlEmailT", "[ID] = 3") amp; "rs!BalDue" 
     vallL = vallL amp; DLookup("[Memo]", "HtmlEmailT", "[ID] = 4") amp; "rs!InvoiceDate" 
     vallL = vallL amp; DLookup("[Memo]", "HtmlEmailT", "[ID] = 5") amp; "rs!InvTotal" 
     vallL = vallL amp; DLookup("[Memo]", "HtmlEmailT", "[ID] = 6") 
  .HTMLBody = vallL 
  .SendUsingAccount = olAccount 
  .SentOnBehalfOfName = """CompnayName"" <CompanyEmail>" 
  .Display 
  '.Send 
 End With 
Else 
   Debug.Print "No acct found" 
   MsgBox "The chosen email is not signed in!!" amp; vbCrLf amp; "Please sign in first" 
End If 

Set oApp = Nothing 
Set oMail = Nothing 
Set olAccounts = Nothing 
Set olAccount = Nothing 
Set olAccountTemp = Nothing 

End Sub 
  

* Адрес электронной почты компании и название компании не являются полями.

Комментарии:

1. При запуске этого кода Outlook уже открыт или вы разрешаете коду открывать Outlook?

2. Я прошу прощения за то, что не упомянул об этом. Это происходит только тогда, когда Outlook не открыт. Если он открыт, проблем нет.

3. Удалить при возобновлении ошибки далее. Не используйте его для всего вашего кода. После того, как причина использования прошла, вам нужно получить сообщение об ошибке 0. Похоже, это не причина для его использования здесь.

4. Привет, @niton, спасибо за ваш ответ. При удалении «при повторном возобновлении ошибки» появляется всплывающее окно с ошибкой. И это происходит в обеих ситуациях (Outlook закрыт или открыт). Ошибка времени выполнения 438: объект не поддерживает это свойство или метод. И выделите следующую строку: «Установить olAccount = oApp. Учетная запись «.

5. Удаление при повторном возобновлении ошибки не является ответом на этот конкретный вопрос. Это позволяет исправлять ошибки, а не игнорировать их. Подозревать любой код без внимательного отслеживания ошибки Goto 0 при использовании при возобновлении ошибки Next. Похоже, код делает то, что вы хотите, по счастливой случайности. Все, что вы делаете в нем, будет ненадежным.

Ответ №1:

Outlook завершает работу, как только закрывается последнее из его окон (проводник или инспектор).

Вы можете использовать MailItem.Получите Inspector и сохраните возвращаемое значение в переменной, чтобы предотвратить закрытие Outlook.

Комментарии:

1. Привет @dmitry, спасибо за помощь, не могли бы вы объяснить немного подробнее, как мне использовать его для преодоления моей ситуации. Я не понял, как использовать mailitem.getinspector. Что мне делать после сохранения значения в переменной, чтобы предотвратить закрытие Outlook ?

2. Просто сохраните значение в переменной — Outlook не закроется, пока не будет активирована ссылка на одного из его инспекторов.