VBA - Passer d'un tableau 1-n à un tableau 1-1

neal

XLDnaute Junior
Bonjour,
Dans mon fichier exemple, vous trouverez dans l’onglet BDD, les données brutes que je cherche à modéliser autrement.
Dans la première colonne, il n’y a qu’un seul code (mon client livré). Dans la deuxième colonne, il y a de 1 à n codes, séparés par des « ; ». Ces codes sont liés au code de la première colonne : ce sont mes possibilités de clients à facturer pour l’unique client livré.
A partir de ces données, je dois créer un tableau « Recap », un peu comme le tableau dans BDD, mais avec une seule ligne par client facturé.

Par exemple :
Mon client livré C000226 a 2 clients facturés possibles.
Dans BDD, j’ai une seule ligne avec [C000226 // C0001311;C0001312].
Dans Recap, je dois obtenir deux lignes. La première [C000226 // C0001311], la deuxième [C000226 // C0001312]

J’ai mis cet exemple dans le fichier en pièce jointe.

Comment faire pour automatiser cette opération très répétitive. J’ai plus de 3000 lignes dans ma vraie BDD, je ne me vois pas tout faire à la main et perdre 1 semaine :/

Merci d’avance pour votre aide !!!
 

Pièces jointes

  • Fichier exemple ED.xlsx
    15.6 KB · Affichages: 67
Dernière édition:

neal

XLDnaute Junior
Re : VBA - Passer d'un tableau 1-n à un tableau 1-1

Super !!!
Merci beaucoup, sincèrement, tu me sauves là !!!
Bizarrement je ne peux pas accéder à ton code. Est ce fais exprès?
Parce que je m'autoforme sous VBA, et je savais créer le tableau si et seulement si j'avais toujours le même nombre de codes dans la deuxième colonne de la BDD, pas quand j'avais un nombre de codes allant de 1 à n. Et J'aurais bien aimé savoir comment tu as fait :)
 

kingfadhel

XLDnaute Impliqué
Re : VBA - Passer d'un tableau 1-n à un tableau 1-1

Salut tout le monde,

Voila j'ai trouvé une solution avec macro.
Testée.

Sélectionne la feuille BDD, Click sur le bouton Recuperer et laisse lui un bout du temps (20s) pour l'extraction.

Bonne réception et bon après midi.
 

Pièces jointes

  • Fichier exemple ED Resolu.xlsm
    25 KB · Affichages: 51

Hervé

XLDnaute Barbatruc
Re : VBA - Passer d'un tableau 1-n à un tableau 1-1

re

tu dois pouvoir acceder au code sans souci normalement.

sinon, ci dessous le code commenté

j'utilise la fonction split pour découper la chaine de la colonne 2

t=split(cells(i,2),";")

la fonction contraire de split est join, fort utile pour concaténer des chaines rapidement

exemple :

Code:
Dim t As String
Dim tablo

t = "toto/nini/tutu"
tablo = Split(t, "/") 'on sépare t
For i = 0 To UBound(tablo) 'on boucle sur chaque item
MsgBox tablo(i) 'on controle
Next i

t = Join(tablo, "/") 'on reconstitue la chaine
MsgBox t 'on controle

le code de la macro de ton fichier :

Code:
Private Sub CommandButton1_Click()
Dim l As Integer, i As Integer, j As Integer
Dim t

l = 1 'incrementation des lignes de réception
For i = 1 To Sheets("BDD").Range("a65536").End(xlUp).Row 'on parcourt la colonne A de la BDD
    t = Split(Sheets("BDD").Cells(i, 2), ";") 'on crée un tableau avec les éléments de la colonne B
    For j = 0 To UBound(t) 'on parcourt les éléments
        l = l + 1
        Cells(l, 1) = Sheets("BDD").Cells(i, 1) 'on renvoi le premier item
        Cells(l, 2) = t(j) 'on renvoi chaque item du tableau
    Next j
Next i
End Sub

edit : salut king:)
 

Hervé

XLDnaute Barbatruc
Re : VBA - Passer d'un tableau 1-n à un tableau 1-1

re

c'est les select qui ralentissent ton code

king, si je peux me permettre quelques conseils :

Sub SeparerChaine()
Dim MonSplit, i, j, k As Integer = seulement K est déclaré, i et j seront en variant

cmpt1 = Range("B" & Rows.Count).End(xlUp).Row=cmpt1 n'est pas déclaré
For j = 1 To cmpt1
MonSplit = Split(ActiveSheet.Range("B" & j).Value, Chr(59))
k = 1
For i = LBound(MonSplit) To UBound(MonSplit)=lbound inutile un tableau variant démarre toujours en 0 sauf si tu as déclaré tes codes en option base 1 (ce qui est rare)
Sheets("Recap").Select=évite les select, ca ralentit méchament les routines, préfère lui les with qui accelere les codes en ne créant qu'une instance d'objet
with Sheets("Recap")
k = .Range("a" & Rows.Count).End(xlUp).Row
.Range("b" & k + 1).Value = MonSplit(i)
.Range("a" & k + 1).Value = Sheets("BDD").Range("A" & j)
end with

a plus
 

kingfadhel

XLDnaute Impliqué
Re : VBA - Passer d'un tableau 1-n à un tableau 1-1

Re

Voila le code avec les conseils de Hervé, c'est beaucoup plus rapide que la première version avec le select et tout
Encore merci Hervé.


Code:
Sub SeparerChaine()

Dim MonSplit, cmpt1, k As Integer
cmpt1 = Range("B" & Rows.Count).End(xlUp).Row
For j = 1 To cmpt1
MonSplit = Split(ActiveSheet.Range("B" & j).Value, Chr(59))
k = 1
For i = 0 To UBound(MonSplit)
With Sheets("FF")
k = .Range("a" & Rows.Count).End(xlUp).Row
.Range("b" & k + 1).Value = MonSplit(i)
.Range("a" & k + 1).Value = Sheets("BDD").Range("A" & j)
End With
Next
Next
End Sub

[\CODE]
 

Discussions similaires

Réponses
3
Affichages
290

Statistiques des forums

Discussions
312 174
Messages
2 085 951
Membres
103 058
dernier inscrit
florentLP