workbook_beforesave event not firing

J'ai un code VBA qui a forcé la boîte de dialog save comme boîte pour afficher l'logging par défaut comme type comme xlsm en essayant d'save un xltm. Veuillez vérifier le code ci-joint et me corriger si le code est incorrect

Application.EnableEvents = False Application.DisplayAlerts = False If SaveAsUI = True Then bInProcess = True 'The following statements shows the save as dialog box with default path Set FileSaveName = Application.FileDialog(msoFileDialogSaveAs) FileSaveName.InitialFileName = ThisWorkbook.Name FileSaveName.FilterIndex = 2 'select to save with a ".xlsm" extension FileSaveName.Title = "Save As" intchoice = FileSaveName.Show If intchoice = 0 Then Else FileSaveName.Execute End If Else 'Normal Save bInProcess = True Cancel = True ThisWorkbook.Save End If Application.EnableEvents = True Application.DisplayAlerts = True 

Le code ci-dessus fonctionne bien en essayant d'save en utilisant (ctrl + s). Si j'ai essayé de fermer l'option excel close window. Excel affiche les sauvegardes par défaut comme pop-up. Si je clique sur l'option "Enregistrer" de cette sauvegarde en tant que pop-up, l'événement workbook_beforesave n'est pas invoqué (la boîte de dialog Enregistrer sous est affichée avec le type de données par défaut modifié à xls de xlsm). Je ne sais pas quelle erreur j'ai commis? Aidez-moi à vous débarrasser de …

Merci d'avance!!!

Vous devez placer votre code entre ces lignes

 Private Sub Workbook_BeforeClose(Cancel As Boolean) End Sub 

Après une nouvelle lecture et quelques tests supplémentaires, je comprends que le code de votre question figure déjà dans l'événement Workbook_BeforeSave que vous avez créé. La première réponse que vous avez reçue était dans la bonne direction, vous devez mettre un code supplémentaire dans l'événement Workbook_BeforeClose pour gérer le X supérieur droit.

Ce que vous voulez, c'est une combinaison vraiment délicate et très difficile à extraire dans Excel. La raison de cela a plusieurs aspects. Si vous fermez le classur à l'aide de la partie supérieure droite X, cela triggersra le Workbook_BeforeClose, le document devrait être fermé dans cet événement. Si, pour une raison ou pour une autre, l'user annule la fermeture, cela vous donnera un autre état imprévu où lorsque vous appuyez de nouveau sur le X, Workbook_BeforeClose ne semble pas être déclenché à nouveau, mais maintenant Workbook_BeforeSave (la version embeddede) est déclenchée.

Voici un début pour vous aider à mettre en œuvre les sauvegardes xltm, mais comme cela sera limité, vous obligerez l'user à save le classur et à quitter ou à ne pas save, mais toujours en sortant du classur. C'est un peu sale (goto label etc.) mais vous obtenez ma dérive.

Il existe de nombreuses combinaisons Fermer / Enregistrer dans Excel et il est difficile d'attraper toutes les combinaisons correctes, donc vous voudrez peut-être décider de la gérer complètement …

 Private Sub Workbook_BeforeClose(Cancel As Boolean) If ActiveWorkbook.Saved = True Then Cancel = False Else Dim iReply As Byte, iType As Integer Dim events As Boolean Dim alerts As Boolean events = Application.EnableEvents alerts = Application.DisplayAlerts Application.EnableEvents = False Application.DisplayAlerts = False StartQuestion: ' Define buttons argument. iType = vbYesNo + vbQuestion + vbDefaultButton2 iReply = MsgBox("Would you like to save now?", iType) Select Case iReply Case Is = vbYes ' user chose Yes save current workbook 'The following statements shows the save as dialog box with default path Set FileSaveName = Application.FileDialog(msoFileDialogSaveAs) FileSaveName.InitialFileName = ThisWorkbook.Name FileSaveName.FilterIndex = 2 'select to save with a ".xlsm" extension FileSaveName.Title = "Save As ... " intchoice = FileSaveName.Show If intchoice = 0 Then Else FileSaveName.Execute End If If ActiveWorkbook.Saved = True Then ActiveWorkbook.Close Cancel = False Else GoTo StartQuestion End If Case Is = vbNo ' user chose No, don't save ActiveWorkbook.Saved = True ActiveWorkbook.Close Cancel = False End Select Application.EnableEvents = events Application.DisplayAlerts = alerts End If End Sub 

Merci à tous pour votre aide. J'ai compris la solution.

 Private Sub Workbook_BeforeClose(Cancel As Boolean) StartQuestion: Cancel = True 'Evaluate if workbook is saved and emulate default propmts With ThisWorkbook Select Case MsgBox("Do you want to save the changes you made to '" & .Name & "'?", _ vbYesNoCancel + vbExclamation) Case Is = vbYes Call CustomSave(vbYes) If cancelclicked = False Then ThisWorkbook.Saved = True Else GoTo StartQuestion End If Case Is = vbNo ThisWorkbook.Saved = True Case Is = vbCancel Exit Sub End Select End With Cancel = False End Sub Sub CustomSave(ans As Long) Dim MinExtensionX Dim Arr() As Variant Dim lngLoc As Variant Dim events As Boolean Dim alerts As Boolean If ActiveWorkbook.Saved = True Then Cancel = False Else events = Application.EnableEvents alerts = Application.DisplayAlerts Application.EnableEvents = False Application.DisplayAlerts = False StartQuestion: Select Case ans Case Is = vbYes ' user chose Yes save current workbook MinExtensionX = Mid(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") + 1) Arr = Array("xlsx", "xlsm", "xlsb", "xls", "xml", "mht", "mhtml", "htm", "html", "xltx", "xltm", "xlt", "txt", "csv", "prn", "dif", "slk", "xlam", "xla", "pdf", "xps", "ods") 'define which extensions you want to allow On Error Resume Next lngLoc = Application.WorksheetFunction.Match(MinExtensionX, Arr(), 0) If IsEmpty(lngLoc) Then ' 'The following statements shows the save as dialog box with default path Set FileSaveName = Application.FileDialog(msoFileDialogSaveAs) FileSaveName.InitialFileName = ThisWorkbook.Name FileSaveName.FilterIndex = 2 'select to save with a ".xlsm" extension FileSaveName.Title = "Save As ... " intchoice = FileSaveName.Show If intchoice = 0 Then cancelclicked = True Else FileSaveName.Execute End If Else ThisWorkbook.Save End If End Select End If End Sub