Probleme avec une Worksheet

Résolu
Mistral_13200 Messages postés 649 Statut Membre -  
eriiic Messages postés 24581 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
Configuration: Windows XP Internet Explorer 7.0

11 réponses

  1. Gord21 Messages postés 928 Statut Membre 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
    1. Mistral_13200 Messages postés 649 Statut Membre 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
      1. Gord21 Messages postés 928 Statut Membre 289 > Mistral_13200 Messages postés 649 Statut Membre
         
        Tu cherches bien à faire le test uniquement si une cellule de la colonne 14 contient "Numero d'ahérent inconnu" ?
        0
      2. Mistral_13200 Messages postés 649 Statut Membre 4 > Gord21 Messages postés 928 Statut Membre
         
        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
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    If Cells(sel.Row, 20).Value = 0
    pas ="0" qui est une chaine
    0
  3. Mistral_13200 Messages postés 649 Statut Membre 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
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Gord21 Messages postés 928 Statut Membre 289
     
    Ne mets pas de Exit Sub juste avant ton test si tu veux que ta macro le fasse.
    0
  7. Mistral_13200 Messages postés 649 Statut Membre 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
  8. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  9. Gord21 Messages postés 928 Statut Membre 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
    1. Mistral_13200 Messages postés 649 Statut Membre 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
  10. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. Mistral_13200 Messages postés 649 Statut Membre 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
  11. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. Mistral_13200 Messages postés 649 Statut Membre 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
  12. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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