【问题标题】:How can I delete macros from word-file when saving with SaveAs2?使用 SaveAs2 保存时如何从 word 文件中删除宏?
【发布时间】:2019-02-08 08:45:45
【问题描述】:

所以,我有一个 Word 模板,里面有宏。我想达到什么目标?

保存文件后,我想将 Word 文件另存为具有新名称和新目的地的新 docx 文件。

当我现在点击保存时,文件已经用新名称和新目的地正确保存(也作为 *docx 文件),但宏仍在内部,所以当我现在按保存时,宏仍在执行(这就是我想删除)。

那么如何在保存文件时删除新文件中的所有宏呢?

我当前的代码是:

Sub FileSave()
'
' saveFile Macro
'
'
    DocDate = ActiveDocument.Tables(1).Cell(4, 2)
    GCCName = ActiveDocument.Tables(1).Cell(8, 1)
    FileExtension = ".docx"
    matchedStr = GCCName & " - " & DocDate & FileExtension

    matchedStr = Replace(matchedStr, "", "")
    matchedStr = Replace(matchedStr, Chr(13), "")

    ActiveDocument.Save
    ChangeFileOpenDirectory "########\"
    ActiveDocument.SaveAs2 FileName:= _
        matchedStr, FileFormat:= _
        wdFormatXMLDocument, LockComments:=False, Password:="", _
        AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _
        EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData _
        :=False, SaveAsAOCELetter:=False, CompatibilityMode:=15
End Sub

【问题讨论】:

  • 如果您有 Word 模板 (dotm),则不应打开模板来创建文档:您应该从一开始就创建一个新文档。如果新文档是由代码生成的,则使用Documents.Add 而不是Documents.New。新文档将包含 no 宏,可以毫无问题地保存为 docx。
  • @max_0512 一个 docx 文件 - 这是您的代码使用的保存格式 - 不能包含宏。但是,它可以继续访问它所基于的模板中的任何宏 - 前提是该模板是可访问的。

标签: vba ms-word


【解决方案1】:

如果您有 Word 模板 (dotm),则不应打开模板来创建文档:您应该从一开始就创建一个新文档。如果新文档是由代码生成的,则使用Documents.Add 而不是Documents.New。新文档将包含 no 宏,可以毫无问题地保存为 docx。

如今,可以将模板文件保存为具有 docx 扩展名的文件和“没有宏的文档”文件格式 - 这将起作用。 (在早期版本的 Word 中,使用 *.dot 文件格式,它没有。)

但是,文档仍然会有一个 链接 到模板,并且能够通过该链接“看到”宏。这可能是您认为宏被保存在 docx 文档中的原因。如果此类文件是“在家外”发送的(发送到无法访问其所在文件夹中模板的位置),则宏将显示或可用。

如果您想将文档与其模板完全分离,请将其附加到不同的模板(通常是 Normal.dotm,因为它适用于所有 Word 安装)。基于问题中代码的示例:

ActiveDocument.AttachedTemplate = NormalTemplate

这需要位于代码的末尾,因为它会将其与执行操作的代码分离。

问题中代码的提示:使用ActiveDocument 可能不可靠 - 不确定它是否始终是预期的文档(例如,用户可以激活不同的文档)。更可靠的方法是使用 Document 对象。这同样适用于其他事物,例如表格。例如:

Dim doc as Word.Document
Dim tbl as Word.Table
Set doc = ActiveDocument
' do things with the document...
Set tbl = doc.Tables(1)
' do things with the table
DocDate = tbl.Cells(4,2).Range.Text
GCCName = tbl.Cell(8, 1).Range.Text
doc.Save

【讨论】:

    【解决方案2】:

    docm 文件的替代方案,取自我的项目

    NameNoExtension 是新文件的名称。将您的路径放在我的代码中 SelectSaveDir() 的位置。代码打开代码所在文件的副本,删除所有 vba 模块并将复制的文件保存为 docx。

    Sub SaveCopyAsDocx(ByVal NameNoExtension As String)
        Dim NewDocument As Object
        Set NewDocument = Documents.Add(ThisDocument.FullName)
    
        Dim Modul As Object
    
        For Each Modul In NewDocument.VBProject.VBComponents
            If Modul.Name <> "ThisDocument" Then
                NewDocument.VBProject.VBComponents.Remove Modul
            End If
        Next
    
        NewDocument.SaveAs SelectSaveDir() & "\" & NameNoExtension & ".docx"
    
    End Sub
    

    【讨论】:

    • 这是完全没有必要的。根据我昨天对 OP 的评论,只需以 docx 格式保存就足以删除所有宏。
    • @macropod 这根本不是真的。如果主文档是docm文件(带有宏的普通文件)并且您尝试将其保存为docx,Word 2016将拒绝将其保存为docx文件,您必须先删除宏。
    • 您确实需要了解 Word 的工作原理 - 您的说法完全是错误的。 @majka Word 2016 与 2007 年以后的所有其他 Word 版本一样,如果您通过 GUI 执行此操作,则会简单地警告您;当通过 SaveAs 或 SaveAs2 并指定 FileFormat:=wdFormatXMLDocument (OP 使用)保存在 VBA 中时,没有给出这样的警告 - 并且不存在假定的限制。
    猜你喜欢
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2023-03-08
    相关资源
    最近更新 更多