OVH Cloud OVH Cloud

Listes de validations multiples

12 réponses
Avatar
Patrick BASTARD
Bonsoir, toutes et tous.

J'ai créé un classeur permettant de gérer 3 niveaux de validations par
liste, en utilisant select case, avec 10 choix possibles chaque fois.
Il fonctionne bien, et j'envisageais de le proposer à misange, mais...
...le code est un peu lourd (110 case), et mon niveau ne me permet
pas -encore- de mettre au point les boucles que je pressens pour optimiser
le code.
L'un d'entre vous serait-il intéressé, pour m'aider à finaliser ce classeur
?

http://cjoint.com/?cmrCzhRIpC

Chacune de vos critiques et/ou suggestions sera la bienvenue.

--
Bien amicordialement,
P. Bastard

10 réponses

1 2
Avatar
AV
Te devrais jeter un oeil là :

http://www.excelabo.net/moteurs/compteclic.php?nom=av-listevalidmultiples

AV
Avatar
Patrick BASTARD
Bonjour, *Alain*

J'ai, depuis longtemps, téléchargé ton classeur,
http://www.excelabo.net/moteurs/compteclic.php?nom=av-listevalidmultiples
et l'ai utilisé à plusieurs reprises.

Loin de moi l'idée de vouloir réinventer l'eau chaude.

Je voulais simplement, au départ, tester la possibilité de redéfinir un nom
sous condition.
La lecture du code -indigeste- que j'ai pondu m'a laissé entrevoir la
solution de boucler avec deux variables.
Malheureusement je n'ai pas encore trouvé le joint.

En fait, j'aimerais écrire, à la place de :
Range("A3").Value
Range(i&j).value
i étant la variable représentant le nom de la colonne,
j la variable représentant le nom de la ligne.

Merci de m'avoir répondu,


--
Bien amicordialement,
P. Bastard
Avatar
AV
| Je voulais simplement, au départ, tester la possibilité de redéfinir un nom
| sous condition.

Je comprends pas très bien pourquoi tu veux absolument boucler.....
La meilleure méthode me semblant être, après avoir nommé les plages,
l'utilisation de la fonction INDIRECT et, éventuellement de la fonction DECALER
pour les plages dynamiques
Par ailleurs, je ne saurais trop te conseiller de stocker tes données de façon
bien structurée : pas de lignes et/ou de colonnes vides, commencer en A1, noms
de champs en ligne 1...etc...

AV
Avatar
Patrick BASTARD
Merci pour ces conseils, *Alain*

--
Bien amicordialement,
P. Bastard


Je voulais simplement, au départ, tester la possibilité de redéfinir
un nom sous condition.


Je comprends pas très bien pourquoi tu veux absolument boucler.....
La meilleure méthode me semblant être, après avoir nommé les plages,
l'utilisation de la fonction INDIRECT et, éventuellement de la
fonction DECALER pour les plages dynamiques
Par ailleurs, je ne saurais trop te conseiller de stocker tes données
de façon bien structurée : pas de lignes et/ou de colonnes vides,
commencer en A1, noms de champs en ligne 1...etc...

AV



Avatar
Laurent
"AV" a écrit dans le message de
news:
Te devrais jeter un oeil là :

http://www.excelabo.net/moteurs/compteclic.php?nom=av-listevalidmultiples

AV



La solution proposée est nien plus élégante, mai j'aurais un suggetstion à
proposer:

Ecrire : If Target = [A2] Then
au lieu de If Target.Address = "$A$2"


C'est à la fois aussi clair et plus rapide

Cordialement,
--
LR

Avatar
Patrick BASTARD
Bonjour, *Laurent*


La solution proposée est nien plus élégante,


C'est peu dire, (on ne compare pas un code de PB avec un code de AV) et je
viens précisément ici pour améliorer mon style.
Mais, sauf urgence, chercher une solution par soi-même (quitte à appeler à
l'aide quand ça coince) me semble plus formateur que d'utiliser un code
"tout cuit".
Qu'en penses-tu?


--
Bien amicordialement,
P. Bastard

Avatar
Yoyo
Bonjour Patrick, AV et Laurent,

Je te propose 2 solutions. La première sur la base de ce qu'a dit AV
(fonctions DECALER et INDIRECT), et la seconde par modification des noms par
la procédure événementielle Worksheet_SelectionChange (désactivée au départ
: supprimer le Exit Sub pour l'activer)...

http://cjoint.com/data/cnoa2eptBa.htm

Amicalement
Yoyo

"Patrick BASTARD" a écrit dans le
message de news:u9lnfL$
Bonsoir, toutes et tous.

J'ai créé un classeur permettant de gérer 3 niveaux de validations par
liste, en utilisant select case, avec 10 choix possibles chaque fois.
Il fonctionne bien, et j'envisageais de le proposer à misange, mais...
...le code est un peu lourd (110 case), et mon niveau ne me permet
pas -encore- de mettre au point les boucles que je pressens pour optimiser
le code.
L'un d'entre vous serait-il intéressé, pour m'aider à finaliser ce
classeur

?

http://cjoint.com/?cmrCzhRIpC

Chacune de vos critiques et/ou suggestions sera la bienvenue.

--
Bien amicordialement,
P. Bastard




Avatar
Patrick BASTARD
Bonjour, *Yoyo*

Merci pour ton code, tout simplement superbe...

Encore une petite, pour la route :
Comment changer 10 de resize(10, 1) par le nb d'items que comporte la liste,
que je souhaite variable?
Set Plage = Cells(17, (Asc(Range("B2")) - Asc("A")) * 2 + 1).Resize(10, 1)
Set Plage = Cells(17, (Asc(Range("B2")) - Asc("A")) * 2 +
1).Resize(*nbval(plage)* , 1)


--
Bien amicordialement,
P. Bastard


Je te propose 2 solutions. La première sur la base de ce qu'a dit AV
(fonctions DECALER et INDIRECT), et la seconde par modification des
noms par la procédure événementielle Worksheet_SelectionChange
(désactivée au départ
supprimer le Exit Sub pour l'activer)...


http://cjoint.com/data/cnoa2eptBa.htm

Amicalement
Yoyo



Avatar
AV
| La solution proposée est nien plus élégante, mai j'aurais un suggetstion à
| proposer:
| Ecrire : If Target = [A2] Then
| au lieu de If Target.Address = "$A$2"
| C'est à la fois aussi clair et plus rapide

Hum... hum...
Quand tu écris "If Target = [A2]" ça veut dire implicitement "If Target.Value =
[A2]" et ça n'a strictement rien à voir avec "Target.Adress" !

AV
Avatar
Yoyo
re bonjour Patrick,

Je pense que tu peux faire ainsi (2 lignes de codes au lieu d'une) :

Set Plage = Cells(17, (Asc(Range("B2")) - Asc("A")) * 2 + 1)
Set Plage = Plage.Resize(Plage.End(xlDown).Row - Plage.Row + 1,1)

Bien sûr, il faut une cellule vide sous ta liste ;-)))

Amicalement
Yoyo

"Patrick BASTARD" a écrit dans le
message de news:
Bonjour, *Yoyo*

Merci pour ton code, tout simplement superbe...

Encore une petite, pour la route :
Comment changer 10 de resize(10, 1) par le nb d'items que comporte la
liste,

que je souhaite variable?
Set Plage = Cells(17, (Asc(Range("B2")) - Asc("A")) * 2 + 1).Resize(10, 1)
Set Plage = Cells(17, (Asc(Range("B2")) - Asc("A")) * 2 +
1).Resize(*nbval(plage)* , 1)


--
Bien amicordialement,
P. Bastard


1 2