Probleme avec une Worksheet

Résolu
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
Configuration: Windows XP Internet Explorer 7.0

11 réponses

  • Votes
  • Date
  • Date décroissante
  1. 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 ?
    1. 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?
    2. @Mistral_13200Tu cherches bien à faire le test uniquement si une cellule de la colonne 14 contient "Numero d'ahérent inconnu" ?
    3. @Gord21Oui 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
  2. Contributeur
    Bonjour,

    If Cells(sel.Row, 20).Value = 0
    pas ="0" qui est une chaine
    1. 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.
      1. Contributeur
        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
        1. Ne mets pas de Exit Sub juste avant ton test si tu veux que ta macro le fasse.
          1. 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.
            1. Contributeur
              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
              1. 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
                1. 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.
              2. Contributeur
                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
                1. 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
              3. Contributeur
                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
                1. 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
              4. Contributeur
                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