Alerte fermeture classeur

Résolu/Fermé
Chicorette Messages postés 84 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 27 janvier 2016 - Modifié par jordane45 le 8/12/2014 à 09:46
Chicorette Messages postés 84 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 27 janvier 2016 - 12 déc. 2014 à 01:28
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)
A voir également:

6 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
8 déc. 2014 à 08:59
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
jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 4 652
8 déc. 2014 à 09:50
@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
jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 4 652
8 déc. 2014 à 13:45
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
Chicorette Messages postés 84 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 27 janvier 2016 2
9 déc. 2014 à 22:11
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
jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 4 652
9 déc. 2014 à 22:21
Tu as tenu compte de mon code ?
Montre nous ce que tu as écris.
0
Chicorette Messages postés 84 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 27 janvier 2016 2
9 déc. 2014 à 22:40
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
jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 4 652
9 déc. 2014 à 23:10
Tu sais ce que fait debug.print ?
Tu l'as remplacé par un msgbox bien sûr ?
0
Chicorette Messages postés 84 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 27 janvier 2016 2
9 déc. 2014 à 23:15
Non je ne sais pas, mais oui j'ai remplacé ma zone de if par ta sub...
0
jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 4 652 > Chicorette Messages postés 84 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 27 janvier 2016
9 déc. 2014 à 23:25
Donc..ce code ainsi modifié. .montre le nous pour qu'on sache ce qui ne va pas dedans...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 4 652
10 déc. 2014 à 10:29
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
Chicorette Messages postés 84 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 27 janvier 2016 2
10 déc. 2014 à 23:28
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
jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 4 652
10 déc. 2014 à 23:57
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745 > jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024
Modifié par pijaku le 11/12/2014 à 08:45
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
11 déc. 2014 à 10:46
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
jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 4 652 > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
11 déc. 2014 à 10:56
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
Chicorette Messages postés 84 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 27 janvier 2016 2
Modifié par Chicorette le 12/12/2014 à 00:30
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
jordane45 Messages postés 38154 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 4 652
12 déc. 2014 à 00:52
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
Chicorette Messages postés 84 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 27 janvier 2016 2
12 déc. 2014 à 01:28
;-) cool MERCI Bonne continuation aussi... et si je n'ai pas d'autres besoins entre temps... Nice fin d'année.
0