如何通过 "file > save as" 对话框使用宏来保存带密码的文档?

How to use macros to save a document with password via the "file > save as" dialog?

我创建了一个带有一些 VBA 宏的 Word 模板来提示用户输入密码。然后应该使用此密码来加密从模板创建的新文档。

启动代码已正确执行,用户表单也按预期工作。 我能够“only set a password" but the dialog for the "file > save as" function with the enum wdDialogFileSaveAs 似乎不像官方文档中所说的那样工作。

所以问题是:如何使用宏打开保存对话框来保存文档,并为给定的密码打开密码加密?

启动代码

这是从 Word 模板创建新文档时的启动代码:

'in TemplateProject > Microsoft Word Objects > ThisDocument
Private Sub Document_New()
    DialogSetPassword.Show
End Sub

用户表单

用户表单 DialogSetPassword 如下所示:

密码

仅设置密码或直接使用密码保存文档的代码如下所示:

'in TemplateProject > Forms > DialogSetPassword
Private Sub ButtonOnlySetPassword_Click()
    ActiveDocument.password = TextBoxPassword.Text
    MsgBox "Password successfully set"
    'Unload Me
End Sub

Private Sub ButtonSaveWithPassword_Click()
    MsgBox "Password is " & TextBoxPassword.Text  'just for debug reasons to see if the password is properly read
    'ActiveDocument.password = TextBoxPassword.Text  'it works when this line is present, then the password field is pre-filled
    With Application.Dialogs(wdDialogFileSaveAs)
        .Name = ThisDocument.FullName  'name of the template
        .Format = wdFormatXMLDocumentMacroEnabled  'saving as macro enabled document, as there are more macros
        .password = TextBoxPassword.Text
        .Show
    End With
    'Unload Me
End Sub

Private Sub TextBoxPassword_Change()
    If Len(TextBoxPassword.Text) = 0 Then
        ButtonOnlySetPassword.Enabled = False
        ButtonSaveWithPassword.Enabled = False
    Else
        ButtonOnlySetPassword.Enabled = True
        ButtonSaveWithPassword.Enabled = True
    End If
End Sub

根据文档,函数应接受 Name, Format, Password 等参数,但密码选项不起作用。

保存对话框

即使使用带有 .password 参数的对话框功能,保存对话框中的密码字段仍然为空(可以在“另存为>工具>常规选项>打开密码”下找到):

文档只列出了对话框的参数,没有详细说明它们是 read/write 还是只读的。如果你使用.Display方法,你会发现.Password是只读的。

对话框的 .Display.Show 方法 return 一个值,如 Long,指示用户的操作。要使用 return 值,您可以像调用任何其他函数一样调用这些方法,即 .Display().Show()

下面是对您的代码的修改。

Private Sub ButtonSaveWithPassword_Click()
    Dim ret As Long
    ActiveDocument.Password = TextBoxPassword.Text
    With Application.Dialogs(wdDialogFileSaveAs)
        .Name = ThisDocument.FullName  'name of the template
        .Format = wdFormatXMLDocumentMacroEnabled  'saving as macro enabled document, as there are more macros
        ret = .Show()
        If ret = 0 Then ActiveDocument.Password = vbNullString  'user cancelled save as dialog
    End With
End Sub