Microsoft 365 Quitter sans sauvegarde

Xtian_Québec

XLDnaute Occasionnel
Bonjour le forum,
J'utilise un code pour fermer automatiquement mon classeur s'il n'y a aucune activité après 15 minutes. Le code valide également si PERSONAL.XLBS est ouvert et il ferme le classeur ou quitte l'application EXCEL selon qu'il y ait u non d'autres classeurs qui sont ouverts sur le poste de travail de l'utilisateur.
Le code de validation pour évaluer le temps d'inactivité s'exécute correctement et après 15 minutes d'inactivité, le code suivant est lancé:

Sub FermerClasseurChrono()
Dim wb As Workbook
Dim intWbCount As Integer

intWbCount = 0

'FERMER LE CLASSEUR
For Each wb In Workbooks
If wb.Name <> "PERSONAL.XLSB" Then
'NOMBRE DE CLASSEURS OUVERTS
intWbCount = intWbCount + 1
Else
'FERMER LE CLASSEUR PERSONAL
Application.DisplayAlerts = False
ThisWorkbook.Saved = True
Workbooks("PERSONAL.XLSB").Close SaveChanges:=False
End If
Next wb

If intWbCount > 1 Then
'AUTRES CLASSEURS EXCEL OUVERTS - FERMER SEULEMENT LE CLASSEUR
Application.DisplayAlerts = False
ThisWorkbook.Saved = True
ThisWorkbook.Close SaveChanges:=False
Else
'SEULEMENT CLASSEUR ACTIF OUVERT - QUITTER EXCEL
Application.DisplayAlerts = False
ThisWorkbook.Saved = True
Application.Quit
End If
End Sub

Mon problème: Même s'il y a ThisWorkbook.saved = true à chaque fois que le classeur PERSONAL ou que le classeur actif est fermé et que j'ai également SaveChanges:=False et que j'utilise en plus la fonction Application.DisplayAlerts = False, l'invite de commande demandant si le classeur doit être enregistré s'affiche toujours et selon le code et selon ce que je comprends, il ne devrait pas s'afficher et le classeur devrait se fermer ou EXCEL devrait être fermé sans message (selon le nombre de classeurs actifs)
Quelqu'un peut m'expliquer ce qui doit être changé dans mon code pour ne pas afficher l'invite de commande?

Merci à l'avance pour votre aide.

Xtian_Quebec
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Il faut fermer en dernier le classeur contenant la macro.
Chez moi ceci fonctionne:

VB:
Sub FermerToutSansSauvegarde()
    Dim wb As Workbook
    Application.DisplayAlerts = False
    For Each wb In Workbooks
        If wb.FullName <> ThisWorkbook.FullName Then
        wb.Saved = True
        wb.Close SaveChanges:=False
        End If
    Next wb
    ThisWorkbook.Saved = True
    Application.Quit
End Sub

Bonne fermeture
 

Xtian_Québec

XLDnaute Occasionnel
Merci Roblochon pour la réponse rapide.
Si je comprends bien ton code, tu fermes tous les classeurs qui sont ouverts avant de fermer le classeur qui contient la macro et ensuite QUITTER EXCEL.
Voici la logique que je veux utiliser
1) Si l'utilisateur a seulement mon classeur qui a des macros qui est ouvert, je veux quitter EXCEL sans sauvegarde.
2) Si l'utilisateur a d'autres classeurs ouverts, je ne veux pas fermer ces autres classeurs de l'utilisateurs et je ne veux pas quitter EXCEL, je veux seulement fermer mon classeur qui a des macros.
3) Comme certains utiliateurs ont le classeur PERSONAL.XLBS qui s'ouvre automatiquement, je veux également fermer ce classeur sans sauvegarde seulement avec la situation 1 ci-dessus (seulement mon classeur ouvert). Avec la sitaution 2, l'utilisateur peut avoir débuter des macros personnelles non enregistrées et je ne veux pas fermer le classeur ans cette situation.
Un petit ajustement à ton code pourrais grandement m'aider.
Merci encore pour ton aide.
Xtian_Quebec
 

job75

XLDnaute Barbatruc
Bonjour Xtian_Québec, Roblochon,
VB:
Sub Fermer()
Dim perso As Workbook
On Error Resume Next
Set perso = Workbooks("PERSONAL.XLSB")
On Error GoTo 0
If Not perso Is Nothing And Workbooks.Count = 2 Then perso.Close True
With ThisWorkbook
    .Saved = True
    If Workbooks.Count = 1 Then Application.Quit Else .Close
End With
End Sub
A+
 

Xtian_Québec

XLDnaute Occasionnel
Merci beaucoup Job75
C'est exactement ce que je voulais. Si le fichier PERSONAL est ouvert par défaut, il se ferme si le count = 2 (donc on a fichier avec macro + Perso) si le count est > 2, il y a d'autres classeurs ouverts, on garde PERSONAL ouvert
Pour le fichier avec macro, si le count = 1 (seulement fichier avec macro alors on quitte si non, il y a d'autres fichiers alors on ferme.
Ton code est facile à comprendre et donne le résultat voulu.

Merci 1000 fois, c'est grandement apprécié
Xtian_Quebec
 

Xtian_Québec

XLDnaute Occasionnel
Bonjour le Forum
Je redemande à nouveau votre aide. J'ai adapté le code de Job75 comme suit:
VB:
Sub FermerFichier()
    Dim WbPersonal As Workbook
    
    On Error Resume Next
    Set WbPersonal = Workbooks("PERSONAL.XLSB")
    On Error GoTo 0
    
    Application.DisplayAlerts = False
    If Not WbPersonal Is Nothing And Workbooks.Count = 2 Then
        WbPersonal.Saved = True
        WbPersonal.Close True
    End If
    
    ThisWorkbook.Saved = True
    If Workbooks.Count = 1 Then
        Application.Quit
    Else
        ThisWorkbook.Close
    End If
End Sub

Je ne sais pas ce qui se passe avec Application.DisplayAlerts = False mais l'invite de commande s'affiche pour demander si le fichier doit être enregistrer avant la fermeture ou avant de quitter Excel selon le cas.
Ce qui est encore plus bizarre, c'est que le message dans l'invite de commande indique

(Voulez-vous enregistrer les modifications que vous avez apportées à "Copie de CLASSEUR DEV .xlsm"?)
Même si je sélectionne "ANNULER", le fichier original est disparu de mon répertoire et j'ai maintenant j'ai un fichier nommé "Copie de..."

Pourquoi ce fichier et pourquoi le DisplayAlerts ne fonctionne pas? J'ai essayé plein de chose mais j'ai toujours ce problème...
Votre aide SVP
Merci à l'avance

Xtian_Quebec
 

Xtian_Québec

XLDnaute Occasionnel
Bonjour,
J'ai peut être trouvé la solution, du moins le code fonctionne correctement pour le moment après que j'y ai ajouté Application.EnableEvents = False
Comme j'ai beaucoup d'activités avec les code Worksheet_SelectionChange, Worksheet_Change, je crois que certaines activités étaient vérifiées par mes codes avant de fermer...
Avec Application.DisplayAlerts = False et Application.EnableEvents = False, le code s'exécute correctement
Si ce commentaire peut aider quelqu'un d'autre, tant mieux.

Merci
Xtian_Quebec
 

Discussions similaires