VBA 不保存对显示为 .Display 的 Outlook 模板的更改
VBA does not save changes to Outlook Template that show up with .Display
我正在生成 OFT 文件,这些文件将通过电子邮件发送给客户,然后客户将填写收件人:和主题:并将它们作为电子邮件发送给他们的客户。
我的数据来自 Excel 工作簿,其中一个 sheet 包含静态数据(书籍)和用户粘贴的另一个信息(Pins)。我有一个基本模板,其中包含占位符文本,该文本被上述 Excel sheets.
中的数据替换
其中一个重要的部分是我需要将更改后的模板保存到它自己的文件中,以便以后可以存储它以供参考。最初我使用下面的代码设置来打开模板并调用 .SaveAs myFilename, olTemplate 但这只是创建了一个损坏的 3KB 文件。您会注意到我正在将模板复制到实际的目标文件并对其进行操作。
我的问题是,如果我有调用 .Display 的模板项,一切就完美了。我在正确的位置看到了我的图像,并且所有文本都被正确替换了。如果我调用 .Save,它会保存原始 OFT 模板的副本,不存在任何更改。
谁能告诉我我做错了什么?我一直在此处和 google 搜索了几个小时,试图找到我遗漏的一些迹象。我正在尝试尽可能地自动化这件事。使用 Outlook UI 重新保存新的 OFT 是同事的实时接收器,如果可能的话我想消除它。他们每天都会生成几十个这样的 OFT,所以在我看来这项工作似乎是值得的。
更新
我已经设法让这个工作,但解决方案感觉像是一个半答案。下面的代码已更新为正确保存 OFT 的更改。
这是我的子:
Sub OutlookTemplate(ByVal pins As Range, ByVal book As Range, ByVal ImageLocation As String)
Dim myolapp As Object
Dim myItem As Object
Set myolapp = CreateObject("Outlook.Application")
'myolapp.Session.Logon
For Each p In pins.Cells
If Not IsEmpty(p.Value) Then
Dim myFilename As String
myFilename = "c:\temp\" & Worksheets("PINS").Range("A2") & "-" & p.Value & ".oft"
FileCopy "c:\template.oft", myFilename
Set myItem = myolapp.CreateItemFromTemplate(myFilename)
myItem.Save <- Added immediate save after creation of myItem
myItem.Attachments.Add ImageLocation, olByValue, 0
myItem.HTMLBody = Replace(myItem.HTMLBody, "THEIMAGE", "<img src='cid:" & book.Cells(2).Value & "'" & "width='154'>")
myItem.HTMLBody = Replace(myItem.HTMLBody, "PINHERE", p.Value)
myItem.HTMLBody = Replace(myItem.HTMLBody, "THETITLE", book.Cells(1).Value)
myItem.HTMLBody = Replace(myItem.HTMLBody, "THESUBTITLE", book.Cells(3).Value)
myItem.HTMLBody = Replace(myItem.HTMLBody, "THEAUTHORS", book.Cells(4).Value)
myItem.HTMLBody = Replace(myItem.HTMLBody, "THEDESCRIPTION", book.Cells(5).Value)
' Leaving the next line off results in a broken image
' when .SaveAs is called
myItem.Display
' This saves all of the changes out to the file properly
' in combination with .Display
' Note: if I call myItem.SaveAs myFilename, olTemplate
' I get the 3KB broken OFT. Omitting ,olTemplate works
myItem.SaveAs myFilename
End If
Next
End Sub
Save 方法不会将更改传播到 .oft 文件。它将 Microsoft Outlook 项目保存到当前文件夹,或者如果这是一个新项目,则保存到该项目类型的 Outlook 默认文件夹。
尝试打开现有的 .oft 文件而不将其复制到任何地方。然后进行所需的更改并调用 SaveAs 方法将其保存为您需要的模板。
我正在生成 OFT 文件,这些文件将通过电子邮件发送给客户,然后客户将填写收件人:和主题:并将它们作为电子邮件发送给他们的客户。
我的数据来自 Excel 工作簿,其中一个 sheet 包含静态数据(书籍)和用户粘贴的另一个信息(Pins)。我有一个基本模板,其中包含占位符文本,该文本被上述 Excel sheets.
中的数据替换其中一个重要的部分是我需要将更改后的模板保存到它自己的文件中,以便以后可以存储它以供参考。最初我使用下面的代码设置来打开模板并调用 .SaveAs myFilename, olTemplate 但这只是创建了一个损坏的 3KB 文件。您会注意到我正在将模板复制到实际的目标文件并对其进行操作。
我的问题是,如果我有调用 .Display 的模板项,一切就完美了。我在正确的位置看到了我的图像,并且所有文本都被正确替换了。如果我调用 .Save,它会保存原始 OFT 模板的副本,不存在任何更改。
谁能告诉我我做错了什么?我一直在此处和 google 搜索了几个小时,试图找到我遗漏的一些迹象。我正在尝试尽可能地自动化这件事。使用 Outlook UI 重新保存新的 OFT 是同事的实时接收器,如果可能的话我想消除它。他们每天都会生成几十个这样的 OFT,所以在我看来这项工作似乎是值得的。
更新 我已经设法让这个工作,但解决方案感觉像是一个半答案。下面的代码已更新为正确保存 OFT 的更改。
这是我的子:
Sub OutlookTemplate(ByVal pins As Range, ByVal book As Range, ByVal ImageLocation As String)
Dim myolapp As Object
Dim myItem As Object
Set myolapp = CreateObject("Outlook.Application")
'myolapp.Session.Logon
For Each p In pins.Cells
If Not IsEmpty(p.Value) Then
Dim myFilename As String
myFilename = "c:\temp\" & Worksheets("PINS").Range("A2") & "-" & p.Value & ".oft"
FileCopy "c:\template.oft", myFilename
Set myItem = myolapp.CreateItemFromTemplate(myFilename)
myItem.Save <- Added immediate save after creation of myItem
myItem.Attachments.Add ImageLocation, olByValue, 0
myItem.HTMLBody = Replace(myItem.HTMLBody, "THEIMAGE", "<img src='cid:" & book.Cells(2).Value & "'" & "width='154'>")
myItem.HTMLBody = Replace(myItem.HTMLBody, "PINHERE", p.Value)
myItem.HTMLBody = Replace(myItem.HTMLBody, "THETITLE", book.Cells(1).Value)
myItem.HTMLBody = Replace(myItem.HTMLBody, "THESUBTITLE", book.Cells(3).Value)
myItem.HTMLBody = Replace(myItem.HTMLBody, "THEAUTHORS", book.Cells(4).Value)
myItem.HTMLBody = Replace(myItem.HTMLBody, "THEDESCRIPTION", book.Cells(5).Value)
' Leaving the next line off results in a broken image
' when .SaveAs is called
myItem.Display
' This saves all of the changes out to the file properly
' in combination with .Display
' Note: if I call myItem.SaveAs myFilename, olTemplate
' I get the 3KB broken OFT. Omitting ,olTemplate works
myItem.SaveAs myFilename
End If
Next
End Sub
Save 方法不会将更改传播到 .oft 文件。它将 Microsoft Outlook 项目保存到当前文件夹,或者如果这是一个新项目,则保存到该项目类型的 Outlook 默认文件夹。
尝试打开现有的 .oft 文件而不将其复制到任何地方。然后进行所需的更改并调用 SaveAs 方法将其保存为您需要的模板。