XL 2016 Séquencer les données d'une ligne sur plusieurs en fonction des valeurs de cellule de la ligne

Ashgal

XLDnaute Nouveau
Bonjour à toutes et tous,

Je me retrouve face à un dilemme... et j'ai besoin d'aide.

J'ai une extraction d'un logiciel qui me sors un fichier Excel qui comporte des transactions à la ligne par "Bon de travaux".
Cependant, sur un "Bon" je peux avoir plusieurs type de prestations "Transport" "Taxe" et "Container"

Exemple basic :

N° BonDateClientMatièreRemarquesTvaMontant BonCout transportCout TaxeCout Container
2000101/04/2019123123Verre7.7%1751005025
2000202/04/2019123124Alu7.7%4251502750

Pour l'importation dans mon logiciel comptable, j'ai besoin d'une ligne par prestation.... forcement sinon ça ne serait pas drôle...

il me faudrait donc un format comme cela :

N° BonDateClientMatièreRemarquesTvaMontant BonType de coutCout
2000101/04/2019123123Verre7.7%175Transport100
2000101/04/2019123123Verre7.7%175Taxe50
2000101/04/2019123123Verre7.7%175Container25
2000202/04/2019123124Alu7.7%425Transport150
2000202/04/2019123124Alu7.7%425Taxe275

Je ne demande pas qu'on fasse tout à ma place mais plutot à comprendre comment je peux dire à Excel "Incremente moi une ligne avec les infos de la précédente, tant qu'il y a un montant dans les colonne 8,9,10 et mets les moi dans une meme colonne.

Par avance, je vous remercie infiniment du temps que vous pourriez passer sur mon problème.

Bien Cordialement.
 

job75

XLDnaute Barbatruc
Bon pour mettre les résultats dans une 2ème feuille, clic droit sur l'onglet, Visualisez le code et collez-y cette macro :
VB:
Private Sub Worksheet_Activate()
Dim tablo, resu(), i&, j%, n&, k%
tablo = Sheets("Bons").[A1].CurrentRegion.Resize(, 10) 'à adapter
ReDim resu(1 To 3 * UBound(tablo), 1 To 8)
For i = 2 To UBound(tablo)
    For j = 8 To 10
        If Val(Replace(tablo(i, j), ",", ".")) Then
            n = n + 1
            For k = 1 To 7
                resu(n, k) = tablo(i, k)
            Next
            resu(n, 8) = tablo(i, j)
        End If
Next j, i
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A2] 'à adapter
    If n Then .Resize(n, 8) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 8).ClearContents 'RAZ en dessous
End With
With UsedRange: End With 'actualise la barre de défilement verticale
End Sub
Elle est très rapide car elle utilise des tableaux VBA.

A+
 

Pièces jointes

  • Classeur(1).xlsm
    22.9 KB · Affichages: 5

Ashgal

XLDnaute Nouveau
Je viens de tester, je suis impressionné par la simplicité d'action et la vitesse d’exécution.

Même pas de bouton à cliquer....

Je vais essayer d'adapter le code à mon tableau réel.
Si je galère, je reviendrais vous voir.

Merci mille fois en tout cas.
 
Haut Bas