附加到电子邮件后删除文档

Posted

技术标签:

【中文标题】附加到电子邮件后删除文档【英文标题】:Delete document after attaching to email 【发布时间】:2017-03-31 04:21:09 【问题描述】:

这里是新手。我用提交按钮创建了一个启用宏的 word 文档。该文档是只读的,所以我要做的是让它保存一个临时文件,附加临时文件,然后将其删除。很简单,对吧?一切正常,除了它不会删除。附件是提交按钮的代码。请帮忙!谢谢。

Public Sub SubmitButton_Click()
Dim OL              As Object
Dim EmailItem       As Object
Dim Doc             As Document
Dim sTempFilePath   As String

Application.ScreenUpdating = False
sTempFilePath = ("C:\temp\test.doc")

Set OL = CreateObject("Outlook.Application")
Set EmailItem = OL.CreateItem(olMailItem)
Set Doc = ActiveDocument
ActiveDocument.SaveAs FileName:="C:\temp\test.doc"
With EmailItem
    .Subject = "Application For Leave Form"
    .To = "email@email.com"
    .Attachments.Add sTempFilePath
    .Send
End With

Application.ScreenUpdating = True
Set OL = Nothing
Set EmailItem = Nothing
Set Doc = Nothing
ActiveDocument.Close
Kill sTempFilePath

End Sub

为简单起见,我取出了很多代码,但它仍然没有删除文件。这有什么问题?

Public Sub SubmitButton_Click()
Dim Doc             As Document
Dim sTempFilePath   As String

sTempFilePath = ("C:\temp\test.doc")

Set Doc = ActiveDocument

ActiveDocument.SaveAs FileName:="C:\temp\test.doc"

ActiveDocument.Close

Kill sTempFilePath

End Sub

【问题讨论】:

你好。检查this answer 看看是否有帮助 请更新您的问题并在此处发布代码 我不熟悉 Word 的 VBA,但通过调试代码我注意到在 ActiveDocument.Close 行中,您实际上正在关闭正在运行宏的文档,因此 Kill sTempFilePath 永远不会执行 这绝对有道理!关于我应该如何去做的任何想法?如果我将 Kill 移到它上面,我会收到拒绝访问错误(正在使用中)。 看我的回答,虽然 user3598756 也提供了替代解决方案 【参考方案1】:

您可以将新文档作为副本添加到当前文档,并将该副本保存到所需位置。然后,一旦关闭文件,您将关闭新创建的文件并可以成功删除它。 这对我有用,希望对你有用。

查看您的 sn-p 的代码:

Dim Doc             As Document
Dim sTempFilePath   As String

sTempFilePath = ("C:\temp\test.doc")

'the next line copies the active document
Application.Documents.Add ActiveDocument.FullName

ActiveDocument.SaveAs FileName:="C:\temp\test.doc"

ActiveDocument.Close

Kill sTempFilePath

将此应用于您的工作代码,您将拥有:

Public Sub SubmitButton_Click()
Dim OL              As Object
Dim EmailItem       As Object
'Dim Doc             As Document   'not needed
Dim sTempFilePath   As String

Application.ScreenUpdating = False
sTempFilePath = ("C:\temp\test.doc")

Set OL = CreateObject("Outlook.Application")
Set EmailItem = OL.CreateItem(olMailItem)
'Set Doc = ActiveDocument ' not needed
Application.Documents.Add ActiveDocument.FullName
ActiveDocument.SaveAs FileName:="C:\temp\test.doc"
With EmailItem
    .Subject = "Application For Leave Form"
    .To = "email@email.com"
    .Attachments.Add sTempFilePath
    .Send
End With

Application.ScreenUpdating = True
Set OL = Nothing
Set EmailItem = Nothing
'Set Doc = Nothing
ActiveDocument.Close
Kill sTempFilePath

End Sub

参考:http://www.vbaexpress.com/kb/getarticle.php?kb_id=961

【讨论】:

谢谢大家!我明天将再次深入研究它,我一定会发布结果。 维克多,谢谢。这很完美。更好的是它不会关闭原始文件,因此用户可以在不重新打开的情况下填写几次。惊人的。不过,我想知道,将附件和主题行重命名为“请假申请表 - 头尾”(如在 Word 表单中填写的姓名)有多难?名字和姓氏放在 Word 中的“富文本内容控件”中。 我很高兴为您解决了问题。正如我之前提到的,我对 Word 的 VBA 了解不多,但我认为您可以在 here、here 和 here 中了解您需要的内容。如果您在那之后有问题,我会在新问题中发布另一个问题。快乐编码:)【参考方案2】:

使用FileSytemObject()对象复制想要的文件,最后删除它

这是一个后期绑定的例子

Public Sub SubmitButton_Click()
    Dim sTempFilePath   As String

    sTempFilePath = ("C:\temp\test.doc")

    With CreateObject("Scripting.FileSystemObject") '<--| instantiate a running instance of 'FileSystemObject' object
        .CopyFile ActiveDocument.FullName, sTempFilePath '<--| copy active document into a new file
    End With

    '....code to process sTempFilePath

    Kill sTempFilePath '<--| and finally... kill it!

End Sub

【讨论】:

以上是关于附加到电子邮件后删除文档的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 和 Nodemailer:我们可以将 PDF 文档附加到电子邮件中吗?

从NSString中删除一些特殊字符,以获取附加到电子邮件的文件名PDF

Lotus Notes电子邮件作为另一封电子邮件的附件

我找不到我创建的Google脚本(未附加到电子表格)

将 Word 文档作为附件附加 - 路径规范 ASP.NET MVC 3

MVCMailer SendAsync 和删除附件