XL 2016 LISTES DEROULANTES EN CASCADE

DAMIEN CERESER

XLDnaute Nouveau
Bonjour à vous tous,
J'avance plutôt bien dans mon travail afin de remplir un "masque d'import de données" qui comporte 45 colonnes qui sera intégré ensuite dans une base d'article au format .txt
Pour me faciliter la vie, j'ai créé 3 listes déroulantes en cascade avec les fonctions DECALER, EQUIV, et NBVAL
La première correspond à une classification
La seconde correspond à une famille de produits (Ex: 0101-Intitulé)
La troisième correspond à une sous-famille de la seconde (Ex: 0102-Intitulé)
Je précise que pour une question de lisibilité, et de choix, l'intitulé doit impérativement être visible.
Tout fonctionne très bien. Cependant ce matin, j'ai appris, que les colonnes famille et sous-famille ne doivent comporter que les 4 premiers caractères. J'ai trouver une macro qui le fait très bien. Elle affiche complètement dans ma liste déroulante famille le code et l'intitulé et ne garde que le code (Ex: 0101).
Par contre, le problème, est sur la colonne sous-famille, qui du coup ne trouve plus de correspondance avec la colonne famille puisque celle-ci n'a conservée que le code (0101).

J'espère avoir été assez clair dans mon explication, je sais que parfois se n'est pas toujours évident d'expliquer ce que l'on veut faire.

Quelqu'un aurait une solution à me donner ?

Voici la macro que j'utilise pour conserver les 4 premiers caractères.

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect([G2:H1000], Target) Is Nothing Then
Application.EnableEvents = False
Target = Left(Target, 4)
Application.EnableEvents = True

End If

End Sub

Par avance merci
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Beaucoup ont apparemment une première impression opposée, mais je vous assure qu'avec cette ressource, on n'a presque plus à s'occuper de rien …
Sauf de dire au début à quels contrôles doivent correspondre quelles colonnes, le reste n'étant plus que procédures très courtes.
Remarque: Qui pouvant le plus peut aussi le moins, la cascade est déterminé par l'ordre dans lequel on décide de renseigner les ComboBox.
 

DAMIEN CERESER

XLDnaute Nouveau
Bonjour.
Beaucoup ont apparemment une première impression opposée, mais je vous assure qu'avec cette ressource, on n'a presque plus à s'occuper de rien …
Sauf de dire au début à quels contrôles doivent correspondre quelles colonnes, le reste n'étant plus que procédures très courtes.
Remarque: Qui pouvant le plus peut aussi le moins, la cascade est déterminé par l'ordre dans lequel on décide de renseigner les ComboBox.
Merci pour votre réponse, mais est-ce que je suis obligé de passer par une ComboBox ? Il n'existe pas un autre moyen ?

Damien
 

Dranreb

XLDnaute Barbatruc
C'est l'idéal une ComboBox pour faire des recherches dans les UserForm. Le truc c'est que personne ne l'utilise comme il faut. Tout le monde se précipite toujours aveuglément sur le bouton de la flèche au lieu de la considérer avant tout comme une zone de saisie, la liste n'étant là qu'au cas où on ne saurait plus quoi taper d'existant.
Il est d'ailleurs possible de faire en sorte que le bouton ne soit jamais affiché. Comme ça seule la suggestion d'une suite existante à ce qu'on a tapé la distingue d'une TextBox.
Remarque: mon objet ComboBoxLiés se charge de construire leurs listes classées et sans doublon d'après ce qui existe dans la base à consulter ou mettre à jour, et aussi en fonction de ce qui a déjà été mis dans certaines d'entre elles. On n'a pas à s'en occuper.
 
Dernière édition:

DAMIEN CERESER

XLDnaute Nouveau
Bonjour à tous,
Après beaucoup de réflexion à mon problème, j'ai "pondu" cette formule:

=DECALER(BDD!A:A;1;EQUIV(STXT(G2;1;4);STXT(BDD!$1:$1;1;4);0)-1;NBVAL(DECALER(BDD!A:A;1;EQUIV(STXT(G2;1;4);STXT(BDD!$1:$1;1;4);0)-1;100;1));1)

qui répond tout à fait à mes attentes.
Pour rappel, cette formule agit dans une liste déroulante qui se trouve en colonne H dans mon tableau.
Cependant, j'ai encore un problème avec cette liste déroulante. En effet, a chaque fois que j'ouvre mon fichier, ma liste déroulante ne fonctionne plus, je suis donc obligé de repasser par "Validation de données", pour la valider à nouveau, et après ça tout va bien.

Quel est le problème ? Je ne comprends absolument pas ce qu'il se passe ! Est-ce que quelqu'un pourrait m'aiguiller ?
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Vous n'aviez pas dit que c'était une validation de données, et comme vous aviez parlé de listes en cascades je supposai que c'étaient des choix successifs dans des listes de ComboBox d'un UserForm. J'ai ce vieux classeur qui le fait à partir d'un tableau de toutes les combinaisons valides.
 

Pièces jointes

  • ValidDicArb.xls
    94.5 KB · Affichages: 32

DAMIEN CERESER

XLDnaute Nouveau
Bonjour.
Vous n'aviez pas dit que c'était une validation de données, et comme vous aviez parlé de listes en cascades je supposai que c'étaient des choix successifs dans des listes de ComboBox d'un UserForm. J'ai ce vieux classeur qui le fait à partir d'un tableau de toutes les combinaisons valides.
Wouah ! C'est du lourd ! Mes connaissances en VBA sont très limitées, mais je peux dire que ça envoi !
Pour pouvoir regarder comment tout ça s'articule, la macro bug parce qu'elle nécessite une mise à jour en 64 bits.

Cordialement. Damien
 

Dranreb

XLDnaute Barbatruc
Mettez le mot clé PtrSafe entre Declare et Sub, et Length As LongPtr, comme ça :
VB:
Private Declare PtrSafe Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As LongPtr)
 

DAMIEN CERESER

XLDnaute Nouveau
Bonjour,

Je reviens vers vous, pour essayer d'avancer dans mon problème. En effet, comme je vous le rappelle, mon soucis est le suivant:

j'ai créé cette formule =DECALER(BDD!A:A;1;EQUIV(STXT(G11;1;4);STXT(BDD!$1:$1;1;4);0)-1;NBVAL(DECALER(BDD!A:A;1;EQUIV(STXT(G11;1;4);STXT(BDD!$1:$1;1;4);0)-1;100;1));1) dans Validation de données.

Cette Validation de données disparaît de mes cellules à l'ouverture du fichier. Je suis obligé de la valider à nouveau pour que cela fonctionne. J'ai réfléchi à une solution de contournement par le biais d'une macro pour que cela se fasse automatiquement à l'ouverture du fichier.

Sub Macro3()
'
' Macro3 Macro
'
Range("H2:H10").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:= _
"=OFFSET(BDD!A:A,1,MATCH(MID(G2,1,4),MID(BDD!$1:$1,1,4),0)-1,COUNTA(OFFSET(BDD!A:A,1,MATCH(MID(G2,1,4),MID(BDD!$1:$1,1,4),0)-1,100,1)),1)"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Range("A1").Select
End Sub

Cela ne fonctionne pas et me renvoi une "Erreur d'exécution 1004"à partir de la ligne:

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:= _
"=OFFSET(BDD!A:A,1,MATCH(MID(G2,1,4),MID(BDD!$1:$1,1,4),0)-1,COUNTA(OFFSET(BDD!A:A,1,MATCH(MID(G2,1,4),MID(BDD!$1:$1,1,4),0)-1,100,1)),1)"

Je ne sais plus quoi faire, je suis allé voir dans différents Tutos, mais je n'y arrive pas. (j'ai essayé la formule en français et en anglais)

Pouvez-vous m'aider à trouver une solution ?
Par avance merci

Damien
 
Dernière édition:

DAMIEN CERESER

XLDnaute Nouveau
Bonjour,

Je reviens vers vous, pour essayer d'avancer dans mon problème. En effet, comme je vous le rappelle, mon soucis est le suivant:

j'ai créé cette formule =DECALER(BDD!A:A;1;EQUIV(STXT(G11;1;4);STXT(BDD!$1:$1;1;4);0)-1;NBVAL(DECALER(BDD!A:A;1;EQUIV(STXT(G11;1;4);STXT(BDD!$1:$1;1;4);0)-1;100;1));1) dans Validation de données.

Cette Validation de données disparaît de mes cellules à l'ouverture du fichier. Je suis obligé de la valider à nouveau pour que cela fonctionne. J'ai réfléchi à une solution de contournement par le biais d'une macro pour que cela se fasse automatiquement à l'ouverture du fichier.

Sub Macro3()
'
' Macro3 Macro
'
Range("H2:H10").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:= _
"=OFFSET(BDD!A:A,1,MATCH(MID(G2,1,4),MID(BDD!$1:$1,1,4),0)-1,COUNTA(OFFSET(BDD!A:A,1,MATCH(MID(G2,1,4),MID(BDD!$1:$1,1,4),0)-1,100,1)),1)"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Range("A1").Select
End Sub

Cela ne fonctionne pas et me renvoi une "Erreur d'exécution 1004"à partir de la ligne:

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:= _
"=OFFSET(BDD!A:A,1,MATCH(MID(G2,1,4),MID(BDD!$1:$1,1,4),0)-1,COUNTA(OFFSET(BDD!A:A,1,MATCH(MID(G2,1,4),MID(BDD!$1:$1,1,4),0)-1,100,1)),1)"

Je ne sais plus quoi faire, je suis allé voir dans différents Tutos, mais je n'y arrive pas. (j'ai essayé la formule en français et en anglais)

Pouvez-vous m'aider à trouver une solution ?
Par avance merci

Damien
Je réponds moi-même a ma question, qui pourra peut-être aider quelqu'un. Finalement, j'ai abandonné l'idée d'une macro, car n'étant pas forcément à l'aise avec le VBA, c'était plutôt compliqué. Du coup, après beaucoup de réflexion, j'ai trouvé la solution tout seul, comme un grand ! Et cette solution est vraiment super simple:
J'ai défini un nom par l'onglet Formules, et ensuite j'ai attribué ma formule à ce nom, après Validation de Données, Liste, Source et =le Nom que j'ai défini. Et voilà...
 

Discussions similaires

Statistiques des forums

Discussions
311 708
Messages
2 081 750
Membres
101 812
dernier inscrit
trufu