2016-10-17 4 views
1

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

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

ЦЕЛЬ: Я отправляю 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") & "rs!CliName" 
    vallL = vallL & DLookup("[Memo]", "HtmlEmailT", "[ID] = 2") & "rs!InvoiceId" 
    vallL = vallL & DLookup("[Memo]", "HtmlEmailT", "[ID] = 3") & "rs!BalDue" 
    vallL = vallL & DLookup("[Memo]", "HtmlEmailT", "[ID] = 4") & "rs!InvoiceDate" 
    vallL = vallL & DLookup("[Memo]", "HtmlEmailT", "[ID] = 5") & "rs!InvTotal" 
    vallL = vallL & 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!!" & vbCrLf & "Please sign in first" 
End If 

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

End Sub 

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

+0

Когда вы запускаете этот код, Outlook открыт уже или вы можете открыть Open Outlook? – Chrismas007

+0

Приносим извинения, что не упоминаем об этом. Это происходит только тогда, когда внешний вид не открывается. Если он открыт, проблем нет. –

+0

Удалить при ошибке Продолжить. Не используйте его для всего кода. После того, как причина использования прошла, вам нужно включить On Error Goto 0. Кажется, это не причина для ее использования. – niton

ответ

1

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

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

+0

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

+0

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