#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 не закроется, пока не будет активирована ссылка на одного из его инспекторов.