XL 2010 Création bordereau de plan

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Bodin44

XLDnaute Nouveau
Bonjour,
Je suis a créer un fichier excel afin de créer des bordereaux d'envoi de nos plans.
Mais je suis limité en excel. Pas les bases pour les formules. Je m'aide de chat GPT ou encore perplexity.
Mais la je bloque totalement.
J'ai dans un fichier excel un onglet liste de plan puis un onglet Bordereau.
Je voudrais dans une cellule, aller récupérer le code du plan "onglet Liste". Puis à partir du code du plan avoir le dernier indice ainsi que sa date qui se trouve aussi dans "onglet Liste".
A savoir que j'enregistre dans liste tout les indice et date du plan.
 

Pièces jointes

Bonjour à tous,

Une solution VBA avec cette macro dans le code de la feuille "Bordereau" :
VB:
Private Sub Worksheet_Activate()
Dim d As Object, mini$, tablo, i&, x$, n&, nn&, y$
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
With Sheets("Liste")
    tablo = .Range("A1:E" & .Range("B" & .Rows.Count).End(xlUp).Row)
End With
ReDim resu(1 To UBound(tablo), 1 To 17) 'A à Q
For i = 2 To UBound(tablo)
    x = tablo(i, 2)
    If x <> "" Then
        If Not d.exists(x) Then
            n = n + 1
            d(x) = n 'mémorise la ligne
            resu(n, 1) = x
            resu(n, 11) = "0"
            mini = "ZZZ"
        End If
        nn = d(x): y = UCase(tablo(i, 4))
        If y < mini Then mini = y: resu(nn, 6) = tablo(i, 5): resu(nn, 17) = tablo(i, 3)
        If y >= resu(nn, 11) Then resu(nn, 11) = y: resu(nn, 13) = tablo(i, 5): resu(nn, 17) = tablo(i, 3)
    End If
Next i
'---restitution---
With [A22]
    If n Then .Resize(n, 17) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 17) = "" 'RAZ en dessous
End With
End Sub
Elle se déclenche quand on active la feuille.

Tous les codes du plan sont listés sans doublon.

A+
 

Pièces jointes

Alors, voici la bonne formule :
VB:
=SIERREUR(INDEX($B$2:$B$8; EQUIV(0; NB.SI($K$1:K1; $B$2:$B$8); 0));"")
en K2 et tirée vers le bas
Merci, mais ça ne change rien. Le problème reste entier. 🙁

Lorsqu'il y a seulement deux codes différents dans la colonne "CODE DU PLAN", le Nom retourne une liste d'une seule ligne.
Au-delà de deux codes différents, il n'y a pas de problème, la liste est complète.
Sais-tu m'expliquer ce bug ?
 
Vois la capture ci-dessous, en colonne K il y a la formule du post #8 et en colonne M celle du post #3
Et en colonne B il n'y a pas que deux codes différents... 😅

Comme dit précédemment, le problème n'est pas au niveau de la liste calculée, mais au niveau de la liste déroulante qui ne contient qu'une seule ligne au lieu de deux.
À mon avis ça ne peut venir que de la formule du Nom qui définit la liste déroulante. Mais ladite formule me semble bonne, et d'ailleurs elle fonctionne pour une valeur unique et aussi pour toute valeur supérieure à 2. 🤯
 
Dernière édition:
Bonjour le forum,

Concernant mini plutôt qu'un scalaire il est plus logique - et plus sûr - d'utiliser une variable tableau :
VB:
Private Sub Worksheet_Activate()
Dim d As Object, tablo, resu(), mini(), i&, x$, n&, nn&, y$
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
With Sheets("Liste")
    tablo = .Range("A1:E" & .Range("B" & .Rows.Count).End(xlUp).Row)
End With
ReDim resu(1 To UBound(tablo), 1 To 17) 'A à Q
ReDim mini(1 To UBound(tablo)) 'tableau, plus logique
For i = 2 To UBound(tablo)
    x = tablo(i, 2)
    If x <> "" Then
        If Not d.exists(x) Then
            n = n + 1
            d(x) = n 'mémorise la ligne
            resu(n, 1) = x
            resu(n, 11) = "0"
            mini(n) = "ZZZ"
        End If
        nn = d(x): y = UCase(tablo(i, 4))
        If y < mini(nn) Then mini(nn) = y: resu(nn, 6) = tablo(i, 5): resu(nn, 17) = tablo(i, 3)
        If y >= resu(nn, 11) Then resu(nn, 11) = y: resu(nn, 13) = tablo(i, 5): resu(nn, 17) = tablo(i, 3)
    End If
Next i
'---restitution---
With [A22]
    If n Then .Resize(n, 17) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 17) = "" 'RAZ en dessous
End With
End Sub
Cela ne modifie pas la durée d'exécution.

A+
 

Pièces jointes

Moi têtu plus que toi !
Ok, alors je vais tenter une nouvelle fois.

Les formules dans la feuille semblent correctes :
- le dénombrement de valeurs différentes affiche le bon résultat,
- les premières lignes de la liste affiche bien les noms des codes différents. Les lignes suivantes sont inutiles donc peu importe ce qu'elles affichent.

En revanche, la liste déroulante ne contient qu'une seule ligne quand il y a exactement deux codes différents.

Mon idée est donc que la formule qui définit le Nom permettant de créer la liste déroulante est fausse. Mais je ne vois pas l'erreur, et je ne comprends pas pourquoi elle ne fonctionne pas pour deux valeurs mais fonctionne parfaitement pour une valeur ou pour toute valeur supérieure à deux.
 
Cependant, tout ceci m'amène à penser que le problème pourrait davantage venir de la formule en J1 plutôt que dans celle qui définit le NOM et c'est pourquoi je t'ai proposé une alternative pour la formule en J1. L'as-tu testée ?
Je ne sais si tu me fais une blague, mais je crois que nous allons cesser ici.

Bonne fin de journée à tous
🖖
 
Dernière édition:
Il était inutile de supprimer tes messages Gégé. 🙁

J'en déduis que tu es fâché (ce qui m'attriste) et que ce n'était donc pas une blague que tu me faisais.
J'essayais sincèrement de t'aider et effectivement ça m'a attristé. M'est avis que dans cette histoire on a eu beaucoup de mal à se comprendre, les aléas de la communication non verbale.
Pas grave, tu restes mon ami !
 
J'essayais sincèrement de t'aider
J'ai grandement apprécié les alternatives que tu m'as proposées, je les ai gardées, et t'en remercie.

Mais là où on ne s'est apparemment pas compris, c'est que je ne cherchais pas une méthode alternative, mais je cherchais seulement à savoir pourquoi ma méthode ne fonctionne pas quand il y a exactement deux codes différents (alors qu'elle fonctionne quand il y en a plus de deux).
 
je cherchais seulement à savoir pourquoi ma méthode ne fonctionne pas quand il y a exactement deux codes différents (alors qu'elle fonctionne quand il y en a plus de deux).
J'ai très bien compris ça mais, comme tu le sais, j'ai Office 365 et, dans cette version, la formule en J1 provoque une erreur (#DIV/0!) tant que la colonne n'est pas complètement remplie. Ne pouvant donc pas tester le fonctionnement de tes formules, je n'ai fait que chercher et proposer des alternatives se rapprochant le plus possible de ce que tu avais écrit.
 
je cherchais seulement à savoir pourquoi ma méthode ne fonctionne pas quand il y a exactement deux codes différents (alors qu'elle fonctionne quand il y en a plus de deux).
Et pour finir, si, dans ton fichier, je remplace la formule en J1 par le chiffre 2 (afin de contourner l'erreur), j'ai bien 2 valeurs dans la liste de validation (et non pas une seule). Les mystères des différentes versions d'Excel ?
 
je cherchais seulement à savoir pourquoi ma méthode ne fonctionne pas quand il y a exactement deux codes différents (alors qu'elle fonctionne quand il y en a plus de deux).
Question subsidiaire : quelle valeur obtiens-tu si tu calcules la formule
VB:
=NB.SI(t_Liste[CODE DU PLAN];t_Liste[CODE DU PLAN])
avec seulement deux valeurs dans la colonne 'CODE DU PLAN' ?
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
XL 2021 listbox
Réponses
18
Affichages
331
Retour