Extraction, suppression des doublons et tri

OK, je comprens mieux maintenant. Je teste.

Par contre, du coup, je diùentionne la tableau sur toute la colonne ou bien je lui donne une taille spécifique?

Encore merci pour l'aide que tu m'apporte

ça me permet d'apprendre beaucoup

Dimensionne à ce qui est juste nécessaire ! ou à ce que tu veux, mais c'est le programme qui prendra la main et redimensionnera à ce qui est nécessaire.
Bref, au départ ne mets rien ! Le programme s'en charge.
Ensuite, comme tu l'avais fait, un nom est défini avec une formule decaler

Re Hello,

Je bloque sur

For i = 2 To UBound(data)

J'ai une erreur

image

Et pour etre honnete, je ne vois pas comment la solutionner :-(. Désolé, mais comme la notion de dico est assez neuve et encore un peut obscur pour moi donc, je risque d'avoir encore beaucoup de question de ce type.

Merci par avance pour l'aide.

data est le tableau des données de base

ici j'ai formaté les données en tableau structuré et je ne prends que les 3 colonnes qui m'intéressent

Data = Sheets("Database").Range("Tableau1[[Company]:[Reference]]").Value

il faut donc qu'il y ait dans ton fichier

  • un onglet Database, sinon change le nom dans la formule
  • un tableau Tableau1, sinon change le nom dans la formule
  • des en-têtes dont Company et Reference

Hello

Merci pour ta réponse.

J'ai tout vérifié 3 fois et je ne trouve toujours pas l'erreur.

J'ai bien une feuille Database qui contient ma base de données et celle-ci est bien sous forme d'un tableau nommé Tableau1 avec des entêtes de colonne appelée Company et Reference avec entre les deux une colonne avec entêté Type.

Du coup, je ne vois pas pk ça marche pas.

Sur la feuille construction, comme évoqué précédemment (si j'ai bien compris ce que tu voulais dire), j'ai ajouté 3 tableaux appelés Tableau 2, Tableau 3 et Tableau 4 pour réceptionné les données des listes déroulantes.

J'ai repris les échanges qu'on avait eus et j'ai vérifié que je n’avais pas zappé un truc, mais tout me semble OK et pourtant ... :-(

Je te mets en pj mon fichier avec la macro normalement adapta a mon cas, mais qui ne marche pas et bloque toujours sur Ubound. Je suis sûr que c'est une erreur bête, mais je ne vois pas :-(

Pourquoi as-tu mis

Dim data As Range

data est un tableau de valeurs, pas un range

Le Tableau2 est dans construction, pas dans home

With Sheets("Home")
            If Not .ListObjects("Tableau2").DataBodyRange

et ceci est curieux ! tu effaces Tableau8 si Tableau2 n'est pas vide ...

If Not .ListObjects("Tableau2").DataBodyRange Is Nothing Then .ListObjects("Tableau8").DataBodyRange.Delete

idem pour ceci

        With Sheets("Home")
            If Not .ListObjects("Tableau3").DataBodyRange Is Nothing Then .ListObjects("Tableau9").DataBodyRange.Delete

...

        With Sheets("Home")
            If Not .ListObjects("Tableau3").DataBodyRange Is Nothing Then .ListObjects("Tableau10").DataBodyRange.Delete

ho oui, que d'erreur....

J'ai préféré t'indiquer les erreurs plutôt que de les corriger ... ce sera un gros investissement pour la suite pour toi.

Mais en cas de difficulté je peux intervenir quand tu veux !

Merci. C'est la bonne démarche, c'est comme ça que j'apprends, en me creusant la tête.

Voilà ce que ça donne.

Ça semble fonctionner sur le principe. Par contre ,il semblerait qu'il y ai des valeurs qui ne soient pas conservées lors de l'extraction. J'ai identifié le problème sur la liste des types de produit.

Par exemple, je sélectionne C2. Je devrais avoir T1, T1/T2 et T2. Là dans mon fichier, seul T1 et T1/T2 ressortent. Aurais-tu une piste pour expliquer cette étrangeté? J'aurais tendance a croire que cela se passe dans la macro QuickSort mais, la je crois que ça depasse encore mes compétences ;-)

Bonne soirée et encore merci

Non, quicksort fonctionne correctement, tu peux ajouter ceci pour contrôler une macro

    For i = 2 To UBound(data)
        If data(i, 1) = critere1 Then dico(data(i, 2)) = ""
    Next
    tbl = dico.keys
    QuickSort tbl
' ajout
Debug.Print "dico : "
Dim cle As Variant
For Each cle In dico.keys
Debug.Print cle
Next
Debug.Print "tbl trié : "
Dim ii
For ii = LBound(tbl) To UBound(tbl)
Debug.Print tbl(ii)
Next
' fin ajout

et tu obtiens biens les 3 termes

dico : 
T2
T1/T2
T1
tbl trié : 
T1
T1/T2
T2

c'est donc ensuite ...

Curieux, tu dois avoir une option base 0 quelque part ou par défaut

3 fois ceci

.Resize(UBound(tbl) + 1, 1)

au lieu de

.Resize(UBound(tbl), 1)

Salut à tous,

Ne serait-il pas plus judicieux de mettre simplement un Option Base 1 Steelson ?

J'ai évité de le faire au vu des autres macros ... et il y avait un petit attroupement !

Hello

ouiiiiiiiiii ça marche :-).

Non, quicksort fonctionne correctement, tu peux ajouter ceci pour contrôler une macro

Je ne voulais pas remettre en cause cette partie de la macro, pardon . C'est vrai que c'était bête de l'incriminer alors que sa fonction est de trier ...

Curieux, tu dois avoir une option base 0 quelque part ou par défaut

J'ai fait une recherche rapide, je n'en ai pas vu qui trainait.

J'ai évité de le faire au vu des autres macros ... et il y avait un petit attroupement !

cela dit, avec cette macro qui est en cours de mise en place, plusieur voir mêm la majorité des macro présente vont sauter...

Est ce qu'il vaut mieux du coup mettre une option base 1 du coup?

Bon maintenant, je m'attaque a l'adaptation de tout ça a mon fichier excel.

Il va surement y avoir des questions complémentaires car je vais poursuivre le developpement du fichier et je vais me heurter à d'autre problematique (c'est innévitable) mais il me semble que ce sujet spécifiquement est solutionner :-)

Encore merci pour l'aide car j'ai beaucoup progresser car a ça :-)

Après tout je peux proposer ceci en remplacement, cela s'adaptera à tous les cas (à tester quand même)

.Resize(UBound(tbl) - LBound(tbl) + 1, 1)

Je test ça desuite.

edit : a priori ça marche aussi :-) a voir a la longue. J'ai juste désactibver l'ancienne ligne comme ça si besoin, facile de revenir en arrière :-)

J'ai en fait encore 2 questions sur cette partie de code

La première :

Enfin, si on veut en faire une liste de validation, il y a 2 options, la première et la deuxième (of course)

on en fait un liste dans un onglet

Tbl = dico.keys

QuickSort Tbl

Range("A2").Resize(UBound(tbl), 1) = Application.Transpose(tbl)

ou bien on les colle directement dans la liste de validation
With Sheets("mafeuilledechou").Range("ici")

.Validation.Delete

.Validation.Add xlValidateList, Formula1:=Join(dico.keys, ",")

End With

mais si le nombre de caractères de la liste est trop important cela met une erreur notamment lors du rechargement du fichier

Quelle serait la limitation en termes de taille de liste pour l'option 2? Est un nombre de caractère? Un nombre de "ligne"?

Si j'ai bien compris, cela permet de s'affranchir de la feuille où l'on va "coller" le résultat de l'extraction et du tri dans un tableau et sur laquelle on s'appuie pour générer la liste ensuite (dans mon cas, la feuille construction avec ses 3 tableaux de récolte de données) en mettant directement dans la liste le résultat de l'extraction et du tri (chez moi sur la feuille Home, cellule C8, C10 et C12. est ce correct? Si c'est bien ça alors ça permettrait d'aller encore plus le système (si les contrainte évoqué ci-dessus ne sont pas trop contraignante ;-) ).

La deuxième (of course ;-) )

Je ne suis pas sur d'avoir pleinement compris cette expression

    For i = 2 To UBound(data)
        dico(data(i, 1)) = ""
    Next

C'est bien cette étape qui met la tableau data sous forme de dictionnaire, ici, seulement la colonne 1 du tableau data. SI c'est bien ça, je ne comprends pas pourquoi on met =""

Dans ma tête, je le traduis par ça, mais je dois faire erreur, car sinon, le dico serait vide. Du coup, je me dis que ça doit se comprendre autrement, mais je ne vois pas comment.

    For i = 2 To UBound(data)  'de i=2 à la fin du tableau data
        dico(data(i, 1)) = ""  'les valeurs de la colonne 1 du tableau data égale rien.
    Next

Merci par avance

Bastien

1ère question ... la limite est de 256 caractères, y compris les séparateurs, et je me suis déjà planté là-dessus, cela ne se voit pas sauf à la réouverture du fichier où excel demande à corriger.

2ème question :

    For i = 2 To UBound(data)
        dico(data(i, 1)) = ""
    Next

c'est un artifice,

  • c'est comme si tu créais un "vrai dictionnaire" de mots sans y mettre la définition, juste pour dire que le mot existe,
  • et si tu le redis une seconde fois, une troisième fois etc. le dictionnaire ne te dira pas "tu l'as déjà dit", il ne rajoutera pas le mot une seconde fois, une troisième fois etc.
  • et c'est comme cela que l'on a une liste de mots uniques (mais pas triés)

Question 1 : Ha oui ça limite. Je vais rester avec l'approche actuelle :-)

Question 2 : OK j'ai compris, merci :-)

Il reste un soucis chez toi lié à ta demande particulière : si tu cliques sur le second choix avant d'avoir choisi le premier cela va planter car il ne sont pas issus du tableau mais rajoutés.

Rechercher des sujets similaires à "extraction suppression doublons tri"