Organisations de données

Bonjour, je suis nouveau dans ce forum, et en VBA aussi. J'ai un tableau "Référence" à faire évoluer en fonction de variations saisonnières. Avant je faisais tout à la main, mais depuis quelques temps je devient fainéant…
C'est surtout que je vois les autres avec des automatisme alors que je suis toujours au papier crayon !







Enfin, ma dernière programmation était en Turbo Pascal V6.0, donc ça date…



























Voici mon problème : (Voir fichier joint)














L'onglet "Référence" est rempli à partir de données issues d'un équipement fournissant un .CSV que je transforme afin d'obtenir le format adéquat. J'ai trouvé les formules sur ce site

Les onglets "Plan N " et "Plan N+1" sont remplis de données fournies par un collègue tel qu'actuellement rempli







J'aimerai déjà effectuer un tri afin de supprimer les doublons de la colonne B en conservant les différentes valeurs de la colonne C sans doublons à l'aide d'un bouton "Tri Plan N" par exemple

Exemple, ligne 17 à 19 devrait me retourner :X31785044H,42Hen colonne J,K,L par exemple






J'aurai besoin de ces données plus tard…












J'arrive à trier sur deux colonnes mais cela se complique pour concaténer la 3eme


























Je dois faire la même chose avec l'onglet "Plan N+1" mais si l'étape de dessus est franchie, je doit pouvoir me débrouiller tout seul !






















Ensuite,je souhaiterai créer un bouton pour comparer chaque cellule Xy (X2, X3, X4, Xy, X11, X12) de "Plan N" avec les cellules de sa colonne correspondante dans l'onglet "Référence" mais uniquement sur la colonne B
Si les deux valeurs sont identiques, alors on passe en vert la cellule dans l'onglet "Référence"
et dans l'onglet "Plan N"








Dans le même temps, la cellule de la colonne C de "Plan N" correspondante sera également copiée dans "Référence" dans sa cellule correspondante colonne Cf (colonne D, H, … jusqu’à AV de l'onglet "Référence")
Normalement toute les cellules B de "Plan N" devrait être verte











Idem avec "Plan N+1", sauf qu'on colorie la cellule en jaune (donc je devrait pouvoir le faire également) SAUF si la cellule est déjà en vert.





Dans ce cas, on passe la cellule en bleu et on ajoute la valeur de la cellule C correspondante dans Cf, sauf si déjà existant…
16aaa-demo.xlsx (41.32 Ko)























L'onglet "N & N+1" est le mélange des deux onglets "Plan N" et "Plan N+1", sans les doublons, je devrais pouvoir y arriver.























Voila pour commencer, je pense pouvoir me débrouiller après, car tout n'est pas fini à ce stade.

























Merci d'avance de votre aide…













Désolé pour la présentation, c'est vraiment pas top, j'essayerai de faire mieux la prochaine fois...

Hello,

Voici déjà pour la première partie (tri) , le reste j'ai pas compris

Merci Rag02700

effectivement cela répond à mon besoin, je cherche juste une amélioration pour supprimer les doublons dans une cellules : exemple cellule G20, un seul 44B me suffit, mais cela peut attendre, c'est de la mise en forme.

je posterais semaine prochaine pour expliquer mieux le reste de mes préoccupations et je vais essayer de comprendre ton code, c'est pas gagné !!!.

Encore merci à toi...

Bonjour à tous

Avec 365 la meilleure façon de traiter un csv est PowerQuery intégré à Excel

Bonjour,

il n'y a pas que le CSV à traiter, (j'arrive à le mettre en forme, cela me convient pour l'instant) j'ai deux autres fichiers xls, je voudrais surtout rester simple pour pouvoir modifier si besoin, même si normalement tout est figé.

et je préfère avancer pas à pas....

Merci aux différents contributeurs.

Hello,

ça pourra peut-être t'aider :

Sub TriDbls()
    Dim varArrTmp As Variant
    Dim objDico As Object
    Dim i&
    Dim rngData As Range
    Dim strConcat$, strKey$

    ' Tri du tableau sur 3 colonnes ##############
    Set rngData = ActiveSheet.Range("A1").CurrentRegion
    With ActiveSheet.Sort
        With .SortFields
            .Clear
            .Add Key:=Range("A1:A" & rngData.Rows.Count), SortOn:=xlSortOnValues, Order:=xlAscending
            .Add Key:=Range("B1:B" & rngData.Rows.Count), SortOn:=xlSortOnValues, Order:=xlAscending
            .Add Key:=Range("C1:C" & rngData.Rows.Count), SortOn:=xlSortOnValues, Order:=xlAscending
        End With
        .SetRange rngData
        .Header = xlNo
        .Apply
    End With
    Set rngData = Nothing
    '#################################

    'Ajoute la concatenation de la colonne A & B dans un dictionnaire (ex : X10 11570)
    Set objDico = CreateObject("Scripting.Dictionary")
    varArrTmp = ActiveSheet.Range("A1").CurrentRegion
    For i = LBound(varArrTmp) To UBound(varArrTmp)
        objDico(varArrTmp(i, 1) & varArrTmp(i, 2)) = objDico(varArrTmp(i, 1) & varArrTmp(i, 2)) + 1
    Next i
    '####################################################

    ' Ici on vient identifier les clefs (col A & col B) en doubles et celles uniques, puis on fait un traitement propre à chacune
    ligne = 1:    i = LBound(varArrTmp)
    ActiveSheet.Columns("E:G").ClearContents
    Do Until i > UBound(varArrTmp) ' Boucle de la premiere donnée à la derniere
        If objDico(varArrTmp(i, 1) & varArrTmp(i, 2)) > 1 Then ' Si  la clef est en double (>1) dans le dico
            strKey$ = varArrTmp(i, 1) & varArrTmp(i, 2) ' Garde la clef en mémoire
            strConcat$ = vbNullString ' Vide la concatenation de la colonne C (ex : 44b,45a,2ba ...)
            ' Comme mes données ont été triés précédemment, je sais que les doublons se suivent
            ' donc je boucle tant que j'ai la même clef et je viens creer ma concatenation du style => 44b,45a,2ba ...
            Do While varArrTmp(i, 1) & varArrTmp(i, 2) = strKey$
                strConcat$ = strConcat$ & varArrTmp(i, 3) & ","
                i = i + 1
                If i > UBound(varArrTmp) Then Exit Do
            Loop
            'Ici j'affiche le resultat dans la feuille
            ActiveSheet.Cells(ligne, "e") = varArrTmp(i - 1, 1)
            ActiveSheet.Cells(ligne, "f") = varArrTmp(i - 1, 2)
            ActiveSheet.Cells(ligne, "g") = strConcat$
        Else ' Si la clef est unique, alors on restitue la donnée tel quel
            ActiveSheet.Cells(ligne, "e") = varArrTmp(i, 1)
            ActiveSheet.Cells(ligne, "f") = varArrTmp(i, 2)
            ActiveSheet.Cells(ligne, "g") = varArrTmp(i, 3)
            i = i + 1
        End If
        ligne = ligne + 1
    Loop
    Set objDico = Nothing

End Sub

Bonjour à tous

Ceci peut aussi être obtenu simplement soit par 2 formules 365 soit par PowerQuery

image

et croisé avec Référence

Seules les couleurs ne sont pas du domaine des requêtes.

On peut lister les écarts ou les communs...

@ Rag02700

Donc c'est la que je devrait intervenir pour mettre une condition de ne pas concaténer la valeur si la précedente est identique ?

Cela veut dire qu'il faut également créer une valeur varArrTmp1 par exemple et comparer à varArrTmp ?

 Do While varArrTmp(i, 1) & varArrTmp(i, 2) = strKey$
                strConcat$ = strConcat$ & varArrTmp(i, 3) & ","
                i = i + 1

@ 78chris

dans l'exemple que tu donnes, il est impossible d'avoir X2 9490 44H, c'est une valeur que la machine n'acceptera pas...

Bonjour

Effectivement j'ai loupé la touche * et appuyé sur - dans la formule 365... ce qui ne donne pas du tout le même résultat

image

PowerQuery donne aussi

image

effectivement, c'est bien ce résultat que je cherche à obtenir dans un premier temps... mais je ne connais pas Power Query donc je vais essayer de continuer en VBA...

Hello ,

@wanamoo oui c'est bien à cet endroit qu'il faut le gérer.

Veux-tu essayer de le faire tout seul ou tu as besoin d'aide ?

bonjour à tous,

j'ai rajouté ça dans le code de Rag02700, ça marche nickel pour supprimer les doublons dans la colonne G

Loop
Set objDico = Nothing

'supprime les doublons de la colonne G
Dim Dico, c As Range
Set Dico = CreateObject("Scripting.Dictionary")
On Error Resume Next
For Each c In Range("G1", Range("G120").End(xlUp))
tablo = Split(c, ",")
For Each Item In tablo
Item = Application.Trim(Item)
Dico.Add Item, ""
Next Item
c = ""
For Each k In Dico.keys
c = c & ", " & k
Next
c = Left(Right(c, Len(c) - 2), Len(c) - 2)
For Each k In Dico.keys
Dico.Remove k
Next
Next c
' Fin supprime les doublons

End Sub

Bien joué ! +1 like

RE

effectivement, c'est bien ce résultat que je cherche à obtenir dans un premier temps... mais je ne connais pas Power Query donc je vais essayer de continuer en VBA...

Avec 365 tu as forcément importé le csv via PowerQuery à moins que tu ne l'ai ouvert, ce qui est fortement déconseillé...

J'ai proposé aussi des formules 2 formules suffisent par plan...

J'ai quand même fait avec PQ (cela pouvant intéresser d'autres que toi) et des MFC mais il est évident qu'on allègerait en partant de la source CSV...

image
7ref-x.xlsx (87.48 Ko)

@78chris

j'ai deux manière d'importer le CSV des machines : soit avec une seule ligne contenant tous les paramètres séparés par un ";" ou alors sans séparateur sur trois colonnes, c'est la deuxième méthode que j'ai choisi. J'ouvre le CSV, et je copie les données dans l'onglet référence manuellement (je verrait pour optimiser plus tard...), je fais cela pour les douze machines, et ensuite je les mets en forme avec un bouton. je sais pas faire sans ouvrir le fichier.

Merci pour ton fichier, mais je comprends pas tout ! je trouve pas de formule dedans...

J'ai calculé le fichier N & N+1 avec le créateur de macro, c'est pas optimisé mais ça marche. j'ai donc maintenant mes 3 fichiers et ma base j'ai plu qu'à organiser tout cela..., ça ira pour aujourd'hui !

RE

Ouvrir un CSV dans Excel expose à une transformation par excel à la sauce américaine qui fait perdre souvent les dates ou les nombres...

Copier/coller est une des pires solutions pour importer...

PowerQuery ne crée pas des formules ni de VBA mais des requêtes. Pour les voir il faut lancer l'éditeur (Données, Obtenir des données, Lancer PowerQuery)

L'onglet N & N+1 ne sert ici que pour les formules de MFC de l'onglet Référence2

Si tu tiens aux formules, sur 365 ceci suffit pour un plan avec la source mise sous forme de tableau nommé Plan_N pour le premier :
en E2

=UNIQUE(Plan_N[[Colonne1]:[Colonne2]])

en G2

=JOINDRE.TEXTE(", ";;TRIER(UNIQUE(FILTRE(Plan_N[Colonne3];(Plan_N[Colonne1]=E2)*(Plan_N[Colonne2]=F2);""))))

merci pour ces précisions, cela me dépasse un peu, je n'avais jamais utilisé excel comme cela.

Ma prochaine étape, comparer les cellules X2 de plan N et de plan N+1 avec les X2 de référence et ainsi de suite... Si cellule identique, couleur vert clair pour plan N et vert foncé pour plan N+1, et si pas de concordance, jaune clair dans plan N et jaune foncé dans plan N+1

Si vous avez des idées, je suis preneur...

RE

As-tu regardé l'onglet Référence2 ?

J'avais compris vert si plan N et jaune si plan N+1

(c'est ce qui est écrit dans ton classeur initial)

Par contre pour le bleu j'ai mal compris car je l'applique aux Cf

Le principe des MFC peut être repris sans passer par PowerQuery... mais pas le report des Cf

Ce pourquoi il serait plus simple et efficace de créer directement Référence2 à partir des CSV et des plans par requêtes

Rechercher des sujets similaires à "organisations donnees"