Exclamation Besoin d'une fonction Excel du type regroupement

Bonjour à tous,

C'est mon premier post ici et j'avoue que j'espère vraiment avoir de l'aide car ça m'éviterai beaucoup de temps perdu

Dans le tableau ci-joint, il y a :

  • product_id = identifiant produit (col A)
  • categories_id_new = catégorie du produit correspondant (col C)

Le problème, un produit peut avoir plusieurs catégories. Donc un product_id peut être affiché plusieurs fois et avoir donc plusieurs categories_id_new.

Le résultat voulue : avoir en col F les product_id et en col G toutes les categories_id_new pour un produit par ligne ; séparées par une virgule, se serait un must !

Dans l'idée, ça donnerait un truc du genre (données réelles) :

{col F} product_id = 53

{col G} categories_ids = 54, 43 (peu importe l'ordre ici)

C'est pour un import sur une boutique et étant donné qu'il y a 2000 produits environ, ça serait bien utile voyez-vous

Je ne vous cache pas que je remercie d'avance tous ceux qui aideront à résoudre ce mystère

Merci donc.

Arnaud

Bonjour amerig et bienvenue sur le forum,

Une solution VBA dans le fichier suivant :

Il faut patienter un peu ça prend une vingtaine de secondes. L'algorithme est optimisable mais c'est un bon début.

Bonjour

Bonjour Vba-New

Ma solution (pas des plus rapides)

Bonjour banzai,

Tu t'es loupé, il n'y a ni fichier ni code

bonjour

un essai

11excla.zip (54.51 Ko)

cordialement

Bonjour

Merci Vba-new

Le fichier trop volumineux et j'ai zappé l'avertissement

Corrigé dans mon post précédent

Bonjour Tulipe_3

Pas le même résultat pour 417 (Qui a raison/tort ?)

J'étais aussi parti sur un dictionary, ça va beaucoup plus vite ! (environ 1 seconde)

Le problème banzai c'est que d'après le profil de notre ami amerig, il a excel 2011. Et excel 2011 est pour mac. Et mac ne gère pas le Dictionary me semble-t-il.

Le code que j'ai pondu avec des boucles en veux-tu en voilà :

Sub PdtParLigneDico()
    Dim temp, temp2, temp3
    Dim dico As Object
    Dim i As Long, j&

    Application.ScreenUpdating = False
    Range("f2:g" & Range("f" & Rows.Count).End(xlUp).Row).Resize(, 2).ClearContents
    Set dico = CreateObject("Scripting.Dictionary")
    temp = Range("a2:c" & Range("a" & Rows.Count).End(xlUp).Row)
    For i = LBound(temp) To UBound(temp)
        dico(temp(i, 1)) = temp(i, 1)
    Next i
    temp2 = dico.keys
    ReDim temp3(LBound(temp2) To UBound(temp2), 1 To 1)
    For i = LBound(temp2) To UBound(temp2)
        For j = LBound(temp) To UBound(temp)
            If temp(j, 1) = temp2(i) Then temp3(i, 1) = temp3(i, 1) & "," & temp(j, 3)
        Next j
    Next i
    For i = LBound(temp3) To UBound(temp3)
        temp3(i, 1) = Mid(temp3(i, 1), 2, Len(temp3(i, 1)) - 1)
    Next i
    [f2].Resize(UBound(temp2) + 1, 1) = temp2
    [g2].Resize(UBound(temp3) + 1, 1) = temp3
End Sub

Bonjour Tulipe, ta solution est-elle viable ? Car comment on fait pour les autres product id ?

bnojour vba -ew

et bien je verrai bien un eventuel systeme de listes en cascades pour acceder rapidement a la valeur desirée pour >3000valeurs ; ou alors une liste composée des 10valeurs approchantes superieures et inferiures;par rapport a une val saisie à l'estime;si je maitrisait vba : un user form dans lequel on saisi une fourchette pra exemple une fenetre sur le principe de nbcar qui ferai un premier tri ........

car pour 3000 valeurs ;il est vrai que sans "moteur de recherche " il faut une bonne memoire

cordialement

voila succintement ce que je vois (je n'ai fais que pour les 25 premieres lignes et sans correction du renvoi d'erreur)

9excla2.zip (22.00 Octets)

cordialement

Rechercher des sujets similaires à "exclamation besoin fonction type regroupement"