---Soumis par 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 interractions.
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