Alerte fermeture classeur

Résolu
Chicorette Messages postés 87 Statut Membre -  
Chicorette Messages postés 87 Statut Membre -
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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

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


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

    0
  2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    @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 <> ""  

    0
  3. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
    
    
    
    0
  4. Chicorette Messages postés 87 Statut Membre 2
     
    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
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Tu as tenu compte de mon code ?
      Montre nous ce que tu as écris.
      0
    2. Chicorette Messages postés 87 Statut Membre 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))
      0
    3. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Tu sais ce que fait debug.print ?
      Tu l'as remplacé par un msgbox bien sûr ?
      0
    4. Chicorette Messages postés 87 Statut Membre 2
       
      Non je ne sais pas, mais oui j'ai remplacé ma zone de if par ta sub...
      0
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > Chicorette Messages postés 87 Statut Membre
         
        Donc..ce code ainsi modifié. .montre le nous pour qu'on sache ce qui ne va pas dedans...
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
    
    
    

    0
    1. Chicorette Messages postés 87 Statut Membre 2
       
      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
      0
    2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      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. . ??
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Bonjour 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
      0
    4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
      0
    5. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Ajouter 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ù ....
      0
  7. Chicorette Messages postés 87 Statut Membre 2
     
    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
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      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.
      0
    2. Chicorette Messages postés 87 Statut Membre 2
       
      ;-) cool MERCI Bonne continuation aussi... et si je n'ai pas d'autres besoins entre temps... Nice fin d'année.
      0