Microsoft 365 Réorganiser les données selon la clé

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,

J'ai une question : est-ce qu'il existe un algorithme VBA simple pour réorganiser ce genre de données ou bien il faut passer par ADODB ?

Input :
1669591240682.png


Output :
1669591253169.png


Merci pour votre aide !
 

Pièces jointes

  • 1669591017997.png
    1669591017997.png
    10.2 KB · Affichages: 12
  • 1669591046065.png
    1669591046065.png
    5.8 KB · Affichages: 13
  • 1669591164846.png
    1669591164846.png
    9.7 KB · Affichages: 10
  • 1669591176945.png
    1669591176945.png
    5.6 KB · Affichages: 9
  • 1669591202389.png
    1669591202389.png
    10 KB · Affichages: 10

cp4

XLDnaute Barbatruc
Bonjour,

En adaptant à ton exemple ce code du regretté Jacques Boisgontier, à tester en supposant que ton tableau commence en A1.
VB:
Option Explicit

Sub fusion()
   Dim d1 As Object, a, b, c, n As Integer, m As Integer, i As Integer, p As Integer
   Set d1 = CreateObject("Scripting.Dictionary")
   With ActiveSheet
      a = .Range("A1:B" & .Range("A" & Rows.Count).End(xlUp).Row)
      b = .Range("C1:D" & .Range("A" & Rows.Count).End(xlUp).Row)
      n = UBound(a) + UBound(b)
      ReDim c(1 To n, 1 To 3)
      m = 0
      For i = LBound(a) To UBound(a)
         If Not d1.exists(a(i, 1)) Then m = m + 1: d1(a(i, 1)) = m: p = m Else p = d1(a(i, 1))
         c(p, 1) = a(i, 1): c(p, 2) = a(i, 2)
      Next i
      For i = LBound(b) To UBound(b)
         If Not d1.exists(b(i, 1)) Then m = m + 1: d1(b(i, 1)) = m: p = m Else p = d1(b(i, 1))
         c(p, 1) = b(i, 1): c(p, 3) = b(i, 2)
      Next i
      .[G1].CurrentRegion.ClearContents
      .[G1].Resize(d1.Count, UBound(c, 2)) = c
   End With
End Sub
Bonne journée.
 
Dernière édition:

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,

En adaptant à ton exemple ce code du regretté Jacques Boisgontier, à tester en supposant que ton tableau commence en A1.
VB:
Option Explicit

Sub fusion()
   Dim d1 As Object, a, b, c, n As Integer, m As Integer, i As Integer, p As Integer
   Set d1 = CreateObject("Scripting.Dictionary")
   With ActiveSheet
      a = .Range("A1:B" & .Range("A" & Rows.Count).End(xlUp).Row)
      b = .Range("C1:D" & .Range("A" & Rows.Count).End(xlUp).Row)
      n = UBound(a) + UBound(b)
      ReDim c(1 To n, 1 To 3)
      m = 0
      For i = LBound(a) To UBound(a)
         If Not d1.exists(a(i, 1)) Then m = m + 1: d1(a(i, 1)) = m: p = m Else p = d1(a(i, 1))
         c(p, 1) = a(i, 1): c(p, 2) = a(i, 2)
      Next i
      For i = LBound(b) To UBound(b)
         If Not d1.exists(b(i, 1)) Then m = m + 1: d1(b(i, 1)) = m: p = m Else p = d1(b(i, 1))
         c(p, 1) = b(i, 1): c(p, 3) = b(i, 2)
      Next i
      .[G1].CurrentRegion.ClearContents
      .[G1].Resize(d1.Count, UBound(c, 2)) = c
   End With
End Sub
Bonne journée.
Merci, malheureusement, le code ne donne pas le résultat attendu.

Voici le résultat du code :
1669634632249.png

Mon input est :
1669634651473.png

Mon output attendu :
1669634681404.png


J'ai joint le fichier avec le code.

Bonne journée !
 

Pièces jointes

  • Fusion.xlsx
    9 KB · Affichages: 4

cp4

XLDnaute Barbatruc
Merci, malheureusement, le code ne donne pas le résultat attendu.

Voici le résultat du code :
Regarde la pièce jointe 1156618
Mon input est :
Regarde la pièce jointe 1156619
Mon output attendu :
Regarde la pièce jointe 1156620

J'ai joint le fichier avec le code.

Bonne journée !
@VBA_dev_Anne_Marie : Sans fichier, vous vous attendiez à un miracle. Il fallait joindre votre fichier.
Le code fusionne 2 Arrays, il vous suffit d'adapter les plages.
J'ai fait un fichier par rapport aux images éditées dans le message initial et ça fonctionne bien.
 

Pièces jointes

  • VBA_dev_Anne_Marie - Copie.xlsm
    16.3 KB · Affichages: 6

VBA_dev_Anne_Marie

XLDnaute Occasionnel
@VBA_dev_Anne_Marie : Sans fichier, vous vous attendiez à un miracle. Il fallait joindre votre fichier.
Le code fusionne 2 Arrays, il vous suffit d'adapter les plages.
J'ai fait un fichier par rapport aux images éditées dans le message initial et ça fonctionne bien.
Etrange, je copie-colle le code, mais il ne marche pas chez moi :

1669647882410.png


Le fichier est ci joint.
 

Pièces jointes

  • Fichier_AM.xlsm
    17.4 KB · Affichages: 3

cp4

XLDnaute Barbatruc
Etrange, je copie-colle le code, mais il ne marche pas chez moi :

Regarde la pièce jointe 1156665

Le fichier est ci joint.
Le résultat est bon, le code fonctionne parfaitement.
Évidemment, le rendu n'est pas bon vu que tu n'adaptes pas à ton cas.
En effet, tes données commencent en A4 et B4. Je t'avais bien dit au post#3 ==> à supposer que ton tableau commence en A1.
VB:
a = .Range("A1:B" & .Range("A" & Rows.Count).End(xlUp).Row)' Remplace A1 par A4'
b = .Range("C1:D" & .Range("A" & Rows.Count).End(xlUp).Row)' Remplace C1 par C4'
A+
 

dysorthographie

XLDnaute Accro
il y avait des erreur que J'ai corrigé!

1669676569498.png



VB:
Sub test()
Dim Code1 As Object: Set Code1 = CreateObject("Scripting.Dictionary") 'Ici j'instenci une collection
'Un Dictionary comporte Un Clé {Key} et une Valeur
'Code1.exists("TOTO") retourn true si TOTO existe dans la collection
'Code1.Add "TOTO",10 ajoute la clé TOTO a la collection avec la valeur 10
'MsgBox  Code1("TOTO") afichie un le message 10!
Dim L As Integer, Out As Range
Set Out = ThisWorkbook.Sheets("Feuil1").Range("F1") 'ici Je mémorise la première célulle de mon table de sorti

'jesuprime tout ce sui ce trouve en desous de la     barre de tire, en rouge,de mon tableau de sortie!
With Out.CurrentRegion
If .Cells.Rows.Count > 1 Then Range(.Range("A2"), .Cells(.Cells.Rows.Count, "C")).Delete
End With

With ThisWorkbook.Sheets("Feuil1").Range("A1").CurrentRegion 'je memorise mon tableau d'entré en jaune
For i = 2 To .Rows.Count 'je parcour mon tableau d'entré de la ligne 2 à la dernière
If Trim(.Cells(i, "A").Value) <> "" Then 'notes que dans une plage la première celulle est toujour A1 Range("C10").range("A1")="TOTO"
'Code1 sauvegarde la ligne ou serra sauvegardé les code P048A se fera à la ligne 2 te tableau de sortie en rose
If Not Code1.exists(.Cells(i, "A").Value) Then Code1.Add .Cells(i, "A").Value, Out.CurrentRegion.Rows.Count + 1
Out.Cells(Code1(.Cells(i, "A").Value), "A") = .Cells(i, "A") 'en  Out.Cells(Code1("P048A"), "A")="P048A" par exemple
Out.Cells(Code1(.Cells(i, "A").Value), "B") = .Cells(i, "B") 'en  Out.Cells(Code1("P048A"), "B")="1" par exemple
End If
If Trim(.Cells(i, "C").Value) <> "" Then
If Not Code1.exists(.Cells(i, "C").Value) Then Code1.Add .Cells(i, "C").Value, Out.CurrentRegion.Rows.Count + 1 'P048D Par Exemple
Out.Cells(Code1(.Cells(i, "C").Value), "A") = .Cells(i, "C") 'en  Out.Cells(Code1("P048A"), "A")="P048A" par exemple
Out.Cells(Code1(.Cells(i, "C").Value), "C") = .Cells(i, "D") 'en  Out.Cells(Code1("P048A"), CA")="2" par exemple
End If

Next
End With
End Sub
 

Pièces jointes

  • InOut (1).xlsm
    26.4 KB · Affichages: 3

Discussions similaires

Réponses
13
Affichages
318

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 183
dernier inscrit
karelhu35