MS Word vba 无需转换活动文档即可将 .docm 保存为 .docx

MS Word vba to save .docm to .docx WITHOUT converting active document

我有一个带宏的 MS Word 文档 (.docm)

基于许多 Whosebug 帖子,我编写了一个宏来导出为 pdf 并另存为 .docx

我 open/edit .docm 文档,它有一个 onSave 宏,可以将文档保存为 .pdf 格式和 .docx 格式,我分发给其他人使用。我将始终对 .docm 文档进行更改。

我的问题是这样做会将活动(打开)文档从 .docm 转换为 .docx,这样我就不再对 .docm 进行更改。

Sub SaveActiveDocumentAsDocx()

    On Error GoTo Errhandler

    If InStrRev(ActiveDocument.FullName, ".") <> 0 Then

        Dim strPath As String
        strPath = Left(ActiveDocument.FullName, InStrRev(ActiveDocument.FullName, ".") - 1) & ".docx"
        ActiveDocument.SaveAs2 FileName:=strPath, FileFormat:=wdFormatDocumentDefault
        
    End If

    On Error GoTo 0

    Exit Sub

Errhandler:

    MsgBox "There was an error saving a copy of this document as DOCX. " & _
    "Ensure that the DOCX is not open for viewing and that the destination path is writable. Error code: " & Err

End Sub

我找不到任何参数来阻止“saveas”或“saveas2”中活动文档的这种转换

此外,在“saveas”命令之后,不会执行原始宏中的任何附加行,因为活动文档不再包含宏。我尝试向宏添加行以重新打开原始 .docm,然后关闭 .docx,但这些命令永远不会执行。

我希望我只是遗漏了一些简单的东西?

Sub SaveAMacrolessCopyOfActiveDocument()
    ' Charles Kenyon 2 October 2020
    ' Save a copy of active document as a macrofree document
    '
    Dim oDocument As Document
    Dim oNewDocument As Document
    Dim iLength As Long
    Dim strName As String
    Set oDocument = ActiveDocument '  - saves a copy of the active document
    ' Set oDocument = ThisDocument '- saves copy of code container rather than ActiveDocument
    Let iLength = Len(oDocument.Name) - 5
    Let strName = Left(oDocument.Name, iLength)
    Set oNewDocument = Documents.Add(Template:=oDocument.FullName, DocumentType:=wdNewBlankDocument, Visible:=False)
    oNewDocument.SaveAs2 FileName:=strName & ".docx", FileFormat:= _
        wdFormatXMLDocument, LockComments:=False, Password:="", AddToRecentFiles _
        :=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts _
        :=False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
        SaveAsAOCELetter:=False, CompatibilityMode:=15
    oNewDocument.Close SaveChanges:=False
    ' Clean up
    Set oDocument = Nothing
    Set oNewDocument = Nothing
End Sub

以上代码创建并保存同名的 ActiveDocument 副本,但保存为 .docx 格式的文档 (macro-free)。 .Add 命令中可见的 属性 意味着它不会出现在屏幕上,它被程序关闭。新文档将出现在最近的文档中。