liste de choix par validation

  • Initiateur de la discussion andré
  • Date de début
A

andré

Guest
Salut à toutes et à tous,

Il y a-t-il moyen d'établir une liste de choix par validation sans que les cellules vides dans la plage soient reprises (par cellules vides j'entends également celles avec formules retournant la valeur ""), et ceci sans tri préalable et sans créer de colonne supplémentaire ?

Ândré.
 
@

@+Thierry

Guest
Bonsoir André, Phibou, Romfret, SYLS's, Dan et le Forum

Bon alors comme j'avais l'impression qu'André avait vraiment besoin de fabriquer sa Liste de Validation..... J'ai fait un truc qui va lui faire .... Avec Tri et Sans Doublon... Et tout ceci directement dans la Liste de Validation et surtout sans toucher à la plage Source, qui donc, comme précisé par André au début contient des formules....

Donc c'est réélement une Liste de Validation, une vraie !! (pas une ListBox ActiveX déguisée en Liste de Validation !! lol) ... Mais....... Of Course il y a du VBA derrière... Mais bon j'ai vraiment tout fait pour que ce soit facilement manipulable......

Bonne Soirée (Quelle chaleur !! J'ai ouvert l'Ordi avec un Ventillo braqué sur la Carte Mère)

Bonne Soirée et Bonjour pour Demainn car je sais qu'André est plutôt du matin ;-)
@+Thierry


PS une Duvel de plus à mon compte quand je viens André !
 
@

@+Thierry

Guest
=> DEMO Liste de Validation Construite par VBA (sans vide, triée et sans doublon

Avec le fichier c'est bien mieux !!!!

Bonne Nuit
@+Thierry
 

Pièces jointes

  • Super_Liste_de_Validation.zip
    12.7 KB · Affichages: 41
S

SYL'S

Guest
Re: => DEMO Liste de Validation Construite par VBA (sans vide, triée et sans doublon

Bonsoir @Thierry, André, Phibou, Romfret, Dan et le Forum

Génial @Thierry!!! c'est la roll royce des listes de validation...

Je t'offre un pack de Duvel !!! c'est exactement ce que je recherche aussi !!!

Il faut prévenir Celeda pour qu'elle l'insère dans son post thématique "listes de validation" !!!


Bonne soirée à tous.
 
S

SYL'S

Guest
Re: => DEMO Liste de Validation Construite par VBA (sans vide, triée et sans doublon

Un petit truc, tu rigoles...c'est énorme pour moi/"nous"

en plus je viens de regarder ton code, on peut même définir Set Plage sur une autre [Feuil]....en rechangeant ta fameuse zone LOL. ;-)

EXCELLEMENT VOTRE @THIERRY.
 
@

@+Thierry

Guest
Re: => DEMO Liste de Validation Construite par VBA (sans vide, triée et sans doublon

Hi hi hi

Oh çà oui pas de souci, avec un code comme çà on peut même faire définir un autre classeur et il n'y aura pas de problème puisque la liste est écrite en dure et il n'y aura pas de demande de liason...

Bonne Découverte !!
@+Thierry
 
A

andré

Guest
Re: => DEMO Liste de Validation Construite par VBA (sans vide, triée et sans doublon

Salut @+Thierry et les autres,

Super ton truc, je viens d'en prendre connaissance, sans avoir appronfondi le code.
Celeda va aussi se régaler (à son retour de vacances).

Tu mérites bien ta Duvel (lol).
Comme je suis dans le midi à la mi-septembre, je viens même te l'apporter, si tu le désires, avec quelques bouts de fromage et du sel de céleri (comme chez nous) !

Merci.
Ândré.
 
D

Dan

Guest
Bonjour à Thierry et les autres,

Merci à thierry pour cette nouvelle démo. Tu es vraiment le roi du VBA sur Xld.

....mais même sans mérite et sous cette chaleur, je veux bien amener aussi la Duvel (lol)

Bonne journée

@+

Dan
 
S

SYL'S

Guest
Salut tous le monde,

j'ai regardé le code de @Thierry et je bloque sur un problème...le nombre de cellule, j'ai écrit ....

Set Plage = [Feuil1].Range("A1:A255")
ReDim Tablo(0 To 254)

ca fonctionne

mais dès que je passe à plus de 255 cellules ça bugue sur

For i = LBound(Tablo) To UBound(Tablo) ???

pourquoi ? la liste de validation est limité ?

Bonne journée.
 
J

Jean-Marie

Guest
Re: => DEMO Liste de Validation Construite par VBA (sans vide, triée et sans doublon

Bonjour

Thierry, super la gestion du double clique pour afficher la liste de validation, et en plus elle fonctionne sur mac, (encore un 2ème super).

Mais voilà, j'ai spécifié une liste de 100 lignes, cela bug, sur la ligne :
Size = CByte(Right(CellArr, 2)) - CByte(Right(CellDep, 1))

Je voulais la modifier en, Size = CInt(Mid(CellArr, 2, Len(CellArr) - 1)) - CInt(Mid(CellDep, 2, Len(CellDep) - 1)), mais je me suis dit le jour ou ma plage sera dans une colonne à droite de la colonne Z, il y aura 2 caractères, alpha, je pense que la ligne ci-dessous est la bonne, Size = Range(Range("F12")).Row - Range(Range("F11")).Row
Je n'ai pas oublié de changer de Byte en Long, tes variables

C'est simplement dans le cas ou la plage n'est pas dans les 100 premières lignes.

J' ai pu constater, deux choses :
- une liste de validation n'accepte pas des données venant d'un tableau, même en utilisant un nom.
- la longueur de la chaîne de caractères est limitée à 255.

Alors André, si tu as des données assez longues, et une plage importante, il faudra te résigner, à passer par une plage de cellule intermédiaire.

Bonne journée.

@+Jean-Marie
 
P

PhiBou

Guest
Re: => DEMO Liste de Validation Construite par VBA (sans vide, triée et sans doublon

Salut à tout le fil,

C'est vrai @Thierry, il est génial ton programme. J'ai noté plein de trucs que j'ignorais.

Ne change rien... continue à nous étonner

Bonne après-midi

PhiBou
 
@

@+Thierry

Guest
Re: => DEMO Liste de Validation Construite par VBA (sans vide, triée et sans doublon

Bonsoir à tous ;-)

Sacré Jean Marie t'es vraiment allé chercher la petite bête, l'initialisation de la plage par des cellules.... comme indiqué dans le code était là "Just For the Fun" ... pour mon ami André qui n'aime pas trop les modules VBA !

Mais bon "le client est Roi" alors voici comment tu dois faire Jean-Marie:

'====================================DEBUT DE ZONE INUTILE !! lol ====================================
Dim CellDep As String, CellArr As String
Dim Size As Long

CellDep = Range("F11")
CellArr = Range("F12")

If CellDep = "" Or CellArr = "" Then MsgBox "Il faut spécifier une plage sur les cellules": Exit Sub


'===========================ON POURSUIT LE DELIRE DE L'INUTILE !! lol ====================================
' (mais çà fera plaisir à Jean Marie !!! )
Dim x As Byte, xx As Byte, xxx As Byte
For xx = 1 To Len(CellDep)
For x = 48 To 57
If Mid(CellDep, xx, 1) = Chr(x) Then xxx = xxx + 1
Next x
Next xx

Dim z As Byte, zz As Byte, zzz As Byte
For zz = 1 To Len(CellArr)
For z = 48 To 57
If Mid(CellArr, zz, 1) = Chr(z) Then zzz = zzz + 1
Next z
Next zz

Size = CLng(Right(CellArr, zzz)) - CLng(Right(CellDep, xxx))

MsgBox Size

Set Plage = Range(CellDep & ":" & CellArr)

Plage.Select

Exit Sub

Maintenant donc Size est bien délimitée quelque soit la plage que l'on tape (de A1 à IV65536 par exemple....)

Mais comme vous l'avez remarqué... Il y a un "Exit Sub" dans la macro car inutile de poursuire tellement plus loin.... Car une Liste de Validation reste une Liste de Validation, soit un petit "plus" pour faire des choses sympa dans les feuilles sans trop toucher de programmation (ou pas du tout) ...

Et Jean Marie, bien que s'expliquant bizarrement pour son histoire d'acceptation de données venant d'un tableau, même en utilisant un nom ??? enfin de quel Tableau parles-tu ?

Enfin bref, donc Jean-Marie à mis le doigt sur les limites de cette petite Liste de Validation : la longueur de la chaîne de caractères est limitée à 255 et je préciserais que donc la chaine suivante : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 pour avoir dix choix dans la liste.... "Coûte" 29 caractères.... Donc c'est vite fait de la remplir cette mini Liste !!!

Pour conclure, non cette petite appli que j'ai réalisée pour André a d'ailleurs été paramétrée (limitée) as Byte tout à fait volontairement pour ne pas dépasser la capacitée de la List de Validation elle-même....

Ceci dit la plage pour le Tableau Séquentiel (pas celui de Jean Marie), "Dynamic Array" pour être clair, peut être une large plage.... L'important est de ne pas retourner plus de 255 caractères, sinon la pauvre petite Liste de Validation va être submergée (sans message VBA) mais elle ne pourra qu'afficher "#Value"....

Donc pour SYL's, si sa plage dépasse 255 (limite de Byte) il peut passer en Integer les variables suivantes :
Dim a As Integer, i As Integer, ii As Integer, j As Integer, y As Integer

et aussi la fameuse "Size", mais Integer suffira aussi (long c'est au cas ou tu dépasse 32767... (çà laisse de l'espace... Sauf pour ceux qui travaillent dans IV65536 !!)

Enfin Voilà, pour passer à des plus grandes tailles, je pense que c'est bien pour ceci qu'il y a tout une panoplie d'ActiveX, qui n'ont, quant à eux, que les limites de l'imagination du développeur !

En fait il suffit de retourner le Tableau trié sans doublon dans une ListBox de Feuille directement au stade où on en est... Il suffit de faire :

1°) dessiner une ListBox ActiveX sur la Feuille (Boite à Outils "Contrôle)
2°) remplacer la ligne :
TheList = TheList & ", " & Item
par:
Sheets("Home").ListBox1.AddItem Item
3°) supprimer toute la partie finale à partir de "With ActiveCell.Validation.... Jusqu'à End With inclu...

Là.... No Limit !

Bonne Soirée et merci à tous pour vos compliments, c'est sympa ;-)
@+Thierry
 
J

Jean-Marie

Guest
Re: => DEMO Liste de Validation Construite par VBA (sans vide, triée et sans doublon

Bonsoir,

Thierry, mais qu'est-ce qui te dérange dans cette formule, Size = Range(Range("F12")).Row - Range(Range("F11")).Row

Pour que tu la remplaces par une boucle,

Dim x As Byte, xx As Byte, xxx As Byte
For xx = 1 To Len(CellDep)
For x = 48 To 57
If Mid(CellDep, xx, 1) = Chr(x) Then xxx = xxx + 1
Next x
Next xx

Autre chose, tu dis Pour conclure, non cette petite appli que j'ai réalisée pour André a d'ailleurs été paramétrée (limitée) as Byte tout à fait volontairement pour ne pas dépasser la capacité de la List de Validation elle-même..... Ce n'est pas pour la longueur de la chaîne, ni pour le nombre de lignes de la plage, si la plage est composée de 2 lignes, ce n'est pas le problème, mais si elle commence au-delà de la ligne 90, ta démo ne fonctionne plus.

Thierry, quand je parle une liste de validation n'accepte pas des données venant d'un tableau, même en utilisant un nom., je voulais simplement dire que la liste ne peut être entrer sous cette forme ={1;2;3;4;5...}, même si ce tableau est mis dans une définition d'un nom. Ce type de tableau est renvoyé par une fonction matricielle.

Je vois aussi cas la fin de ton post, tu dis la même chose que moi, il faudra qu'André passe par une plage de cellule.

Voilà ce que j'avais à dire. Je m'excuse, je n'ai pas ta verve ni de carte de presse. Je ne suis qu'un pauvre passionné d'Excel et l'informatique n'est pas mon métier, mais simplement ma passion.

Bonne soirée.

@+Jean-Marie
 
@

@+Thierry

Guest
Re: => DEMO Liste de Validation Construite par VBA (sans vide, triée et sans doublon

Bonjour Jean Marie, le Fil et Le Forum,

Tiens, je viens de me rendre compte de ta ligne de code : "Size = Range(Range("F12")).Row - Range(Range("F11")).Row" qui était totalement occultée dans ton post du 06-08-03 10:50, puisque tu parlais de bug sur "Size = CByte(Right(CellArr, 2)) - CByte(Right(CellDep, 1))"
et de solution foireuse avec "Size = CInt(Mid(CellArr, 2, Len(CellArr) - 1)) - CInt(Mid(CellDep, 2, Len(CellDep) - 1))..." que finalement tu ne fesais pas du tout ressortir ton excellente solution :

Size = Range(Range("F12")).Row - Range(Range("F11")).Row

En effet pour faire ceci, (qui ne sert à rien en fait dans la fameuse liste de validation) mais pour le fun, c'est sûr que c'est dix mille fois mieux que de faire une boucle !!! Je suis même étonné que VBA/Excel accepte ceci et retourne les lignes, mais bravo c'est très bien ;-) (ma boucle est Just For The Fun et je la trouve très marrante malgrè tout !

Pour le Byte, Jean Marie, je fais tout en Byte dès que je peux, et en général je produis des démos pour avoir des petits exemples pas pour faire des applis prêtes à l'emploi. Et ces deux malheureuses cellules pour renseigner la plage n'ont rien à voir avec le prog, (voir mes indications dans le Module).

Pour les tableaux je comprends mieux maintenant.

Et pour finir, oh que non, je ne dis pas la même chose que toi puisque pour moi la solution c'est d'utiliser un Control ActiveX ListBox ! ;-)

Sinon nous sommes bien tous deux dans le même bain de passion pour Excel !!! et çà c'est le top et c'est ce qui nous permet de nous retrouver tous et toutes ici au même niveau.

Bonne journée à Toi, et à tout le Forum
Bonne JOurnée

@+Thierry
 

Discussions similaires

Réponses
8
Affichages
471