Mettre des données de plusieurs rangées sous une seule rangée

Bonjour,

je travaille aujourd'hui sur un fichier et je trouve que c'est très fastidieux

Ci-joint un exemple avec le même format que le fichier d'origine qui s'étale sur 1000 lignes et 600 colonnes

le fichier contient deux onglets: l'onglet des données à traiter et l'onglet du résultat qu'on veut obtenir

je cherche un macro qui me donne le résultat (onglet résultat du fichier) à partir du tableau de l'onglet (Données) du fichier.

pour arriver aux résultat voulu il faut tout d'abord: insérer deux colonnes vides qui deviendront : colonne F et G.. la F au départ deviendra donc la colonne H et G deviendra I.

Ensuite, il faut faire une boucle pour :

1- copier la rangée (A4,E20) et la coller en dessous d'elle-même (n-1) fois où n est le nombre de colonne (à partir de la colonne H jusquà la fin) divisé par 5.

2- couper le code client 1 (contenu de la cellule H1 (auparavant F1) et coller le sur la colonne F dans les lignes de 4 à 20 (rangéee (F4,F20)).

- couper le code client 2 (contenu de la cellule M1 (auparavant K1) et coller le sur la colonne F dans les lignes de dessous de la rangée précédente cà d (rangéee (F4,F20)). Ainsi il s'étale sur la rangée (F21,F37)

faire de même pour le client3,4,5.......

3- couper le nom du client 1 (contenu de la cellule H2 (auparavant F2) et coller le sur la colonne G dans les lignes de 4 à 20 (rangéee (G4,G20)).

- couper nom du client 2 (contenu de la cellule M2 (auparavant K2) et coller le sur la colonne G dans les lignes de dessous de la rangée précédente cà d (rangéee (G4,G20)). Ainsi il s'étale sur la rangée (G21,G37)

faire de même pour le client3,4,5.......

4-couper la rangée (M4,Q20) en dessous de (H4,L20) et la rangée (R4,V20) en dessous de la rangée (M4,Q20) et ainsi de suite jusqu'à la fin

j'ai ajouté un onglet "Données+Colonne F-G" dans le fichier pour illustrerce que je viens de dire. peut être comme ça sera plus claire.

Merci de m'aider car sans macro je resterai une semaine avec mon fichier .

18copie.xlsx (26.46 Ko)

Bonjour

Avec Excel 2016, tu devrais envisager d'utiliser Power Query qui est intégré à ton Excel.

Il sait faire ce que tu souhaites et même plus encore.

Bon courage.

Cordia5

Bonjour CORDIA5,

j'ai aucune idée laheureusement sur comment le faire avec powerquery mais j'ai entendu parlé qu'avec VBA C'est faisable.

par exemple, j'ai vu sur le net que pour mettre les données d'une colonne en dessous d'une autre, par exemple colonne B en doussous de colonne A) on peut procéder comme suit:

dlA=range("A" & rows.count).end(xlup).row
dlB=range("B" & rows.count).end(xlup).row
range("B1:B" & dlB).copy range("A" & dlA+1)

mais moi je veux mettre des rangées en dessous d'autres ...

Bonsoir kasper2004,

A tester, je n'ai pas formaté les 3 dernières colonnes lors de la restitution :

La restitution s'effectue sur une feuille nouvellement créée.

Option Explicit
Sub test()
Dim a, b(), i As Long, j As Long, n As Long
    a = Sheets("Données").Range("a3").CurrentRegion.Value
    ReDim b(1 To ((UBound(a, 1) - 3) * ((UBound(a, 2) - 5) / 5)) + 1, 1 To 12)
    n = 1
    b(n, 1) = a(3, 1): b(n, 2) = a(3, 2): b(n, 3) = a(3, 3)
    b(n, 4) = a(3, 4): b(n, 5) = a(3, 5): b(n, 6) = "Numéro Client"
    b(n, 7) = "Nom Client": b(n, 8) = a(3, 6): b(n, 9) = a(3, 7)
    b(n, 10) = a(3, 8): b(n, 11) = a(3, 9): b(n, 12) = a(3, 10)
    For j = 6 To UBound(a, 2) Step 5
        For i = 4 To UBound(a, 1)
            n = n + 1
            b(n, 1) = a(i, 1): b(n, 2) = a(i, 2)
            b(n, 3) = a(i, 3): b(n, 4) = a(i, 4)
            b(n, 5) = a(i, 5)
            b(n, 6) = a(1, j): b(n, 7) = a(2, j)
            b(n, 8) = a(i, j): b(n, 9) = a(i, j + 1)
            b(n, 10) = a(i, j + 2): b(n, 11) = a(i, j + 3)
            b(n, 12) = a(i, j + 4)
        Next
    Next
    Application.ScreenUpdating = False
    On Error Resume Next
    Application.DisplayAlerts = False
    Sheets("restitution").Delete
    Sheets.Add().Name = "restitution"
    On Error GoTo 0
    With Sheets("restitution").Range("a1")
        With .Resize(UBound(b, 1), UBound(b, 2))
            .Value = b
            .Font.Name = "calibri"
            .Font.Size = 10
            .BorderAround Weight:=xlThin
            .Borders(xlInsideVertical).Weight = xlThin
            .VerticalAlignment = xlCenter
            With .Rows(1)
                .BorderAround Weight:=xlThin
                .Interior.ColorIndex = 43
                .HorizontalAlignment = xlCenter
            End With
            .Columns.AutoFit
        End With
    End With
    Application.ScreenUpdating = True
End Sub

klin89

Bonsoir,

ci-jointe autre proposition

15exemple.xlsm (46.14 Ko)

Klin89 , thev

Vous êtes des génies! ça maaaaarche ....Merci infiniment! ca me permet de dormir tôt ce soir

Encore un gros merci et problème résolu

rebonjour tout le monde,

J'ai testé les deux solutions sur les données réelles. finalement c'est la solution de klin89 qui marche.

pour celle de Thev, pour les premiers clients ça marche super bien mais après la macro reprend certains clients et les mets dans la colonne des numéro de clients ce qui crée des lignes de plus ( presque 1488 lignes de plus sur un total de 5704) et des résultats érronés.

alors dans ce cas c'est très instructif de savoir d'où ça vient l'erreur dans la macro de Thev parce que au début c'est top et meme la fac¸on de conception est excellente mais il y a une erreur quelque part.

rebonjour tout le monde,

alors dans ce cas c'est très instructif de savoir d'où ça vient l'erreur dans la macro de Thev parce que au début c'est top et meme la fac¸on de conception est excellente mais il y a une erreur quelque part.

Ce le serait effectivement mais pour cela il me faudrait un extrait plus complet de votre fichier.

les données réelles concerne mon employeur et c'est confidentiel

En tous cas, j'ai au moins une solution.

Merci bcp Thev pour le suivi

Rechercher des sujets similaires à "mettre donnees rangees seule rangee"