XL 2016 Mise en évidence d'erreur lors de l'utilisation de listes déroulantes en cascade

thomasdu43

XLDnaute Occasionnel
Bonjour,
J'ai créer un fichier avec des listes déroulantes en cascade qui s'appuient sur un base de données. Je souhaiterai appliquer à mes cellules avec liste déroulante une mise en forme lorsque le résultat de la liste déroulante n+1 n'est pas en phase avec le résultat de la liste déroulante n qui la précède.
Je vous remercie de votre aide.
 

Roblochon

XLDnaute Accro
Bonjour,

La solution est dans le fichier virtuel qui n'est pas joint à ma réponse et sur lequel j'ai pu voir au moyen d'une boule de cristal, où étaient les listes de validation, comment elles étaient montées en cascade et tout un tas d'autre détails tellement inutiles que ça ne vaut même pas la peine de les citer:)

A vous relire
 

thomasdu43

XLDnaute Occasionnel
Bonjour,

La solution est dans le fichier virtuel qui n'est pas joint à ma réponse et sur lequel j'ai pu voir au moyen d'une boule de cristal, où étaient les listes de validation, comment elles étaient montées en cascade et tout un tas d'autre détails tellement inutiles que ça ne vaut même pas la peine de les citer:)

A vous relire
Avec le fichier.
Merci.
 

Fichiers joints

Roblochon

XLDnaute Accro
Re bonjour,

Pas évident, parce que les listes sont reconstruites par macro et ne sont contenues nulle par ailleurs (tableau), mais voici une approche.

A bientôt
 

Fichiers joints

thomasdu43

XLDnaute Occasionnel
Re bonjour,

Pas évident, parce que les listes sont reconstruites par macro et ne sont contenues nulle par ailleurs (tableau), mais voici une approche.

A bientôt
Je vous remercie.
Ca répond à mes attentes. Si je dois copier ces macros dans mon fichier (celui que j'ai transmis était allégé), à quoi faut il prêter attention ?
Merci encore.
 

Roblochon

XLDnaute Accro
Bonjour,

à quoi faut il prêter attention ?
A presque tout avec VBA, notamment les noms et leurs définitions.

Dans la feuille BD_Divers, vous avez des plages de listes, pourquoi ne pas vous en servir dans vos listes de validations? Surtout celles qui n'ont que très peu d'items.
Par exemple la zone A2:A4 contenant les noms de Gaz, remplacerait avantageusement en terme de rapidité et temps de calcul, ce qui est fait par macro dans WorkSheet_SelectionChange. Les nouvelles versions d'excel permettent aujourd'hui de faire beaucoup plus de choses, plus rapidement et efficacement sans vba.

Je ne sais pas à quoi va ressembler le projet final, mais vu comme c'est parti, vous risquez de vite vous retrouver avec une usine à gaz.

A bientôt
 

thomasdu43

XLDnaute Occasionnel
Bonjour,



A presque tout avec VBA, notamment les noms et leurs définitions.

Dans la feuille BD_Divers, vous avez des plages de listes, pourquoi ne pas vous en servir dans vos listes de validations? Surtout celles qui n'ont que très peu d'items.
Par exemple la zone A2:A4 contenant les noms de Gaz, remplacerait avantageusement en terme de rapidité et temps de calcul, ce qui est fait par macro dans WorkSheet_SelectionChange. Les nouvelles versions d'excel permettent aujourd'hui de faire beaucoup plus de choses, plus rapidement et efficacement sans vba.

Je ne sais pas à quoi va ressembler le projet final, mais vu comme c'est parti, vous risquez de vite vous retrouver avec une usine à gaz.

A bientôt
Je l'ai copié et fait les modif qui s'imposent.
Je pensais que c'était le moyen le plus sur pour une série de listes déroulantes en cascade à 6 niveaux. La gestion de la base de données est simple également, notamment si je viens à la modifier.
Comment aurais je du procéder selon vous.
Merci encore et bonne journée.
 

Roblochon

XLDnaute Accro
Re,

Ce que vous avez fait est très bien, surtout pour quelqu'un qui débute.
Ce qu'il vous faut c'est choisir l'une ou l'autre des méthodes, soit des listes nommées, soit des listes construites par vba et à ce moment là, ne pas conserver les listes nommées de la feuilles BD_Divers si elles ne servent à rien d'autres.

Si vous examinez bien ce que je vous ai transmit vous verrez que pour votre demande de mise en forme: la reconstruction d'une liste se fait 2 fois (pour moi, mais ce n'est que mon avis, une de trop), une fois sur sélection de la cellule qui contient la validation et une fois sur le changement de la liste dépendante.

La méthode VBA est souvent utilisée pour fabriquer des listes pour des recherches approximatives sur des termes qui varient souvent (ex:recherche type google), ou pour extraire des termes uniques d'une liste avec doublons, triplettes etc...

En écrivant ceci, me vient une autre idée pour éviter la deuxième construction des listes. Je vais vous la soumettre.

Edition: non c'est une mauvaise idée qui complique les choses.

A plus tard
 
Dernière édition:

thomasdu43

XLDnaute Occasionnel
Re bonjour,

Pas évident, parce que les listes sont reconstruites par macro et ne sont contenues nulle par ailleurs (tableau), mais voici une approche.

A bientôt
Bonjour Roblochon,
Merci pour votre fichier qui m'aide beaucoup. J'ai élargi le principe à d'autres cellules et me voit confronter à une mise en forme de cellule alors que je ne le souhaite pas - exemple de la B30 pour laquelle vous avez indiqué :
Attention ici la cellule B30 n'est pas prise en compte,
' c'est la dernière de la cascade -> pas de suivante à mettre en forme
If Intersect(Target, Range("A9:C9,B3:B5,B17:B20,B28:B29,B44:B46")) Is Nothing Or Target.Count > 1 Then Exit Sub

Que faut il faire (ajouter pour que la cellule B47) ne soit pas prise en compte ? J'ai ajouté
End Select
If Not d1 Is Nothing Then MiseEnFormeValidationCellule Target

Mais cela bloque le code qui se trouve à la suite du fait du "End Select" je suppose.

Merci de votre aide.
 

thomasdu43

XLDnaute Occasionnel
Bonjour,

En complément, pourrait-on imaginer se service du même code afin de chercher une valeur dans une base de données. En fait ne pas se servir d'une formule matricielle mais plutôt de ce code. La seule différence selon moi serait de ne pas générer de liste déroulante au final. Avez vous une idée ?
Merci.
 

Roblochon

XLDnaute Accro
Bonjour,

Je ne vois pas de quoi vous parler ou trop vaguement pour vous répondre. Et n'oubliez pas fichier exemple avec ce que vous avez modifié et ce que vous voulez.

Bonne continuation
 

thomasdu43

XLDnaute Occasionnel
Bonjour,

Je ne vois pas de quoi vous parler ou trop vaguement pour vous répondre. Et n'oubliez pas fichier exemple avec ce que vous avez modifié et ce que vous voulez.

Bonne continuation
Bonjour,
Je vous joins mon fichier.
J'ai quelques bug sur la mise en évidence des erreurs liés aux choix par liste déroulante : typiquement la cellule B52.
Mes compléments ;) ,
- comment faudrait il faire pour avoir un erase pralable de toutes les listes déroulantes quand une action sur B3 ou B4 ou B5 a lieu ?
- le sujet évoqué dans mon post précédent vous permettra maintenant d'y voir plus clair avec le fichier : les cellules D17:H24 s'appuient sur une formule matricielle dont la source est l'onglet BD_Générale. J'ai dupliqué la formule ce qui a pour conséquence un ralentissement notable des automatismes. Auriez vous une idée pour soit réduire le nombre (je pensais faire référence à la valeur précédemment trouvée grace à la formule matricielle et demandée un décalage de colonne pour trouver le résultat escompté ou me servir de ma macro liste déroulante en cascade qui s'appuie sur une recherche multi critère).
A vous lire,

Merci encore pour votre aide.
 

Fichiers joints

Roblochon

XLDnaute Accro
Bonsoir,

Nous ne sommes pas loin de ce que je vous disais au post #6:

Je ne sais pas à quoi va ressembler le projet final, mais vu comme c'est parti, vous risquez de vite vous retrouver avec une usine à gaz.
A ce stade, je ne sais quoi vous dire, à part de prendre du recul, de vous concentrer sur ce qui est absolument nécessaire.
Demain, si j'ai le temps je me pencherai plus en avant sur votre classeur.

Bon soirée
 

Roblochon

XLDnaute Accro
Bonjour,

1 - Vous avez excel 2016, utilisez les tableaux structurés et leurs fonctionnalités pour laisser excel gérer ce qu'il sait très bien faire.
2 - évitez les calculs sur des colonnes entières (ex:$A:$A) et de multipliez x fois la même formule (surtout les matricielles) pour le même résultat.
pour cela mettez la formule dans une cellule, nommez la et faites y référence dans les autres formules.
3 - évitez la multiplication des noms calculés sur des colonnes entières genre : DECALER(BD_Borne!$B$2;;;NBVAL(BD_Borne!$A:$A)-1)
(même solution que pour le 2 si le besoin est incontournable).

4 - Dans le classeurs joint les tableaux structurés sont nommés et préfixés par TBD_ suivi du nom de la feuille.
Regarder comment sont définis les noms Choix1, Choix2, Choix3, Choix2Borne (=TBD_Borne[Borne]) (en lieu et place de la formule décaler précédente).

5 - éliminez les formules qui n'ont plus lieu d'être (DB_Générale et autres)

J'ai fait quelques changements (noms, formules), à vous de finir et vérifier les résultats, pas à pas.

Pour le reste nous verrons plus tard.

Cordialement
 

Fichiers joints

thomasdu43

XLDnaute Occasionnel
Bonjour,

1 - Vous avez excel 2016, utilisez les tableaux structurés et leurs fonctionnalités pour laisser excel gérer ce qu'il sait très bien faire.
2 - évitez les calculs sur des colonnes entières (ex:$A:$A) et de multipliez x fois la même formule (surtout les matricielles) pour le même résultat.
pour cela mettez la formule dans une cellule, nommez la et faites y référence dans les autres formules.
3 - évitez la multiplication des noms calculés sur des colonnes entières genre : DECALER(BD_Borne!$B$2;;;NBVAL(BD_Borne!$A:$A)-1)
(même solution que pour le 2 si le besoin est incontournable).

4 - Dans le classeurs joint les tableaux structurés sont nommés et préfixés par TBD_ suivi du nom de la feuille.
Regarder comment sont définis les noms Choix1, Choix2, Choix3, Choix2Borne (=TBD_Borne[Borne]) (en lieu et place de la formule décaler précédente).

5 - éliminez les formules qui n'ont plus lieu d'être (DB_Générale et autres)

J'ai fait quelques changements (noms, formules), à vous de finir et vérifier les résultats, pas à pas.

Pour le reste nous verrons plus tard.

Cordialement
Merci, très clair.
 

Roblochon

XLDnaute Accro
Bonjour,

bonjour,

Dans le fichier joint je me suis occupé à réduire les temps de calcul en supprimant et remplaçant les formules matricielles et en ajoutant une colonne 'Choix' aux tableau BD_Générale et BD_Sécurisation.

Chaque cellule de ces colonnes 'Choix' teste si la ligne courante répond au choix fait dans la feuille 'Choix'
Deux noms on étés ajoutés (Index_Bd_Générale et Index_Bd_Sécurisation) renvoient l'index d'ordre de la ligne correspondante ( ou 0 si pas de ligne)

Ce sont ces noms (et leur valeur) qui sont employés dans la feuille Choix pour retrouver les informations. Je n'ai pas fait de test sur leur valeur dans les formules de la feuille 'Choix' (ex := Si(Index_Bd_Générale>0;Index(.......);"Ooops blème."). Je vous laisse le faire au besoin.

Les lignes de codes de la feuille choix ont été commentées en attendant la suite.

cordialement
 

Fichiers joints

thomasdu43

XLDnaute Occasionnel
Bonjour,

bonjour,

Dans le fichier joint je me suis occupé à réduire les temps de calcul en supprimant et remplaçant les formules matricielles et en ajoutant une colonne 'Choix' aux tableau BD_Générale et BD_Sécurisation.

Chaque cellule de ces colonnes 'Choix' teste si la ligne courante répond au choix fait dans la feuille 'Choix'
Deux noms on étés ajoutés (Index_Bd_Générale et Index_Bd_Sécurisation) renvoient l'index d'ordre de la ligne correspondante ( ou 0 si pas de ligne)

Ce sont ces noms (et leur valeur) qui sont employés dans la feuille Choix pour retrouver les informations. Je n'ai pas fait de test sur leur valeur dans les formules de la feuille 'Choix' (ex := Si(Index_Bd_Générale>0;Index(.......);"Ooops blème."). Je vous laisse le faire au besoin.

Les lignes de codes de la feuille choix ont été commentées en attendant la suite.

cordialement
Merci, je regarde ça en détail.
La première proposition d'isolée la formule tenant compte des critères (dans la formule matricielle) a permis de réduire le temps de calcul.
 

Discussions similaires


Haut Bas