Mise en forme d'une extraction par macro

Bonjour à vous,

Voilà après multiple tentative pour réaliser ma macro, je bute sur cette macro et à la fin ça devient n’importe quoi. Donc je viens à vous expert du Excel pour me donner un coup de main et aussi apprendre de nouvelle chose 😊

Concernant le sujet : Je réalise souvent une extraction SAP, cependant les données ne sont pas exploitables telles quelles, il faut réordonner les données sous forme de tableau (suppression des lignes vides, réalignement des données, remise en forme des titres…)

Dans le Excel en pièce jointe, vous avez 2 onglets.

L’onglet 1 : « Extraction SAP 05112020 »

De la ligne 1 à 9 et les colonnes A à Z garde toujours la même typologie et ne change pas. De la lignes 10 à 12 qu’on peut considérer comme un bloc fonctionnement toujours de le même façons, la ligne commence par le « N° » / « Crée le » / « Crée a » / « Numéro client » … , les lignes suivants corresponds au code/produit (1 ligne pour chaque produit) et puis un espace pour le bloc suivant. Ce document est un exemple et une particule infime de mon extraction cependant l’extraction fini toujours par « Total ».

L’onglet 2 : « Mise en forme »

onglet 2

L’onglet 2 est la mise en forme que j’essaye d’avoir en utilisant la macro. Pour chaque produit d’un bloc je reprendre la 1er ligne du bloc pour mettre tous les infos dans 1 seul ligne (N°, Code, Crée le, Code produit, etc …). La colonne E est les 3 premières lettre du code produit.

Je vous remercie par avance de l’aide 😊

Salut Xavee,

Dans tout chaos informatique, il y a souvent une logique : le tout est de vérifier dans ton cas que ce chaos est permanent dans le temps !
Essaye sur d'autres extractions et raconte-nous cela !

Un double-clic sur la feuille 'Extraction SAP' démarre la macro.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tTab, tExtract(), tCol(14), iRow1%, iRow2%, iCol1%, iCol2%, iIdx%
'
Cancel = True
iRow1 = Cells.Find(what:="N°", lookat:=xlWhole, LookIn:=xlValues).Row
iCol1 = Cells.Find(what:="N°", lookat:=xlWhole, LookIn:=xlValues).Column
iRow2 = Cells.Find(what:="Total", lookat:=xlWhole, LookIn:=xlValues).Row
iCol2 = Cells.Find(what:="OT", lookat:=xlWhole, LookIn:=xlValues).Column
'
tTab = Range("A10").Resize(iRow2 - 10, iCol2 - iCol1).Value
For x = 1 To 13
    tCol(x) = Range("A1").Resize(9, x * 3).Find(what:=Choose(x, "N°", "code", "Créé le", "Code produit", "Code produit", "L'article", "Quantité", "Désignation Itinéraire", "livré", "Raison sociale", "Divi", "postal", "Localité de    livraison"), lookat:=xlWhole, LookIn:=xlValues).Column
Next
'
iIdx = 1
ReDim Preserve tExtract(13, 1)
For x = 1 To UBound(tTab, 1)
    If tTab(x, tCol(1)) <> "" Then
        iIdx = iIdx + 1
        ReDim Preserve tExtract(13, iIdx)
        For y = 1 To 13
            If iIdx = 2 Then tExtract(y - 1, 0) = _
                Choose(y, "N°", "Code", "Créé le", "Code produit", "Code SAP", "Intitulé de l'article", "Quantité", _
                "Désignation itinéraire", "Code client", "Raison sociale", "Division", "Code postal", "Localité de livraison")
            tExtract(y - 1, iIdx - 1) = tTab(x + Choose(y, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0), tCol(y))
            If y = 5 Then tExtract(y - 1, iIdx - 1) = Left(tExtract(y - 2, iIdx - 1), 3)
        Next
    End If
Next
With Worksheets("Mise en forme")
    .Cells.Delete
    .[A1].Resize(iIdx, 13).Value = WorksheetFunction.Transpose(tExtract)
    .Columns.AutoFit
    .Columns("A:M").HorizontalAlignment = xlHAlignLeft
    .Range("A1:M1").Interior.Color = RGB(255, 190, 0)
    .[A1].Resize(iIdx, 13).Borders.LineStyle = xlContinuous
    .[A1].Resize(iIdx, 13).BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
    .Activate
End With
'
End Sub
18xaveesap.xlsm (30.87 Ko)


A+

Avant tout je souhaite vous remercier pour l’aide que vous m’avez apporté et désolé si ma macro était un chaos permanent 😊, j’ai encore beaucoup de progrès à faire.

Concernant la macro, c’est exactement ce que j’essayai de faire à la différence que je souhaitai retrouver l’ensemble des produits (ligne 1 , 2 , 3….).

J’ai fait un petit schéma pour expliquer ma demande (un dessin et toujours meilleurs qu’un long roman 😊 )

Extraction : Reprendre les donner la ligne 1 et le copier sur les lignes inférieurs (produit). Les lignes inférieurs (produit) est la contenance du colis (N°), on peut avoir 1 à 1000 produits ou plus je ne connais pas la limite.

photo1

Mise en forme : Résulta final

photo2

Désolé si je n’avais pas été suffisamment précis sur la typologie du problème et ma demande.

J’aurais aussi 2 petites questions sur la macro pour parfaire ma compréhension 😊

For x = 1 To 13 tCol(x) = Range("A1").Resize(9, x * 3).Find(what:=Choose(x, "N°", "code", "Créé le", "Code produit", "Code produit", "L'article", "Quantité", "Désignation Itinéraire", "livré", "Raison sociale", "Divi", "postal", "Localité de livraison"), lookat:=xlWhole, LookIn:=xlValues).Column Next 

Pourquoi mettre 2 fois « code produit », pour la colonne "code SAP" ?

Merci encore pour votre aide

Salut Xavee,

ce n'est pas ton code que je désignais par "chaos" mais le résultat de l'extraction !

Une boucle supplémentaire plus tard...

iIdx = 1
For x = 1 To UBound(tTab, 1)
    If tTab(x, tCol(1)) <> "" Then
        For y = x + 1 To UBound(tTab, 1)
            If tTab(y, tCol(2)) <> "" Then
                iIdx = iIdx + 1
                ReDim Preserve tExtract(13, iIdx)
                For Z = 1 To 13
                    If iIdx = 2 Then tExtract(Z - 1, 0) = _
                        Choose(Z, "N°", "Code", "Créé le", "Code produit", "Code SAP", "Intitulé de l'article", "Quantité", _
                        "Désignation itinéraire", "Code client", "Raison sociale", "Division", "Code postal", "Localité de livraison")
                    tExtract(Z - 1, iIdx - 1) = tTab(Choose(Z, x, y, x, y, x, y, y, x, x, x, y, x, x), tCol(Z))
                    If Z = 5 Then tExtract(Z - 1, iIdx - 1) = Left(tExtract(Z - 2, iIdx - 1), 3)
                Next
            Else
                Exit For
            End If
        Next
    End If
Next

Pourquoi 2X "Code produit" ? Pour respecter facilement ma boucle d'initialisation de tCol() : il n'y a pas de colonne SAP dans l'extraction.

14xavee-sap.xlsm (25.83 Ko)


A+

Merci beaucoup curulis57 pour le temps que tu as consacrer pour m'aider, la macro marche parfaitement, je n'aurais pas fait mieux

Apres étude de ta macro, je remarque que je me suis super compliqué la vie. Je connais pas trop la fonction tab, au boulot pour me former dessus

Salut Xavee,

tab n'est pas une fonction Excel mais une variable Tableau dans laquelle je "capture" la zone de ta feuille dont je calcule l'étendue avec iRow2, iCol1 et iCol2.
En fonction du nombre de lignes à traiter, la différence de vitesse est significative.

Bonne étude, camarade ! Ça vaut la peine !


A+

Rechercher des sujets similaires à "mise forme extraction macro"