2013-04-11 2 views
0

J'écris un modèle Word personnalisé qui effectue un traitement lors de l'enregistrement du document en cours.Détection de la fonction de sauvegarde que l'utilisateur choisit dans Office2007 à l'aide de Word VBA

Dans Office2007, pour enregistrer un document, vous pouvez utiliser les fonctions Enregistrer et Enregistrer sous et gérer les événements avec les macros FileSave et FileSaveAs. Mais lorsque l'utilisateur survole l'option SaveAs, d'autres sous-options s'affichent: Enregistrer en tant que document, en tant que modèle Word, en tant que document Word 97-2003, etc. Ces sous-options ne semblent pas avoir leurs propres événements, mais j'aimerais savoir quand l'utilisateur les utilise.

J'ai donc eu l'idée d'utiliser l'événement DocumentBeforeSave, mais je dois encore déterminer si la sauvegarde s'est produite avec les options standard Save/SaveAs ou avec les sous-options. J'ai pensé à la définition d'une variable à True dans les fonctions Save/SaveAs, que l'événement DocumentBeforeSave vérifierait pour voir si l'une des méthodes d'enregistrement normales se produisait, puis il redéfinirait la variable à False.

Mais après avoir expérimenté avec différentes méthodes, je ne peux pas comprendre comment je peux passer la valeur d'une variable entre ThisDocument et le module de classe qui a l'événement BeforeSave.

Des idées? Merci!


Edit: Exemple de code qui ne fonctionne pas:

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 

Module Classe:

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 

L'enregistrement du module de classe est fait correct Je ne vais pas coller le code.

Le résultat affiché est vrai, faux, vrai alors qu'en théorie, il devrait être vrai, vrai.

+1

Je ne sais pas si je vous ai bien compris ... quel est votre véritable objectif? autoriser ou interdire l'enregistrement? prendre le contrôle du processus? ou simplement passer la valeur de l'objet à la classe ...Il semble que vous ayez une idée, mais la question n'est pas claire. Vous pouvez ajouter du code pour mieux comprendre vos besoins ... –

+0

Je souhaite le détecter et exécuter un extrait de code lorsque l'utilisateur enregistre le document avec les sous-options (sans utiliser les éléments de menu standard Enregistrer et Enregistrer). – Steve

+0

vous pouvez créer une autre propriété 'let let \ get' dans votre classe et utiliser cette propriété pour transmettre n'importe quelle valeur à votre classe. Ou ajoutez simplement 'public variable' dans votre classe qui pourrait prendre cette valeur que vous passez –

Répondre

1

Il me manque toujours quelque chose dans votre logique. Dans les commentaires, j'ai pensé à la logique inverse-inverse qui irait de cette façon. Ce code ci-dessous est un mélange de ma façon et du code que vous avez présenté.

Module de classe

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 

Module1

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

ThisDocument Module

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 

Je ne sais pas quelle comme vous allez exécuter FileSave sous. Mais après l'exécution, il transmet la valeur à la propriété de classe que vous pouvez vérifier dans votre événement. J'espère que cela vous aidera quand même.

+0

Ça marche, merci! – Steve

+0

Vous êtes les bienvenus :) –

Questions connexes