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 -
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
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
A voir également:
- Probleme avec une Worksheet
- Worksheet excel download - Télécharger - Tableur
- Worksheet factory - Télécharger - Études & Formations
- La méthode range de l'objet worksheet a échoué ✓ - Forum VB / VBA
- La méthode select de la classe worksheet a échoué ✓ - Forum VB / VBA
- Erreur 1004 méthode printout classe worksheet a échoué ✓ - Forum Excel
11 réponses
Bonjour
Je pense qu'il y a une soucis dans les débuts et fin de boucles If
Peut-être :
au lieu de
Quel est ton message d'erreur ?
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 ?
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.
Je ne comprends vraiment pas pourquoi ça marche avec la colonne 14 et pas avec le colonne20.
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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
Remplace l'avant dernier end sub par 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
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
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
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
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
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
Bonsoir,
Déjà, rien à voir avec ton pb mais qcq chose m'échappe :
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 :
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
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
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
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
Re,
Le bout qui ne sert à rien :
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
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
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?
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