Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA不会保存对Outlook模板所做的更改,这些更改会显示为.Display_Excel_Vba_Templates_Outlook - Fatal编程技术网

Excel VBA不会保存对Outlook模板所做的更改,这些更改会显示为.Display

Excel VBA不会保存对Outlook模板所做的更改,这些更改会显示为.Display,excel,vba,templates,outlook,Excel,Vba,Templates,Outlook,我正在努力生成OFT文件,这些文件将通过电子邮件发送给客户,然后客户将填写to:和Subject:in,并将其作为电子邮件发送给客户 我的数据来自Excel工作簿,其中一张表包含静态数据(书籍),另一张表包含用户粘贴的信息(PIN)。我有一个基本模板,它有占位符文本,被前面提到的Excel表格中的数据替换 其中一个重要的部分是,我需要将更改后的模板保存到它自己的文件中,以便存储起来供以后参考。最初,我有下面的代码来打开模板并调用.SaveAs myFilename,olTemplate,但这只是

我正在努力生成OFT文件,这些文件将通过电子邮件发送给客户,然后客户将填写to:和Subject:in,并将其作为电子邮件发送给客户

我的数据来自Excel工作簿,其中一张表包含静态数据(书籍),另一张表包含用户粘贴的信息(PIN)。我有一个基本模板,它有占位符文本,被前面提到的Excel表格中的数据替换

其中一个重要的部分是,我需要将更改后的模板保存到它自己的文件中,以便存储起来供以后参考。最初,我有下面的代码来打开模板并调用.SaveAs myFilename,olTemplate,但这只是一个3KB的文件。您会注意到,我正在将模板复制到实际的目标文件,并对其进行操作

我的问题是,如果我有模板项call.Display,那么一切都是完美的。我在正确的位置看到了我的图像,所有的文字都被正确地替换了。如果我调用.Save,它将保存原始OFT模板的副本,且不存在任何更改

有人能告诉我我做错了什么吗?我已经在这里和谷歌搜索了几个小时,试图找到一些我缺少的东西的迹象。我正在尽可能地自动化这件事。用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
Sub-OutlookTemplate(ByVal pins作为范围,ByVal book作为范围,ByVal ImageLocation作为字符串)
作为对象的模糊myolapp
将myItem设置为对象
设置myolapp=CreateObject(“Outlook.Application”)
'myolapp.Session.Logon
每个p在管脚单元中
如果不是空的(p.值),则
将myFilename设置为字符串
myFilename=“c:\temp\”和工作表(“PINS”).Range(“A2”)和“-”以及p.Value和“.oft”
文件副本“c:\template.oft”,myFilename
设置myItem=myolapp.CreateItemFromTemplate(myFilename)

myItem.SaveSave方法不会将更改传播到.oft文件。它将Microsoft Outlook项目保存到当前文件夹中,如果是新项目,则保存到该项目类型的Outlook默认文件夹中


尝试打开现有的.oft文件,而不将其复制到任何地方。然后执行所需的更改并调用该方法,以便在需要时将其保存为模板

这太令人沮丧了。我以前从未尝试过这种方法,但是在默认位置使用模板快速测试CreateItemFromTemplate效果很好。更改将保存到“草稿”文件夹。当然,我是在开放应用程序中进行的,而不是调用新的应用程序。在我的脑海里,有一些关于首先显示应用程序和ActiveInspector窗口的东西,但我不明白为什么这在这里很重要。为什么要将模板复制到其他位置,而不是使用默认的Outlook位置?你有这个功能的简化版本吗?如果没有,可以简化。我将模板复制到一个新文件中,因为如果我尝试使用另一个文件名的SaveAs(也为SaveAs提供了olTemplate),我会遇到错误。我的起始模板大约为56KB,我从SaveAs获取的文件为3KB,Outlook试图打开时抛出了一个错误。我不愿意承认这一点,但因为我没有定期使用Outlook,我甚至不知道你建议我把文件放在哪里。我尝试了c:\users\zach\AppData\Roaming\Microsoft\Outlook,结果相同。我一开始使用c:\和c:\ temp,因为它不太容易键入。我首先尝试在原始模板上使用SaveAs。它看起来是这样的
myItem.SaveAs myFilename,olTemplate
。没有文件复制之类的事情。结果是outlook无法打开一个3KB的文件。我将把起始模板移动到c:\temp,然后再次尝试另存为,但不提供任何其他路径信息。请尝试选择其他驱动器或文件夹。C:驱动器需要管理员权限才能在最近的Windows操作系统上写入。您是否能够将邮件作为模板保存到指定的文件夹中?你看到3KB坏了吗?如果我打开outlook,我可以毫无问题地将邮件保存到c:\temp。如果我在myItem上调用.Display,我可以使用Outlook UI将新模板保存到该文件夹中,并且我所做的更改已存在。我刚刚将模板从c:\移动到c:\ temp,并更新了我的VBA以使用带有新文件名的SaveAs和作为变体的olTemplate。仍然是一个3KB的文件。这里只是更改了工作表(“PINS”).Range(“A2”)&“&p.Value&“.oft”Set myItem=myolapp.CreateItemFromTemplate(“c:\temp\template.oft”)myItem.SaveAs myFilename,olTemplate的行