Quitter un fichier par la croix rouge avec un "enregister sous"

mig_59

XLDnaute Junior
Bonjour a tous le forum

Petit souci pour quitter par la croix rouge avec un "enregister sous"

Particularité
J'ai 3 cellules, E19 E40 et E55 UNE SEULE parmis les 3 aura une valeur (exemple nom & prénom)

J'aimerais savoir
1 - S'il est possible de quitter le fichier et forcer l'enregistrement sous. Empecher la boite de dialogue (enregistrer les modifications apportées ..... oui non annuler) si on clique sur le bouton annuler.

2 - S'il est possible de nomer le fichier au moment de quitter avec la valeur d'une des 3 cellules

Je m'explique
Si E19 a pour valeur par exemple TOTO Tata, le fichier s'appelerait au moment de l'enregistrement sous TOTO Tata.xlsm
E40 et E55 seraient vide
Si E40 a pour valeur par exemple TITI Tutu, le fichier s'appelerait au moment de l'enregistrement sous TITI Tutu.xlsm
E19 et E55 seraient vide
et pareil pour E55

Pour quitter avec un "enregistrement sous" j'ai trouvé ceci
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.Dialogs(xlDialogSaveAs).Show
End Sub
Mais pour le reste !!!!!
Merci pour votre aide

Mig
 

romain9

XLDnaute Nouveau
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Insère ce code dans le module ThisWorkbook. Pour le chemin d'accès du fichier, tu devras adapter en fonction de l'arborescence de ton ordinateur pour enregistrer le fichier dans le dossier que tu souhaites.
Je t'ai mis l'exemple avec le chemin d'accès sur mon ordinateur.


Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim vCellule1 As Range, vCellule2 As Range, vCellule3 As Range
Dim vNomClasseur As String

Set vCellule1 = Sheets("Feuil1").Range("E19")
Set vCellule2 = Sheets("Feuil1").Range("E40")
Set vCellule3 = Sheets("Feuil1").Range("E55")

If Not IsEmpty(vCellule1) Then
vNomClasseur = vCellule1.Text
ActiveWorkbook.SaveAs Filename:="C:\Users\Romain\Documents\" & vNomClasseur & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
ElseIf Not IsEmpty(vCellule2) Then
vNomClasseur = vCellule2.Text
ActiveWorkbook.SaveAs Filename:="C:\Users\Romain\Documents\" & vNomClasseur & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
Else
vNomClasseur = vCellule3.Text
ActiveWorkbook.SaveAs Filename:="C:\Users\Romain\Documents\" & vNomClasseur & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
End If
End Sub
 

Nairolf

XLDnaute Accro
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Salut Mig et romain9,

Je vous propose une légère adaptation du code de romain9 avec la possibilité d'annuler la fermeture (j'ai mis volontairement A1, A2 et A3 pour simplifier mon test):
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Application.DisplayAlerts = False
msg = MsgBox("Sauvegarde auto du fichier avant fermeture.", vbOKCancel)

If msg = 1 Then

If Not IsEmpty(Worksheets("Feuil1").Range("A1")) Then
ActiveWorkbook.SaveAs Filename:="C:\Users\Mig\Documents\" & Worksheets(Feuil1).Range("A1").Value & ".xls"
ElseIf Not IsEmpty(Worksheets("Feuil1").Range("A2")) Then
ActiveWorkbook.SaveAs Filename:="C:\Users\Mig\Documents\" & Worksheets(Feuil1).Range("A2").Value & ".xls"
ElseIf Not IsEmpty(Worksheets("Feuil1").Range("A3")) Then
ActiveWorkbook.SaveAs Filename:="C:\Users\Mig\Documents\" & Worksheets(Feuil1).Range("A3").Value & ".xls"
Else
MsgBox ("Le fichier ne peut être enregistré car aucun nom n'est défini.")
Cancel = True
End If

ElseIf msg = 2 Then

Cancel = True

End If

Application.DisplayAlerts = True

End Sub
 

mig_59

XLDnaute Junior
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Bonsoir au forum

Merci romain9, merci a toi Nairolf
Si effectivement je me limite a 3 cellules pas de souci
Les 2 solutions fonctionnent correctement

J'ai 3 formulaires en 1
a l'aide d'une liste déroulante, je choisis un formulaire (Création, Modification, Suppression)
Lorsque je suis en mode "Création", je remplis les différentes cellules dont certaine sont obligatoire
Une fois remplis, je dois enregistrer le formulaire "Création" sous le format suivant 'nom prénom.xlsm' dans le répertoire C:\temp

Pareil pour la "Modification" et la "Suppression"
En quittant ont vérifie si les cellules obligatoire sont saisies (en faite les cellules "ko" doivent passer en "ok" voir fichier)

Je joint un fichier en esperant qu'il soit plus explicite que mon écrit
Merci d'avance pour votre aide

Mig
 

Pièces jointes

  • formulaire.xlsm
    23.6 KB · Affichages: 64
  • formulaire.xlsm
    23.6 KB · Affichages: 67
  • formulaire.xlsm
    23.6 KB · Affichages: 66

camarchepas

XLDnaute Barbatruc
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Bonjour Mig,

L'astuce pour le formulaire est super.

En regardant pour te donner un coup de pouce , ce qui ne va d'ailleurs pas m'empêcher de t'envoyer le code pondu pour ce que tu as demandé.

Voici ma remarque :

En sauvegardant de tel sort le classeur, tu multiplies le nombre de fichiers avec le code embarqué et tout les onglets inutilement.

La modification d'une fiche va être un peut compliquée comme cela.

Si tu as vraiment besoin d'une photo du formulaire tu peux sauvegarder sous pdf facilement en Xl2010.

Si c'est seulement les données qui t'intéresses alors un seul et unique onglet BaseDonnées où tu viendrais copier les infos de ton formulaire.

Et la c'est toujours le même fichier que tu sauvegardes.

En attendant ton avis , je continu le code selon ta première idée histoire de me dégourdir les doigts et le cerveau lent.
 

camarchepas

XLDnaute Barbatruc
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Re mig,

donc 1 ° création d'un module standard

Code:
Option Explicit
Public Nonpret As Boolean
Sub Sauvegarde()
Dim Nonpret As Boolean
Dim Chemin_Nom_Fichier As String, Mode As String
Dim Nom As String, Prenom As String
Dim Message As String
Dim Retour As Integer
'
With Worksheets("Formulaire")
   
   Mode = .Range("B7")
   
   Select Case Mode
     Case "CREATION"
          Nom = .Range("B19").Value
          Prenom = .Range("B21").Value

     Case "MODIFICATION"
          Nom = .Range("B40").Value
          Prenom = .Range("B41").Value

     Case "SUPPRESSION"
          Nom = .Range("B55").Value
          Prenom = .Range("B56").Value
          
     Case Else
          MsgBox "Il faut sélectionner le mode de transaction avant de pouvoir enregistrer ..."
   End Select
  
  Message = ""
  Retour = MsgBox("Sauvegarde automatique du formulaire avant fermeture.", vbOKCancel)
   If Retour = 1 Then
      If Nom = "" Then Message = ("Le formulaire ne peut être enregistré car aucun nom n'est défini.")
      If Prenom = "" Then Message = ("Le formulaire ne peut être enregistré car aucun prénom n'est défini.")
      If Message <> "" Then
        MsgBox Message
        Nonpret = True
       Else
        Nonpret = False
      End If
    Else
       Retour = MsgBox("ATTENTION, vous allez perdre la dernière transaction", vbOKCancel)
       If Retour = 1 Then
           Nonpret = True
          Else
           Nonpret = False
       End If
   End If
 End With
 
'Construction du chemin et nom de fichier
Chemin_Nom_Fichier = "C:\temp\" & Mode & " du compte - " & Nom & " " & Prenom
'
'Sauvegarde
 If Nonpret = False And Nom <> "" And Prenom <> "" Then
  Application.DisplayAlerts = False
   ThisWorkbook.SaveAs Filename:=Chemin_Nom_Fichier
  Application.DisplayAlerts = True
 End If
End Sub

2 affectation de la macro au bouton:

Affecter une macro puis dans la ligne du haut de la boite inscrire: sauvegarde

Dans le thisworkbook reste :

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = Nonpret
End Sub

Le reste ne sert plus à rien.

Dans l'onglet formulaire juste ajouter : Application.ScreenUpdating afin de désactiver le rafraiche écran donne quelque chose de plus propre je trouve.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim voir As Boolean
    Application.ScreenUpdating = False
    If Target.Address = "$B$7" Then
    nbespace = 2
    Rows("11:200").Hidden = False
    bas = [A:A].Find("*", , , , 1, 2).Row
    Rows("11:" & bas).Hidden = True
        If Target = "" Then Exit Sub
        numliste = Application.Match([B7], Feuil2.[A1:A500], 0) + 1
        For lig = 10 To bas
            If Cells(lig, 1) = "" Then nbespace = nbespace + 1
            If numliste = nbespace Then voir = True
            If voir Then Rows(lig).Hidden = False
            If voir And Cells(lig + 1, 1) = "" Then Exit For
        Next
        If nbespace <> 10 Then Rows(11).Hidden = True

    End If
    Application.ScreenUpdating = True
End Sub

Et voilà
 

mig_59

XLDnaute Junior
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Bonjour carmarchepas, bonjour forum

Merci pour ton code et ton compliment

Pourquoi la MsgBox "Il faut sélectionner le mode de transaction avant de pouvoir enregistrer ..." ? puisque qu’on ait obligé de faire une sélection pour pouvoir enregistrer !

Ton test sur le nom & prénom pour l'enregistrement OK mais le nom et prénom doivent servir à donner le nom au fichier enregistré comme inscrit un peu plus bas dans ton code

Mais quand est-il des autres cellules obligatoires ?
Il faudrait pour le bien autoriser l'enregistrement une fois les cellules obligatoire du formulaire concerné soient toutes saisies et c’est là à mon avis que ça devient plus compliqué.

De plus à la fermeture du fichier par la croix rouge, il faut empêcher la boite de dialogue (Voulez-vous enregistrer les modifications apportées au …..), pour le bien là aussi avoir le même résultat que lorsque l’on fait une sauvegarde d’un mode

Si rien n’est sélectionné le formulaire se ferme, si une sélection alors on test la validité des cellules obligatoire du formulaire concerné
Si tout est OK on enregistre dans C:\temp sous la forme : Mode du compte - Nom Prenom.xlsm

Je te joint le formulaire avec tes modifications
Merci par avance

Cordialement
Mig
 

Pièces jointes

  • formulaire.xlsm
    27.4 KB · Affichages: 54
  • formulaire.xlsm
    27.4 KB · Affichages: 63
  • formulaire.xlsm
    27.4 KB · Affichages: 73

camarchepas

XLDnaute Barbatruc
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Bonjour Mig,

Information aux Lecteurs : ATTENTION : Macro événementielle sur Before close du classeur.

Bon effectivement , j'ai ecris rapidement sans ouvrir Excel , donc sans tester .

J'ai pris le temps de revoir l'intégration dans le classeur, et fait quelques dizaine de tests.

Voici donc les résultats de mes cogitations en fonction de tes remarques.
 

Pièces jointes

  • FormulaireN2.xlsm
    29.9 KB · Affichages: 56
  • FormulaireN2.xlsm
    29.9 KB · Affichages: 60
  • FormulaireN2.xlsm
    29.9 KB · Affichages: 58

mig_59

XLDnaute Junior
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Re Bonjour carmarchepas, Re au forum

Je viens de tester ton code, trop fort
le contrôle des cellules fonctionnent correctement sur les 3 modes.
Le contrôle des cellules fonctionnent correctement sur les 3 modes également lorsque l'on veut quitter le formulaire

La création du fichier fonctionne correctement en mode "création" avec le bouton "enregistrer le formulaire"
En revanche l'enregistrement en mode "modification" et "suppression" ne fonctionne pas

La sauvegarde auto ne fonctionne pas sur le 3 modes lorsque l'on quitte pas la croix toujours cette boite de dialogue (Voulez-vous enregistrer les modifications apportées au …..)

Peux-tu y jeter un oeil s'il te plait, cela doit te prendre du temps désolé, mais comme tu l'as écrit un peu plus haut, trés bonne exercice pour te dégourdir les doigts et le cerveau lent. lol

Cordialement
Mig
 

camarchepas

XLDnaute Barbatruc
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Bonjour,

Bon , l'on s'aperçoit que le béta Testeur est très important,
Pour les modes modifications et suppression c'était simplement la ligne d'affectation du prenom qui n'était pas la bonne ( Corrigé très vite)

Sur la sauvegarde auto , c'était un peu plus compliqué, mais après plusieurs essais , je crois être parvenu à quelque chose de pas trop mal au niveau fonctionnel.

Voici donc le fichier
 

Pièces jointes

  • FormulaireN2.xlsm
    30.2 KB · Affichages: 42
  • FormulaireN2.xlsm
    30.2 KB · Affichages: 51
  • FormulaireN2.xlsm
    30.2 KB · Affichages: 46

mig_59

XLDnaute Junior
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Bonjour, camarchepas

Bien matinale en ce jour de pluie car chez nous dans le nord, il pleut a torrent
Je m'incline devant ton savoir, je ne serais jamais arrivé jusque-là sans toi
J'ai testé pour toi et les essais s'avèrent concluant

Juste une petite anomalie, en faisant le test sur le bouton enregistrer (dans la barre des menus) on ne peut plus fermer par la croix rouge, obliger de modifier une cellule pour pouvoir y parvenir.
Te serait-il possible de corriger cette anomalie

Je profite a nouveau de ta gentillesse pour te poser cette question
Peut-on prévenir par une msgbox du style : MsgBox "Le formulaire " & Mode & " a été enregistré dans le répertoire C:\temp" lors de la sauvegarde du fichier, je ne sais pas où placer ce code, j'ai une petite idée juste en dessous de Chemin_Nom_Fichier =
Mais je ne voudrais pas faire de bêtise.

Merci pour le temps que tu me consacres pour moi
Cordialement
Mig
 

camarchepas

XLDnaute Barbatruc
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Mig,

J'ai ajouté le message de réalisation sauvegarde et voici donc le new fichier.

Par contre pour le bouton enregistrer, il me faut un peu plus de précision, c'est peut être parce que la journée devient longue (Lol)

Lorsque l'on appui sur enregistre , pour le moment c'est le classeurFormulaire qui est sauvegardé et non pas le formulaire en cours.

si j'ai bien compris tu voudrais pouvoir fermer ce classeur aprés enregistrement, j'ai essayé d'enregistrer puis de fermer via les fonctions du menu , cela fonctionne ici.

Peux-tu me confirmer que j'ai bien compris ?
 

Pièces jointes

  • FormulaireN2.xlsm
    30.4 KB · Affichages: 51
  • FormulaireN2.xlsm
    30.4 KB · Affichages: 53
  • FormulaireN2.xlsm
    30.4 KB · Affichages: 61

mig_59

XLDnaute Junior
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Bonsoir camarchepas

Impec pour le message de réalisation
Une petite idée, ne serait-ce pas plus simple d'enlever la barre des menus (le ruban), ne faire apparaitre que le formulaire ?
Ainsi on empêche l'utilisateur de s'en servir, pour infos il a juste de la saisie a faire et aucune autre manipulation
Quand penses-tu ?

A part cela, si le formulaire est réinitialisé, impossible de quitter par la croix, il faudrait pouvoir quitter si le formulaire est a l'état initiale c'est a dire quand tout les cellules sont vides.

Cordialement
Mig
 

camarchepas

XLDnaute Barbatruc
Re : Quitter un fichier par la croix rouge avec un "enregister sous"

Bonsoir ,

Pas encore de solution, mais j'ai vraiment pas dit mon dernier mot.

Pour le bandeau , pourquoi pas , mais comme le bandeau appartient au Excel local,

Si l'utilisateur se prend les pieds dans le tapis , il risque de perdre le bandeau pour tous ses excels donc pas cool ( Et oui , ç'est du vécu)
 

Discussions similaires

Réponses
2
Affichages
344

Statistiques des forums

Discussions
312 571
Messages
2 089 797
Membres
104 275
dernier inscrit
Manu974