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
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
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
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()
End Sub
L'utilisation est la même que dans le cas de Excel:
Public clsWord As cWord
Sub sWordWithEvents()
Set clsWord = New cWord
End Sub
|