Word VBA强制另存为.docm [英] Word VBA force save as .docm

查看:239
本文介绍了Word VBA强制另存为.docm的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最终清理了整个公司使用的Word文档中的混乱情况.这是一个需要处理大量宏的文档,需要专门将其另存为.docm.我担心它会将另存为" -d用作除.docm以外的名称,但是我似乎找不到一种方法来限制另存为文件选择器"或在仍使用时替换保存的扩展名VBA.

I've ended up cleaning up someone's mess on a Word document that's used throughout my company. It is a macro-heavy document that needs to be saved as a .docm exclusively. I'm worried about it getting "save as"-d as something other than a .docm, but I can't seem to find a way to limit the save as file picker or swap out the extension on save as while still using VBA.

我该如何实现?

我尝试过的一些方法都徒劳无功: 这是正确的主意,但实际上并没有在保存 https://answers.microsoft.com/zh-cn/msoffice/forum/msoffice_word-mso_other/how-to -wddialogfilesaveas-dialog/535b7f9c-9972-425c-8483-35387a97d61d的设置路径

Some of the things I've tried, to no avail: This has the right idea, but doesn't actually limit the filetypes down on save 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不兼容.

Towards the bottom, Microsoft says that SaveAs isn't compatible with filter.clear and filter.add https://msdn.microsoft.com/en-us/library/office/aa219834(v=office.11).aspx

推荐答案

为了劫持Word中的本机"SaveAs"对话框,您需要利用DocumentBeforeSave的应用程序级事件,然后手动调用FileDialog ,以验证扩展名.

In order to hijack the native "SaveAs" dialog in Word, you need to lever the Application-level event for DocumentBeforeSave, and then call the FileDialog manually, in order to validate the extension.

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

2.创建一个名为cEventClass的类模块,并将以下代码放入模块中:

2. Create a Class Module called cEventClass and put this code in the module:

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

3.在ThisDocument模块中,执行以下代码:

3. In ThisDocument module, do the following code:

Private Sub Document_Close()
Call modEventHandler.ReleaseTrap
End Sub

Private Sub Document_Open()
Call modEventHandler.TrapEvents
End Sub

这如何工作?

ThisDocument引发Document_Open事件,该事件调用TrapEvents过程.

How Does This Work?

ThisDocument raises the Document_Open event which calls on the TrapEvents procedure.

TrapEvents过程创建Word.Application类的WithEvents实例,从而使其他事件暴露给自动化.其中之一是DocumentBeforeSave.

TrapEvents procedure creates a WithEvents instance of Word.Application class, exposing additional events to automation. One of these is DocumentBeforeSave.

我们使用DocumentBeforeSave事件来捕获SaveAs操作.如果用户已请求SaveAs,则我们将使用在CustomSaveAs过程中创建的逻辑来强制对话框.这使用简单的逻辑来测试所提供的文件扩展名,并且如果该文件不是DOCM扩展名,则可以防止文档被保存.如果FileDialog确实收到了有效的DOCM扩展名,则我们Execute将该文件另存为新名称的对话框.

We use the DocumentBeforeSave event to trap the SaveAs operation. If the User has requested a SaveAs, then we force the dialog with logic as created in CustomSaveAs procedure. This uses simple logic to test the file extension provided, and prevents the document from being saved if it is not a DOCM extension. If the FileDialog does receive a valid DOCM extension, then we Execute the dialog which saves the file as the new name.

这篇关于Word VBA强制另存为.docm的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆