簡體   English   中英

Excel VBA Outlook / Mail函數需要重新計算或將所有公式設置為#Value

[英]Excel VBA Outlook / Mail functions requires recalculation or sets all formulas to #Value

我會盡量保持簡短和准確。 我真的希望你能幫助我。

我面臨以下問題:

背景:

  • 包含大量公式的工作簿->計算設置為手動
  • 每次重新計算需要5-10分鍾

我想做的事:

  • 單獨為多個人生成數據范圍
  • 然后選擇這些范圍,並將其粘貼到電子郵件正文中
  • 逐一發送這些電子郵件

問題是什么?

  1. 如果我使用“信封”方法准備電子郵件,則在按“發送”之前一切都很好。 但是,每按一次send excel,Excel都會自動重新計算整個工作簿。 顯然,我不想等待5到10分鍾來發送每封電子郵件(總是在10到20之間)

  2. 因為我認為可能與“信封”方法有關,所以我決定切換為直接通過Outlook(outlook對象)創建電子郵件。 只要打開電子郵件並發送它而無需重新計算,它就可以正常工作。 但是,通過Outlook打開電子郵件后,整個工作簿中的所有(!)公式都設置為#Value。 顯然,這也迫使我重新計算,因為我無法為下一個人的電子郵件創建表格。

有誰知道導致重新計算/錯誤值的原因以及如何制止它? 對於任何建議的解決方案,我都會感到非常高興。

我也附上了我的代碼,盡管我懷疑這將有助於解決問題。


`'DESCRIPTION:'該例程准備一封電子郵件,以請求可交付使用的所有者'1進行進度估算。 根據PI和配置表'2中的命名范圍設置所有值。 將所有相關字符串連接到完整的電子郵件文本'3。 選擇PI表'4。 創建電子郵件並顯示

子PrepareEmail()

Dim s_EmailAddress As String, s_FirstName As String
Dim s_Email_Greeting As String, s_Email_MainText1 As String, s_Email_MainText2 As String, s_Email_DeadlineRequest As String
Dim s_Email_Deadline As String, s_Email_Subject As String, s_Email_ClosingStatement As String, s_Email_SenderName As String, s_Email_CC As String
Dim s_Email_Full As String
Dim rng_PI_TableValues As Range, rng_PI_TableFull As Range

Dim s_Email_FullText As String

Dim obj_OutApp As Object
Dim obj_OutMail As Object


s_EmailAddress = [ptr_PI_Email]
s_FirstName = [ptr_PI_FirstName]
s_Email_Subject = [ptr_Config_PIEmail_Subject]
s_Email_Greeting = [ptr_Config_PIEmail_Greeting]
s_Email_MainText1 = [ptr_Config_PIEmail_MainText1]
s_Email_MainText2 = [ptr_Config_PIEmail_MainText2]
s_Email_DeadlineRequest = [ptr_Config_PIEmail_DeadlineRequest]
s_Email_Deadline = [ptr_Config_PIEmail_Deadline]
s_Email_ClosingStatement = [ptr_Config_PIEmail_ClosingStatement]
s_Email_SenderName = [ptr_Config_PIEmail_SenderName]
s_Email_CC = [ptr_Config_PIEmail_CC]

'Concatenate full e-mail (using HTML):
s_Email_Full = _
    "<basefont face=""Calibri"">" _
    & s_Email_Greeting & " " _
    & s_FirstName & ", " & "<br> <br>" _
    & s_Email_MainText1 & "<br>" _
    & s_Email_MainText2 & "<br> <br>" _
    & "<b>" & s_Email_DeadlineRequest & " " _
    & s_Email_Deadline & "</b>" & "<br> <br>" _
    & s_Email_ClosingStatement & "," & "<br>" _
    & s_Email_SenderName _
    & "<br><br><br>"
'-------------------------------------------------------

Set rng_PI_TableValues = Range("tbl_PI_ProgressInput")
Set rng_PI_TableFull = Union(rng_PI_TableValues, Range("tbl_PI_ProgressInput[#Headers]"))

Application.EnableEvents = False
Application.ScreenUpdating = False

Set obj_OutApp = CreateObject("Outlook.Application")
Set obj_OutMail = obj_OutApp.CreateItem(0)



With obj_OutMail

       .To = s_EmailAddress
       .CC = s_Email_CC
       .Subject = s_Email_Subject
       .HTMLBody = s_Email_Full & RangetoHTML(rng_PI_TableFull)
       .Display

End With

Application.EnableEvents = True
Application.ScreenUpdating = True

Call update_Status

結束子

`

如果您使用的是Ron de Bruin網站上的RangeToHTML,那就是造成您問題的原因。 如果您需要完美的保真度,並且格式很重,但是范圍很簡單,那么該實用程序就很好。 但是,如果您的范圍有很多依賴關系,那么您將遇到問題。 它將范圍放入自己的工作簿中,因此任何引用超出范圍數據的公式都會變得很時髦。

如果您需要完美的保真度,那么您就會陷入困境,因為唯一的完美方法就是將范圍另存為HTML並重新讀取。 但是,如果您沒有很多繁瑣的格式設置或只需要一個漂亮的表,那么我建議您編寫自己的RangeToHTML函數以生成HTML字符串。

如果您不想自己動手,David McRitchie的某些功能就做得很好。 http://dmcritchie.mvps.org/excel/xl2html.htm

另外,我不知道update_Status的作用,但是如果它導致重新計算,那么您有兩個問題。 如果是這種情況,請弄清楚如何存儲update_status所做的所有工作,並在結尾而不是循環中執行一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM