2015-11-11 44 views
0

我創建了一個在Outlook中創建電子郵件草稿的過程。用戶可以通過將其寫入範圍來修改電子郵件正文,並將其添加到保留所有格式選項的電子郵件中。在Outlook電子郵件維護格式中粘貼單元格內容

我的問題是,雖然我的程序起初工作,當我開始使用Word編輯器Microsoft Outlook開始崩潰的消息「Microsoft Outlook已停止運行」,當我殺死Outlook我收到消息「遠程過程失敗」在VBA上

爲什麼會發生這種情況?有沒有辦法在運行代碼之前打開Outlook以避免錯誤?

Public Sub CreateDraft(Destinatary As String, CC As String, Subject As String, Body As Range, Optional AttachmentPath As String = "") 
    Dim OutApp As Object 
    Dim OutMail As Object 
    Dim WordDoc As Word.Document 
    Dim WordRange As Word.Range 
    Set OutApp = CreateObject("Outlook.Application") 
    Set OutMail = OutApp.CreateItem(0) 
    With OutMail 
     .Display 
     .To = Destinatary 
     .CC = CC 
     .Subject = Subject 
     Set WordDoc = OutApp.ActiveInspector.WordEditor 
     Set WordRange = WordDoc.Goto(What:=wdGoToSection, Which:=wdGoToFirst) ' The code crashes here 
     Body.Copy 
     WordRange.PasteExcelTable LinkedToExcel:=False, WordFormatting:=False, RTF:=False 
     .HTMLBody = .HTMLBody 
     If (AttachmentPath <> "") Then 
      .Attachments.Add (AttachmentPath) 
     End If 
     .Save 
     .Close (False) 
    End With 
    Application.CutCopyMode = False 
    Set OutMail = Nothing 
    Set OutApp = Nothing 
End Sub 
+0

什麼是錯誤? – DanL

+0

Microsoft Outlook與消息「Microsoft Outlook已停止運行」崩潰。當我殺死Outlook時,VBA上出現「遠程過程失敗」 – lisovaccaro

回答

0

的問題不在於Outlook沒有運行,那就是當你編程方式打開Outlook中很不同的狀態,當用戶打開應用程序。諸如Word編輯器之類的東西無法正常工作。您可以通過逐步驗證代碼進行驗證,並且在創建Outlook圖標位於系統托盤中的Outlook.Application對象後,您應該看到它的工具提示將說明其他程序正在控制Outlook。

我的建議是確定Outlook何時處於此狀態,然後通知用戶他們需要確保Outlook在執行代碼之前運行。確定用戶是否已打開的一種方法是查看Explorers對象。當用戶打開Outlook時,總是至少有1個,如果沒有,你可以在再次嘗試之前提示用戶做一些事情。

Dim oApp As Outlook.Application 

' Open/Connect with Outlook 
Set oApp = CreateObject("Outlook.Application") 

' Check Outlook has been opened by a user 
While oApp.Explorers.Count = 0 

    If Not MsgBox("Please open Outlook and click Retry to try again.", vbExclamation + vbRetryCancel, "Outlook Not Open") = vbRetry Then 

     Exit Sub 
    End If 

Wend 

' Outlook has been opened by the user 
' Continue..... 
0

這是唯一的工作。我將OutApp和OutMail定義爲Outlook對象,然後從OutMail對象中獲取檢查器。使用.GetInspector方法。

Public Sub CreateDraft(Destinatary As String, CC As String, Subject As String, Body As Range, Field1 As String, Field2 As String, Field3 As String, Optional AttachmentPath As String = "") 
    Dim OutApp As New Outlook.Application 
    Dim OutMail As Outlook.MailItem 
    Dim OutInspector As Outlook.Inspector 
    Dim WordDoc As Word.Document 
    Dim WordRange As Word.Range 
    Set OutMail = OutApp.CreateItem(olMailItem) 
    With OutMail 
     .To = Destinatary 
     .CC = CC 
     .Subject = Subject 
     If AttachmentPath <> "" Then .Attachments.Add (AttachmentPath) 
     .Display 
     Set OutInspector = OutMail.GetInspector 
     Set WordDoc = OutInspector.WordEditor 
     If Not (WordDoc Is Nothing) Then 
      Set WordRange = WordDoc.Range(0, 0) 
      Call Body.Copy 
      Call WordRange.PasteExcelTable(LinkedToExcel:=False, WordFormatting:=False, RTF:=False) 
      Application.CutCopyMode = False 
     End If 
     Call .Save 
     Call .Close(False) 
    End With 
End Sub 
相關問題