Bonjour,
j'ouvre un classeur Excel par le VBA et j'aimerais effectuer une action lorsque l'utilisateur referme ce classeur. Comment détecter la fermeture svp ?
Merci
Bonjour,
j'ouvre un classeur Excel par le VBA et j'aimerais effectuer une action lorsque l'utilisateur referme ce classeur. Comment détecter la fermeture svp ?
Merci
Salut,
Je te propose quelquechose du genre de ça :
Tu teste en boucle le nom du classeur. Quand il est fermé par l'utilisateur (ou si l'application est fermée) on gére l'erreure provoquée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 Sub Excel() Dim Excel As Object On Error GoTo Excel_Error Set Excel = CreateObject("Excel.application").workbooks.Add Excel.Application.Visible = True Do While Excel.Name & "" <> "" DoEvents Loop Excel_Exit: Set Excel = Nothing Exit Sub Excel_Error: Select Case Err.Number Case -2147417848 'fermeture du classeur MsgBox "classeur fermé" Case 462 MsgBox "excel fermé" Case Else MsgBox "Erreur inatendue N°" & Err.Number & " (" & Err.Description & ") dans la fonction/procedure Excel du module Module2" End Select GoTo Excel_Exit: End Sub
A+
Bonjour,
Pour cela, j'utilise les API's CreateProcess(), WaitForSingleObject() et CloseHandle().
WaitForSingleObject boucle tant que l'instance est présente avec la constante WAIT_INFINITE jusqu'à ce que les informations du processus transmettent que l'instance ait terminé.
Argy
Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.
Ils comptent sur vous...
Web Site ‡ @Mail
Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
MDB Viewer : Visionneuse Access v4.0
Il ne sort jamais de la boucle DoEvents.
J'ai mis un msgbox dans cette boucle pour tester et il continue de d'afficher alors que j'ai fermé le classeur et Excel.
bjr,
Une solution avec WithEvents.
(et avec la référence à Microsoft Excel x.x Object Library)
Ce code est à mettre dans un formulaire.
Il empêche l'utilisateur de quitter sans sauvegarder...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 Option Compare Database Option Explicit Private WithEvents oExcelWorkBook As Excel.Workbook Private oExcelApp As Excel.Application Public Sub OpenWorkBook(Optional pFileName As String = "") ' Initialisation des objets Excel Set oExcelWorkBook = Nothing Set oExcelApp = Nothing ' Ouverture d'une nouvelle application Excel Set oExcelApp = CreateObject("Excel.Application") ' Rend l'applicatino visible oExcelApp.Visible = True If pFileName = "" Then ' Ouvre un nouveau classeur Set oExcelWorkBook = oExcelApp.Workbooks.Add Else ' Ouvre un classeur existant Set oExcelWorkBook = oExcelApp.Workbooks.Open(pFileName) End If End Sub Private Sub Form_Close() ' Initialisation des objets Excel Set oExcelWorkBook = Nothing Set oExcelApp = Nothing End Sub Private Sub oExcelWorkBook_BeforeClose(Cancel As Boolean) Dim lFilename As String ' oExcelWorkBook.Saved = True : si le classeur n'est pas encore sauvegardé If Not oExcelWorkBook.Saved Then ' Demande un chemin de fichier lFilename = oExcelApp.GetSaveAsFilename(oExcelWorkBook.Path & "\" & oExcelWorkBook.Name, "Excel Workbooks (*.XLS), *.XLS", , "Sauvegarder le classeur") If lFilename = "Faux" Then ' Si annulation on sort Cancel = True Exit Sub Else ' Sauvegarde du fichier oExcelWorkBook.SaveAs lFilename End If End If ' Initialisation des objets Excel et fermeture de l'application Set oExcelWorkBook = Nothing oExcelApp.Quit Set oExcelApp = Nothing End Sub ' Sur click sur un bouton Private Sub Commande0_Click() OpenWorkBook "c:\Classeur1.XLS" End Sub
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL
Blog Office Mon Site DVP
Ca marche presque mais encore quelques soucis.
Dans l'idéal j'aimerais importer à chaque fermeture du fichier. Ici cela n'arrive que lorsque le fichier n'est pas déja sauvegardé. Dc ça marche ds le cas suivant : j'ouvre le fichier, je modifie et je ferme directement.
Si, par malheur, l'utilisateur enregistre tout seul après avoir modifié, le fichier est considéré comme enregistré et il n'y a dc pas d'import.
Comment faire juste pour importer à chaque fois que ce classeur ce ferme ?
Merci
Jy suis presque mais j'ai encore un ptit souci.
Voila mon code
Et lors de l'éxécution, le prog plante car pour lui, le fichier est tjs ouvert et dc l'import n'est pas possible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 oExcelWorkBook.Close Set oExcelWorkBook = Nothing oExcelApp.Quit Set oExcelApp = Nothing DoCmd.RunSQL "DELETE FROM MaTable" Set rs_config = CurrentDb.OpenRecordset("Config) DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "MaTable", rs_config![Chemin_de_mon_fichier], True
J'ai pensé à un problème de synchro dc est ce qu'il y aurait possibilité de faire un wait ?
Merci
Re,
Ben chez moi, ça fonctionne bien.Envoyé par tedparker
Peux - tu donner ton code complet ?
A+
Partager