0

我会尽量保持简短和准确。我真的希望你能帮助我。

我面临以下问题:

背景:

  • 包含大量公式的工作簿 -> 计算设置为手动
  • 每次重新计算需要 5-10 分钟

我想做的事:

  • 为多人单独生成数据范围
  • 然后选择这些范围,并将它们粘贴到电子邮件的正文中
  • 一封一封地发送那些电子邮件

问题是什么?

  1. 如果我使用“信封”方法来准备电子邮件,那么一切都很好,直到我按下发送。但是,每次我按下发送 excel 都会自动重新计算整个工作簿。显然我不想等待 5-10 分钟来发送每封电子邮件(总是在 10 到 20 之间)

  2. 因为我认为这可能与“信封”方法有关,所以我决定切换到直接通过 Outlook(outlook 对象)创建电子邮件。它可以很好地打开电子邮件并发送它而无需重新计算。但是,在 Outlook 打开电子邮件后,整个工作簿中的所有 (!) 公式都设置为 #Value。这显然也迫使我重新计算,因为我无法为下一个人的电子邮件创建表格。

有谁知道是什么导致了重新计算/错误值以及我可以做些什么来阻止它?对于任何建议的解决方案,我都会非常高兴。

我还附上了我的代码,但我怀疑它是否有助于解决问题


''描述:'这个例程准备一封电子邮件,用于向交付物所有者请求进度估计'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

结束子

`

4

1 回答 1

0

如果您使用的是 Ron de Bruin 网站上的 RangeToHTML,那就是导致您的问题的原因。如果您需要完美的保真度并且具有重格式但相当简单的范围,那么该实用程序很好。但是如果你的范围有一堆依赖,你就会遇到问题。它将范围放入自己的工作簿中,因此任何引用范围外数据的公式都会变得时髦。

如果您需要完美的保真度,那么您将陷入困境,因为完美的唯一方法是将范围保存为 HTML 并将其读回。但是如果你没有大量的格式或者你只需​​要一个漂亮的表格,那么我建议你编写自己的 RangeToHTML 函数来生成 HTML 字符串。

如果您不想自己动手,David McRitchie 有一些功能可以做得很好。http://dmcritchie.mvps.org/excel/xl2html.htm

另外,我不知道 update_Status 做了什么,但如果它导致重新计算,那么你有两个问题。如果是这种情况,请弄清楚如何存储 update_status 所做的所有内容,并在最后而不是在循环中执行一次。

于 2013-08-12T16:11:32.080 回答