Alerte fermeture classeur

Résolu
Bonjour,

Je souhaite créer une alerte pour l'utilisateur avant la fermeture du classeur.
Les cellules d'une plage déterminée, doivent contenir quelque chose ou au pire un zéro.
J'ai mis une MFC rouge pour les cellules sans valeur dans cette plage.

J'ai un problème dans ma macro, surement syntaxique.
Je pense que la notion de la feuille active manque aussi non?
J'ai, certes, 2 feuilles mais seule la 2ème est concernée par l'évènement.
Merci de corriger ma tentative.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Range("A2:M300").Value <> "" Then
    ActiveWorkbook.Save
    Else
    MsgBox "Attention! Cette feuille contient au moins une cellule rouge." & Chr (13) & "C'est-à-dire une cellule vide." & Chr (13) & "Veuillez saisir le chiffre zéro dans les cellules censées rester vides." & Chr (13) & "Merci."
    Exit Sub
End If
End Sub


Débutante volontaire.



EDIT : Ajout des balises de code (jordane)

6 réponses

  1. Contributeur
    Bonjour

    If Sheets("nomdelafeuilleutile").Range("A2:M300").Value <> ""  


    A l'avenir, merci de mettre des codes entres <> de l'onglet au dessus du message...

    1. Modérateur
      @michel_m : Il est même conseillé de choisir le langage dans les balises de code...




      ce qui donne :
      If Sheets("nomdelafeuilleutile").Range("A2:M300").Value <> ""  


      Au lieu de :
      If Sheets("nomdelafeuilleutile").Range("A2:M300").Value <> ""  

      1. Modérateur
        Au passage .. tu as testé le code que tu as donné à l'utilisateur ??
        Je pense qu'il risque d'avoir un souci.. non ??

        Perso... pour tester si une plage est vide j'utiliserai plutôt :

        Sub test()
        
        If isRangeEmpty(Range("M1:M300")) Then
         Debug.Print "vide"
        Else
         Debug.Print "non vide"
        End If
        
        End Sub
        
        Function isRangeEmpty(Rng As Range) As Boolean
            If WorksheetFunction.CountA(Rng) = 0 Then
             isRangeEmpty = True
            Else
             isRangeEmpty = False
            End If
        End Function
        
        
        
        1. Bonjour,

          désolée pour l'insertion du code sans les <>, je ne le savais pas. C'est noté à présent, merci.

          Pour le code, je suis encore en phase test et justement il ne s'exécute pas.
          Je souhaiterais avoir une MessageBox à la fermeture du classeur, si une des cellule(s) de la feuille en question est vide.

          L'utilisateur est censé le voir car j'ai mis une mise en forme conditionnelle si vide = cellule rouge.
          Mais avant de quitter je veux juste une alerte le lui rappelant.

          Où se situe le problème dans mon code? Je ne vois pas l'erreur ou le manque d'info?. Pour moi il est correct.

          Merci

          Chicorette
          1. Modérateur
            Tu as tenu compte de mon code ?
            Montre nous ce que tu as écris.
          2. Mon code dans l'énoncé. (Je ne vois pas ce qui cloche)
            Oui, j'ai testé ton code, mais malgré les cellules vides il ne m'alerte de rien et me laisse enregistrer le classeur tel quel. (même en ayant élargit la zone (A2:M300))
          3. Modérateur
            Tu sais ce que fait debug.print ?
            Tu l'as remplacé par un msgbox bien sûr ?
          4. Non je ne sais pas, mais oui j'ai remplacé ma zone de if par ta sub...
          5. Modérateur
            @ChicoretteDonc..ce code ainsi modifié. .montre le nous pour qu'on sache ce qui ne va pas dedans...
        2. Modérateur
          Testes ça :

          Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
          If isRangeEmpty(Range("A2:M300")) Then
           MsgBox "Attention! Cette feuille contient au moins une cellule rouge." & Chr(13) & "C'est-à-dire une cellule vide." & Chr(13) & "Veuillez saisir le chiffre zéro dans les cellules censées rester vides." & Chr(13) & "Merci."
           Cancel = True
          Else
              ActiveWorkbook.Save
              
          End If
          End Sub
          
          Function isRangeEmpty(Rng As Range) As Boolean
              isRangeEmpty = (WorksheetFunction.CountA(Rng) = 0)
          End Function
          
          
          

          1. Je désespère!!
            Cela fait 1h que je teste dans tous les sens et je n'y comprends plus rien.
            Ta dernière proposition a marché tout de suite Nickel, j'ai bien lu la message box au ralenti et pendant quelques secondes avec délice, mais une seule fois seulement! J'ai beau tester sur d'autres classeurs rien! aucune réaction. Aucun message!

            Je dois revoir certaines notions je pense aussi. (Je veux comprendre pour apprendre et pas seulement copier coller).
            Je n'ai plus trop le temps là ce soir. Mais samedi nuit il faut que je trouve mon bug :-)
            Je soupçonne un problème de versions (2010/2013: j'essaie sur les 2) (Il n'y aurait que moi je supprimerais 2013!!!!) ;-) mais bon...

            Merci beaucoup de ton aide.
            Je n'abandonne pas... si ça a marché une fois c'est que c'est pas loin!!!
            Merci vraiment.
            Vivement samedi!!! pffff
          2. Modérateur
            On est bien d'accord que le message apparaît lorsque tu sauvegarde le classeur dans lequel se trouve ce code et qu'aucune des cellules de la plage indiquée nest rempli. . ??
          3. Modérateur
            @jordane45Bonjour tout le monde,

            J'ai, certes, 2 feuilles mais seule la 2ème est concernée par l'évènement.

            Ajoutez donc le nom de la feuille pour identifier correctement le Range concerné :

            Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
            Dim rngPlage As Range
            Set rngPlage = Sheets("Feuil18").Range("A2:M300")
            If isRangeEmpty(rngPlage) Then
                MsgBox "Attention! Cette feuille contient au moins une cellule rouge." & Chr(13) & "C'est-à-dire une cellule vide." & Chr(13) & "Veuillez saisir le chiffre zéro dans les cellules censées rester vides." & Chr(13) & "Merci."
                Cancel = True
            Else
                ActiveWorkbook.Save
            End If
            End Sub
            
            Function isRangeEmpty(Rng As Range) As Boolean
                isRangeEmpty = (WorksheetFunction.CountA(Rng) = 0)
            End Function
          4. Contributeur
            Bonjour Frank

            Ajoutez donc le nom de la feuille pour identifier correctement le Range concerné :

            Tiens qu'est ce que je disais:
            If Sheets("nomdelafeuilleutile").Range("A2:M300").Value <> ""

            et je me suis fait envoyer boulé par ton collègue modérateur
          5. Modérateur
            @michel_mAjouter le nom de la feuille : OUI
            Par contre :
            Range("A2:M300").Value <> "" 
            .. NON
            Je peux me tromper ... mais pour moi.. cette ligne de code ne fonctionne pas... d'où l'utilisation de la fonction isRangeEmpty ...

            je me suis fait envoyer boulé par ton collègue modérateur

            Par contre.. je ne t'ai pas envoyé "boulé" ...ou alors il faudra m'expliquer où ....
        3. Bonjour tout le monde,

          oh je suis désolée....
          Ce n'est pas toujours facile oui, d'expliquer en long et en large nos souhaits. Donc on peut parfois aussi mal interpréter le besoin! Vous n'avez de plus pas le fichier pour mieux visualiser le cas. Vous êtes tout excusé tout le monde. et tout aussi bons les uns que les autres.

          En fait j'ai 11 classeurs que je dois consolider, or une conso ne peut se faire que si des chiffres sont présents (donc j'ai partout des zéros au départ, les utilisateurs remplieront au fur et à mesure, mais ils ne maîtrisent pas tous l'outil. Et donc pour éviter qu'ils suppriment un zéro(qui est invisible car MFC police blanche) et donc me détruire la liaison en conso, je souhaitais au cas ou, leur rappeler à la fermeture, qu'ils sont censés ne pas laisser les cellules de la plage sans aucune valeur (et qu'ils doivent mettre au moins un Zéro.
          Ils ont à l'ouverture un message qui donne déjà ces consignes!

          Là j'ai trouvé ma solution: la voici:

          Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
             If isRangeEmpty(Sheets(2).Range("B3:M300")) Then 'Range("A2:M300")) Then
                  MsgBox "Attention! La feuille '" & Sheets(2).Name & "' contient au moins une cellule rouge." & Chr(13) & "C'est-à-dire une cellule vide." & Chr(13) & "Veuillez saisir le chiffre zéro dans les cellules censées rester vides." & Chr(13) & "Merci."
                  Cancel = True
              Else
                  ActiveWorkbook.Save
              End If
          End Sub
          
          Function isRangeEmpty(Rng As Range) As Boolean
              isRangeEmpty = (WorksheetFunction.CountA(Rng) <> 3576)
          End Function


          Oui le nom de la feuille devait être mentionné.

          Mes données sont en colonne A et la ligne d'en-tête en ligne 2; tout le reste jusqu'à M300 est la zone à saisir dans le temps...

          Mais MERCI franchement! cela m'a permis de revoir deux, trois trucs, et de comprendre le sens de WorsheetFunction.Count...
          Je suis désolée pour le quack...ça me gêne!
          Merci Merci Jordane45

          Chicorette
          1. Modérateur
            Bonsoir chicorette.
            ne t'en fais pas. ..le quack n'a rien à voir avec la discussion en elle même. ..
            l'essentiel est que tu aies obtenu une solution à ton souci.
            Bonne continuation.

            Ps:pense à mettre le sujet en resolu.
            merci.
          2. ;-) cool MERCI Bonne continuation aussi... et si je n'ai pas d'autres besoins entre temps... Nice fin d'année.