使用Word VBA检测用户在Office2007中选择的保存功能

时间:2013-04-11 06:26:03

标签: vba word-vba office-2007 word-2007

我正在编写一个自定义Word模板,在保存当前文档时会执行一些处理。

在Office2007中,要保存文档,可以使用“保存”和“另存为”功能,并使用FileSave和FileSaveAs宏处理事件。

但是当用户将鼠标悬停在SaveAs选项上时,会显示其他子选项:另存为文档,Word模板,Word 97-2003文档等。这些子选项似乎没有自己的事件,但我想知道用户何时使用它们。

所以我提出了使用DocumentBeforeSave事件的想法,但是我仍然需要弄清楚是否使用标准的Save / SaveAs选项或子选项进行了保存。

我考虑过在Save / SaveAs函数中将变量设置为True,DocumentBeforeSave事件会检查是否发生了一个正常的保存方法,然后将变量设置为False。

但是在尝试了不同的方法之后,我无法弄清楚如何在ThisDocument和具有BeforeSave事件的类模块之间传递变量的值。

有什么想法吗?谢谢!


编辑:不起作用的示例代码:

的ThisDocument:

Public pSSave As Boolean

Public Property Get SSave() As Boolean
    SSave = pSSave
End Property

Public Property Let SSave(Value As Boolean)
    pSSave = Value
End Property

Sub FileSave()

Me.SSave = True

If SSave = True Then
    MsgBox "True"
End If

Application.ActiveDocument.Save

If SSave = True Then
    MsgBox "True"
End If

End Sub

课程模块:

Private Sub App_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)

    If Application.ActiveDocument.SSave = False Then
        MsgBox "False"
    End If
End Sub

类模块注册正确完成,我不会将代码粘贴到她身上。

显示的结果为True,False,True,理论上,它应为True,True。

1 个答案:

答案 0 :(得分:1)

我仍然怀念你的逻辑。在评论中,我想到了不同的反向逻辑,这将是这样的。下面的代码是我的方式和您提供的代码的混合。

课程模块

Public WithEvents App As Word.Application

Public pSSave As Boolean   'your class variable/property

Private Sub App_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
If pSSave = False Then
    MsgBox pSSave
Else
    MsgBox pSSave
End If
End Sub

<强>模块1

'class initialization
Public wrdAPP As New myClass
Sub set_References()
    Set wrdAPP.App = Application
End Sub

此文档模块

Private Sub Document_Open()
'to initialize public variable when open
    Call Module1.set_References
End Sub

Sub FileSave()

wrdAPP.pSSave = True

Application.ActiveDocument.Save

If wrdAPP.pSSave = True Then
    MsgBox "True"
End If

End Sub

我不知道您将以哪种方式运行FileSave sub。但是在运行之后,它会将值传递给class属性,您可以在事件中检查它。 希望无论如何它会帮助你。