![](/img/trans.png)
[英]MS Word vba to save .docm to .docx WITHOUT converting active document
[英]Word VBA force save as .docm
我最终清理了整个公司使用的 Word 文档上的某人的烂摊子。 它是一个需要单独保存为.docm
的宏文件。 我担心它会“另存为”-d 作为.docm
以外的其他.docm
,但我似乎无法找到一种方法来限制另存为文件选择器或在仍使用 VBA 的同时在保存时换出扩展名.
我怎样才能做到这一点?
编辑:我尝试过的一些事情,但无济于事:这是正确的想法,但实际上并没有限制保存https://answers.microsoft.com/en-us/msoffice/forum/ msoffice_word-mso_other/how-to-set-path-for-wddialogfilesaveas-dialog/535b7f9c-9972-425c-8483-35387a97d61d
在底部,微软表示 SaveAs 与 filter.clear 和 filter.add 不兼容https://msdn.microsoft.com/en-us/library/office/aa219834(v=office.11).aspx
为了劫持 Word 中的本机“另存为”对话框,您需要利用DocumentBeforeSave
的应用程序级事件,然后手动调用 FileDialog,以验证扩展名。
modEventHandler
。 将以下代码放入其中。Option Explicit
Public TrapFlag As Boolean
Public cWordObject As New cEventClass
'You may not need these in a DOCM, but I needed to implement this in an ADD-IN
Sub TrapEvents()
If TrapFlag Then
Exit Sub
End If
Set cWordObject.DOCEvent = Application
TrapFlag = True
End Sub
Sub ReleaseTrap()
If TrapFlag Then
Set cWordObject.DOCEvent = Nothing
Set cWordObject = Nothing
TrapFlag = False
End If
End Sub
cEventClass
的类模块并将此代码放入模块中:Option Explicit
Public WithEvents DOCEvent As Application
Private Sub DOCEvent_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
' Do not prevent SAVEAS for *other* documents
If ObjPtr(Doc) <> ObjPtr(ThisDocument) Then
Exit Sub
End If
If SaveAsUI Then
' The user has invoked SAVE AS command , so we will hijack this and use our own FileDialog
Call CustomSaveAs(Doc)
' Prevent duplicate appearance of the SAVEAS FileDialog
Cancel = True
End If
End Sub
Private Sub CustomSaveAs(ByRef Doc As Document)
Dim fd As FileDialog
Dim filename$
Set fd = Application.FileDialog(msoFileDialogSaveAs)
fd.Show
If fd.SelectedItems.Count = 0 Then Exit Sub
filename = fd.SelectedItems(1)
If Not Right(filename, 4) = "docm" Then
' ### DO NOT EXECUTE this dialog unless it matches our .DOCM file extension
MsgBox "This document should only be saved as a DOCM / Macro-Enabled Document", vbCritical, "NOT SAVED!"
Else
fd.Execute
End If
End Sub
ThisDocument
模块中,执行以下代码:Private Sub Document_Close()
Call modEventHandler.ReleaseTrap
End Sub
Private Sub Document_Open()
Call modEventHandler.TrapEvents
End Sub
ThisDocument
引发Document_Open
事件,该事件调用TrapEvents
过程。
TrapEvents
过程创建Word.Application
类的WithEvents
实例,向自动化公开其他事件。 其中之一是DocumentBeforeSave
。
我们使用DocumentBeforeSave
事件来捕获SaveAs
操作。 如果用户请求了SaveAs
,那么我们将使用在CustomSaveAs
过程中创建的逻辑强制对话框。 这使用简单的逻辑来测试提供的文件扩展名,并防止文档不是 DOCM 扩展名时被保存。 如果 FileDialog 确实收到了有效的 DOCM 扩展名,那么我们Execute
将文件保存为新名称的对话框。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.