Carte du site
 Remerciements
 Netiquette
 Bugs
 Tables
 Requêtes
 Formulaires
 États (rapports)
 Modules
 APIs
 Chaînes
 Date/Time
 Général
 Ressources
 Téléchargeables

 Termes d'usage

Modules: Utiliser WithEvents pour obtenir le nom de fichiers

Author(s)
Dev Ashish

Utiliser WithEvents pour obtenir le nom de fichiers.

(Q)    J'utilise Automation pour démarrer  Excel ou Word. Il me faut connaître le nom et chemin de tous les documents que l'utilisateur a sauvegardé pour une session particulière de cette application. Comment puis-je obtenir cette information avant l'objet Automation ne soit fermé par l'utilisateur?

(A)    Access 97 introduit WithEvents qui nous permet de répondre à des événements déclenchés par un objet  ActiveX.  Microsoft Excel expose l'événement WorkbookBeforeClose que nous pouvons saisir pour la sauvegarde des fichiers.  Tout ce qu'il nous faut, c'est un module de classe, cExcel.

Class cExcel

'************ Code Start **************
Public WithEvents mobjXLApp As Excel.Application

Private Sub Class_Initialize()
    Set mobjXLApp = New Excel.Application
    mobjXLApp.Visible = True
End Sub

Private Sub mobjXLApp_WorkbookBeforeClose( _
            ByVal Wb As Excel.Workbook, _
            Cancel As Boolean)
Dim strSave As String

    With mobjXLApp
        If Wb.Saved = False Then
            If Wb.Path = vbNullString Then
                strSave = .GetSaveAsFilename( _
                        fileFilter:="Excel Workbooks (*.XLS), *.XLS")
                If Not strSave = vbNullString Then
                    Wb.SaveAs strSave
                End If
            Else
                Wb.Save
                strSave = Wb.Path & "\" & Wb.Name
            End If
            Wb.Saved = True
        End If
        Debug.Print Wb.Path & "\" & Wb.Name
    End With
End Sub
'************** Code End ************

Et maintenant, nous "instancions" cExcel comme suit:

Public clsExcel As cExcel

Sub sExcelWithEvents()
    Set clsExcel = New cExcel
End Sub

La procédure Class_Initialize nous assure que l'objet Automation est créé. La déclaration  WithEvents nous permet d'accrocher une procédure événementielle à l'événement WorkbookBeforeClose de l'objet d'Automation.

Lorsqu'on ferme un  "workbook" de Excel, notre procédure événementielle  WorkbookBeforeClose s'active et vérifie si le travail requiert d'être sauvegardé, ou non, et, s'il ne fut jamais sauvegardé auparavant, présente à l'utilisateur le dialogue " SaveAs" pour obtenir un nom de fichier. On porte alors le flag (drapeau)  Saved de ce  workbook à True, permettant Excel de terminer sans autres interactions.

La même logique s'applique envers un objet Automation de Microsoft Word Automation.  Cependant, Word ne nous présente rien d'équivalent à WorkbookBeforeClose, il nous faut utiliser l'événement Close de l'objet Document pour sauvegarder le fichier.

Note: Ce code semble ne fonctionner que si vous ne travaillez qu'avec un seul document à l'intérieur de Word.  Je soupçonne que l'événement DocumentChange puisse être mis à contribution pour les cas de plusieurs documents, mais je n'ai pas encore trouvé de moyen sûr. Si vous avez des commentaires, ils sont appréciés.

Class cWord

'*************** Code Start ***************
Public WithEvents mobjWordApp  As Word.Application
Private WithEvents mobjDoc As Word.Document

Private Sub Class_Initialize()
    Set mobjWordApp = New Word.Application
    Set mobjDoc = mobjWordApp.Documents.Add
    mobjWordApp.Visible = True
End Sub

Private Sub mobjDoc_Close()
Dim strSave  As String
Dim dlg As Word.Dialog
    
    With mobjDoc
        If Not .Saved Then
            If .Path = vbNullString Then
                Set dlg = mobjWordApp.Dialogs(wdDialogFileSaveAs)
                With dlg
                    .Display
                    strSave = .Name
                    .Update
                    .Name = strSave
                    .Execute
                    strSave = mobjDoc.Path & "\" & strSave
                End With
            Else
                strSave = .Path & "\" & .Name
                .Save
            End If
        End If
        .Saved = True
        Debug.Print strSave
    End With
End Sub

Private Sub mobjWordApp_DocumentChange()
   ' Set mobjDoc = mobjWordApp.ActiveDocument
End Sub
'*************** Code End ****************

L'utilisation est la même que dans le cas de Excel:

Public clsWord As cWord

Sub sWordWithEvents()
    Set clsWord = New cWord
End Sub

© 1998-2001, Dev Ashish, All rights reserved. Optimized for Microsoft Internet Explorer