Probleme avec une Worksheet

Résolu
Mistral_13200 Messages postés 636 Date d'inscription   Statut Membre Dernière intervention   -  
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,
J’utilise la procédure Worksheet_change suivante :

Private Sub Worksheet_Change(ByVal sel As Range)
'Surveille si une saisie sur la quatrième colonne a lieu.
If sel.Column = 4 Then
Dim cel As Range, rien As Boolean
rien = False
For Each cel In sel.Cells
If cel.Value = "" Then
ActiveSheet.Unprotect ("d1500359a")
cel.Offset(0, 11).Value = ""
ActiveSheet.Protect ("d1500359a")
rien = True
End If
Next cel
If rien Then Exit Sub
If sel.Count > 1 Then Exit Sub

If sel.Value = False Then sel.Value = "": Exit Sub
If Application.WorksheetFunction.CountIf(Range("D:D"), sel.Value) > [maxi].Value Then
MsgBox ("Le nombre de photos autorisé pour cet auteur" & vbCr & "est déjà atteint."), vbCritical, "Fédération Photographique de France"
sel.Value = ""
sel.Select
Exit Sub
End If
'Surveille si une cellule de la colonne 14 contient "Numero d'ahérent inconnu".
If Cells(sel.Row, 14).Value = "Numéro d'adhérent inconnu…" Then
MsgBox ("Cet auteur n'est pas adhérent de la F.P.F!" & vbCr & "Il ne peut donc pas participer à cette compétition!"), vbCritical, "Fédération Photographique de France"
sel.Value = ""
sel.Select
Exit Sub

****//**** Insérer ici contrôle supplémentaire

End If
End If
End Sub
Je souhaiterais effectuer un contrôle supplémentaire en fonction du contenu d’une autre cellule située dans la colonne 20, comme je le fais déjà sur les cellules de la colonne 14. J’ai donc copié/coller et modifié ce qui suit :
'Surveille si une cellule de la colonne 20 contient "0".
If Cells(sel.Row, 20).Value = "0" Then
MsgBox ("Cet auteur n'est pas à jour de sa cotisation!" & vbCr & "Il ne peut donc pas participer à cette compétition!"), vbCritical, "Fédération Photographique de France"
sel.Value = ""
sel.Select
Exit Sub

End If
Mais ça ne marche pas, pourquoi ?
Merci d’avance pour votre aide.
Cordialement
Mistral

11 réponses

Gord21 Messages postés 918 Date d'inscription   Statut Membre Dernière intervention   289
 
Bonjour
Je pense qu'il y a une soucis dans les débuts et fin de boucles If
Peut-être :

Exit Sub 
End If 

****//**** Insérer ici contrôle supplémentaire 

End If 


au lieu de

Exit Sub 

****//**** Insérer ici contrôle supplémentaire 

End If 
End If 


Quel est ton message d'erreur ?
0
Mistral_13200 Messages postés 636 Date d'inscription   Statut Membre Dernière intervention   4
 
Tout d'abord merci de t'interresser à mon cas.
Je n'ai pas de message d'erreur. Je ne pense pas non plus que cela vienne de l'ouverture ou la fermeture des boucles, car je n'ai pas de message d'erreur.
Ce que je rajoute, a l'endroit indiqué, un copier/coller de ce qu'il y a juste au-dessus pour tester si la cellule de la ligne courante en colonne 20 est égal à "0" je ne passe jamais sur ce test.
Pourquoi?
0
Gord21 Messages postés 918 Date d'inscription   Statut Membre Dernière intervention   289 > Mistral_13200 Messages postés 636 Date d'inscription   Statut Membre Dernière intervention  
 
Tu cherches bien à faire le test uniquement si une cellule de la colonne 14 contient "Numero d'ahérent inconnu" ?
0
Mistral_13200 Messages postés 636 Date d'inscription   Statut Membre Dernière intervention   4 > Gord21 Messages postés 918 Date d'inscription   Statut Membre Dernière intervention  
 
Oui actuellement je fais un test sur la colonne 14 pour voir si elle contient "Numero d'ahérent inconnu".
Cela fonctionne parfaitement!
Maintenant je souhaiterais faire un autre test sur la colonne 20 qui elle peux contenir 0 ou 1.

J'ai donc copié :
If Cells(sel.Row, 14).Value = "Numéro d'adhérent inconnu…" Then
MsgBox ("Cet auteur n'est pas adhérent de la XXX!" & vbCr & "Il ne peut donc pas participer à cette compétition!"), vbCritical, "XXX"
sel.Value = ""
sel.Select
Exit Sub

a l'endroit indiqué dans mon premier message et en l'adaptant pour la colonne 20 ce qui donne :
If Cells(sel.Row, 20).Value = "0" Then
MsgBox ("Cet auteur n'est pas à jour de sa cotisation!" & vbCr & "Il ne peut donc pas participer à cette compétition!"), vbCritical, "XXX"
sel.Value = ""
sel.Select
Exit Sub
Mais ça ne marche pas! Je ne passe jamais dans cette boucle et je n'arrive pas à savoir pourquoi.
Merci pour ton aide
Mistral
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention  
 
Bonjour,

If Cells(sel.Row, 20).Value = 0
pas ="0" qui est une chaine
0
Mistral_13200 Messages postés 636 Date d'inscription   Statut Membre Dernière intervention   4
 
Avec ou sans les "" c'est pareil, j'avais déjà fait l'essais.
Je ne comprends vraiment pas pourquoi ça marche avec la colonne 14 et pas avec le colonne20.
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention  
 
Avec ou sans les "" c'est pareil
Non, une valeur numérique ou un string ce n'est pas pareil, tu dois savoir ce que tu as dans ta cellule et mettre ce qu'il faut.
Sinon met un point d'arret sur ton test (clic dans la marge et la ligne devient marron) et regarde les valeurs pour voir ce qui cloche
0

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

Posez votre question
Gord21 Messages postés 918 Date d'inscription   Statut Membre Dernière intervention   289
 
Ne mets pas de Exit Sub juste avant ton test si tu veux que ta macro le fasse.
0
Mistral_13200 Messages postés 636 Date d'inscription   Statut Membre Dernière intervention   4
 
Rien a voir!
Exit Sub est là pour sortir de la macro en cas d'erreur et uniquement en cas d'erreur.

Moi je ne passe jamais dans la boucle pour la collone 20. Je ne détecte jamais la valeur 0 dans la colonne 20 sur la ligne active.
Le principe :
Je rentre un N° dans un cellule de la colonne 4 cette entrée est détectée. Si c'est un N° inconnu je le détecte dans la colonne 14. Si c'est un adhérent qui n'est pas jour je le détetcte dans la colonne 20.
Mais mon problème c'est que je ne vois jamais le 0.
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention  
 
Gord a raison, il y a un pb dans la structure et tu fais le exit sub
EDIT:
le end sub avant le if plutôt

voilà ton code indenté :
Private Sub Worksheet_Change(ByVal sel As Range)
'Surveille si une saisie sur la quatrième colonne a lieu.
    If sel.Column = 4 Then
        Dim cel As Range, rien As Boolean
        rien = False
        For Each cel In sel.Cells
            If cel.Value = "" Then
                ActiveSheet.Unprotect ("d1500359a")
                cel.Offset(0, 11).Value = ""
                ActiveSheet.Protect ("d1500359a")
                rien = True
            End If
        Next cel
        If rien Then Exit Sub
        If sel.Count > 1 Then Exit Sub

        If sel.Value = False Then sel.Value = "": Exit Sub
        If Application.WorksheetFunction.CountIf(Range("D:D"), sel.Value) > [maxi].Value Then
            MsgBox ("Le nombre de photos autorisé pour cet auteur" & vbCr & "est déjà atteint."), vbCritical, "Fédération Photographique de France"
            sel.Value = ""
            sel.Select
            Exit Sub
        End If
        'Surveille si une cellule de la colonne 14 contient "Numero d'ahérent inconnu".
        If Cells(sel.Row, 14).Value = "Numéro d'adhérent inconnu…" Then
            MsgBox ("Cet auteur n'est pas adhérent de la F.P.F!" & vbCr & "Il ne peut donc pas participer à cette compétition!"), vbCritical, "Fédération Photographique de France"
            sel.Value = ""
            sel.Select
            Exit Sub

            ****//**** Insérer ici contrôle supplémentaire

        End If
    End If
End Sub
Je souhaiterais effectuer un contrôle supplémentaire en fonction du contenu d’une autre cellule située dans la colonne 20, comme je le fais déjà sur les cellules de la colonne 14. J’ai donc copié/coller et modifié ce qui suit :
'Surveille si une cellule de la colonne 20 contient "0".
If Cells(sel.Row, 20).Value = "0" Then
    MsgBox ("Cet auteur n'est pas à jour de sa cotisation!" & vbCr & "Il ne peut donc pas participer à cette compétition!"), vbCritical, "Fédération Photographique de France"
    sel.Value = ""
    sel.Select
    Exit Sub

End If
End Sub


Remplace l'avant dernier end sub par exit sub
0
Gord21 Messages postés 918 Date d'inscription   Statut Membre Dernière intervention   289
 
C'est peut-être plus clair comme ça :

Private Sub Worksheet_Change(ByVal sel As Range) 
'Surveille si une saisie sur la quatrième colonne a lieu. 
If sel.Column = 4 Then 
    Dim cel As Range, rien As Boolean 
    rien = False 
    For Each cel In sel.Cells 
        If cel.Value = "" Then 
            ActiveSheet.Unprotect ("d1500359a") 
            cel.Offset(0, 11).Value = "" 
            ActiveSheet.Protect ("d1500359a") 
            rien = True 
        End If 
    Next cel 
    If rien Then Exit Sub 
    If sel.Count > 1 Then Exit Sub 
    If sel.Value = False Then sel.Value = "": Exit Sub 
    If Application.WorksheetFunction.CountIf(Range("D:D"), sel.Value) > [maxi].Value Then 
        MsgBox ("Le nombre de photos autorisé pour cet auteur" & vbCr & "est déjà atteint."), vbCritical, "Fédération Photographique de France" 
        sel.Value = "" 
        sel.Select 
        Exit Sub 
    End If 
    'Surveille si une cellule de la colonne 14 contient "Numero d'ahérent inconnu". 
    If Cells(sel.Row, 14).Value = "Numéro d'adhérent inconnu…" Then 
    MsgBox ("Cet auteur n'est pas adhérent de la F.P.F!" & vbCr & "Il ne peut donc pas participer à cette compétition!"), vbCritical, "Fédération Photographique de France" 
        sel.Value = "" 
        sel.Select 
        Exit Sub 
        If Cells(sel.Row, 20).Value = "0" Then 
            MsgBox ("Cet auteur n'est pas à jour de sa cotisation!" & vbCr & "Il ne peut donc pas participer à cette compétition!"), vbCritical, "Fédération Photographique de France" 
            sel.Value = "" 
            sel.Select 
            Exit Sub 
        End If 
    End If 
End If
 
End Sub
0
Mistral_13200 Messages postés 636 Date d'inscription   Statut Membre Dernière intervention   4
 
Merci à vous deux Gord21 & eriic.
J'ai essayé ce matin vos propositions et j'ai tjr le mm problème! A savoir impossibilité d'effectuer le test en colonne 20.
Dans l'expression If Cells(sel.Row, 20), sel.Row indique bien la ligne courante et 20 le N° de la colonne?
Je suis vraiment perdu.
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention  
 
Bonjour
Tu devrais montrer où tu en es après avoir repris la structure.
Le mieux est de déposer un fichier exemple sur cijoint.fr et de coller ici le lien fourni.
eric
0
Mistral_13200 Messages postés 636 Date d'inscription   Statut Membre Dernière intervention   4
 
Re
Voilà ci-dessous un lien pour une version allégée de mon classeur. J’ai réduit la base de référence pour ne garder que 7 lignes, soit 7 personnes. Cette base est sur une feuille cachée appelée « Listaut ». Sur la feuille « Bordereau » les colonnes « E » et de « N à T » sont normalement masquées.

http://www.cijoint.fr/cjlink.php?file=cj201002/cijvDpTttc.xls

La feuille « Menu » est préremplie et verrouillée. Il suffit de cliquer sur le bouton pour accéder à la feuille qui pose problème. Pour l’utiliser il suffit de rentrer un N° dans la colonne appelée « Carte ». Des N° de 1 à 7.
Pour les N° 2, 4, 7 les noms et prénoms s’afficheront en Noir sur fond Blanc, c’est normal ils sont adhérents et à jour de leur cotisation.
Pour les N° au-delà de 7 une fenêtre apparaîtra pour signaler que c’est un N° inconnu. En cliquant sur « OK » on ferme la fenêtre et on efface le N° saisi.
Pour les N° 1, 3, 5 et 6 c’est là ou j’ai un problème et c’est que je souhaite tester la cellule de la colonne 20. Si un des ces quatre N° est saisi le prénom et le nom sont affiché en Noir sur fond Jaune, cela signifie que cette personne est connu mais non à jour de sa cotisation. C’est à ce moment là que devrait s’afficher une autre fenêtre signalant cette anomalie. En cliquant sur le bouton « OK » on ferme la fenêtre et on efface le N° saisi.
J’espère que de cette façon tu pourras mieux te rendre compte du problème.
Cordialement
Mistral
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention  
 
Bonsoir,

Déjà, rien à voir avec ton pb mais qcq chose m'échappe :
        For Each cel In sel.Cells
            If cel.Value = "" Then
                ActiveSheet.Unprotect ("123")
                cel.Offset(0, 11).Value = ""
                ActiveSheet.Protect ("123")
                rien = True
            End If
        Next cel

Cel étant la cellule où a eu lieu la saisie tu ne boucles que sur cette cellule... Ca n'a d'interet que si tu as prévu que l'utilisateur sélectionne plusieurs cellules à partir de D (?)
(fin de la parenthèse)

Pour moi c'est bien un problème de structure
Actuellement tu ne testes Cells(sel.Row, 20).Value = "0" que si Cells(sel.Row, 14).Value = "Numéro d'adhérent inconnu…" est vérifié.
Si tu veux l'inverse(?) mets :
        If Cells(sel.Row, 14).Value = "Numéro d'adhérent inconnu…" Then
            MsgBox ("Cette personne n'est pas adhérente de la F.F.P!" & vbCr & "Il ne peut donc pas participer!"), vbCritical, "F.F.P"
            sel.Value = ""
            sel.Select
            Exit Sub
        ElseIf Cells(sel.Row, 20).Value = "0" Then
            MsgBox ("Cette personne n'est pas à jour de sa cotisation!" & vbCr & "Elle ne peut donc pas participer!"), vbCritical, "F.F.P"
            sel.Value = ""
            sel.Select
            Exit Sub
        End If
(et un endif à supprimer)

Ou si tu veux faire les 2 tests systématiquent met un endif au premier test (après le exit sub) de façon à démarrer un if qui ne soit pas interne au premier.
Si ce n'est pas ça décrit la logique que tu attends

eric
0
Mistral_13200 Messages postés 636 Date d'inscription   Statut Membre Dernière intervention   4
 
Bonjour Eric,

Déjà, rien à voir avec ton pb mais qcq chose m'échappe :

Je ne comprends pas le sens de tes interrogations.
Je test si une entrée est faite sur une cellule de la colonne "4".
Si oui j'effectue les contrôles qui suivent :
- Le Nb maxi d'oeuvre pour un N°.
- Si le N° est adhérent (colonne 14).
- Si le N° est à jour de cotisation (colonne 20).
Si non rien ne se passe.

Pour moi c'est bien un problème de structure :

Je veux effectivement faire les deux.
J'ai testé le End If après le Exit Sub et ça marche exactement comme je le souhaitais.
Je vais maintenant l'adapté pour les autres fonctions.
Un grand merci à toi.
Cordialement.
Mistral
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention  
 
Re,

Le bout qui ne sert à rien :
Private Sub Worksheet_Change(ByVal sel As Range) 
'Surveille si une saisie sur la quatrième colonne a lieu. 
If sel.Column = 4 Then 
    ...
    For Each cel In sel.Cells 
        ...
        End If 
   Next cel

Le paramètre 'sel' passé dans worksheet_change est LA cellule ayant changé.
Ensuite tu fais : For Each cel In sel.Cells
Pour toutes les cellules de 'sel' faire.... Mais il n'y en a qu'une : celle dont le contenu a changé..
Ton for each ne sert à rien

eric
0