Réorganiser une base de donnée

Bonjour à tous,

Je dispose d'une base de donnée comprenant toute une liste d'informations : Compte, Nom client, date d'ouverture, rôle sur le compte, raison d'ouverture....

Etant donnée que plusieurs personnes se touvent sur un compte avec différents rôles, cela me crée donc plusieurs lignes pour un seul et même numéro de compte.

Mon objectif final est d'avoir une seule ligne par compte et d'ajouter des colonnes pour les informations nom client, date d'ouverture etc... le nombre de ligne par compte peut varier de 1 a 10.

Vous trouverez ci-joint un fichier avec 2 onglets, le premier étant la situation de base et le second l'objectif que je souhaite atteindre.

Merci d'avance et bonne et heureuse année en avance.

17base-client.xls (12.50 Ko)

Bonjour,

Il manque des critéres de sélection.

exp : pourquoi Michael Chaise est rangé dans nom2 ?

Un exemple de tri par tcd

Bonjour,

Merci pour la réponse.

En quoi manque t il des critères de sélection ?

Il est dans nom2 car il serait la 2eme personne associé sur le compte.

En gros j'aimerais que pour chaque compte, il y est une seule et unique ligne dans Excel.

Si plusieurs personnes sont présente sur un compte, je préfère créer de nouvelles colonnes.

Est-il possible de faire ça à travers VBA ? J'ai plusieurs milliers de ligne malheureusement.

Merci pour votre temps.

Bonjour,

Essaie ainsi :

Sub ReorgComptes()
    Dim d As Object, k, cpt, n%, i%, j%
    Set d = CreateObject("Scripting.Dictionary")
    With Worksheets("Base")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To n
            k = .Cells(i, 1)
            For j = 2 To 5
                cpt = cpt & ";" & .Cells(i, j).Value2
            Next j
            If d.exists(k) Then
                cpt = d(k) & cpt: d(k) = cpt
            Else
                d(k) = cpt
            End If
            cpt = ""
        Next i
    End With
    n = 1
    With Worksheets("Objectif")
        For Each k In d.keys
            cpt = Split(d(k), ";"): cpt(0) = k
            n = n + 1: .Range("A" & n).Resize(, UBound(cpt) + 1).Value = cpt
            For i = 3 To UBound(cpt) Step 4
                .Cells(n, i) = Val(.Cells(n, i))
            Next i
        Next k
        .Activate
    End With
End Sub

Codialement et bonne fin d'année.

Salut Djidji, bonne fin d'année.

Bonjour le fil

Un poil différent :

Restitution en Feuil1

Option Explicit
Sub Regroupement()
Dim a, i As Long, j As Long, n As Long, col As Byte, w()
    a = Sheets("Base").Cells(1).CurrentRegion.Value
    n = 1: col = UBound(a, 2)
    For j = 1 To col
        a(n, j) = a(n, j) & "_1"
    Next
    With CreateObject("Scripting.Dictionary")
        For i = 2 To UBound(a, 1)
            If Not .exists(a(i, 1)) Then
                n = n + 1: .Item(a(i, 1)) = VBA.Array(n, col)
                For j = 1 To col
                    a(n, j) = a(i, j)
                Next
            Else
                w = .Item(a(i, 1)): w(1) = w(1) + col
                If UBound(a, 2) < w(1) Then
                    ReDim Preserve a(1 To UBound(a, 1), 1 To w(1))
                End If
                For j = 1 To col
                    a(w(0), w(1) - col + j) = a(i, j)
                Next
                .Item(a(i, 1)) = w
            End If
        Next
    End With
    'restitution et mise en forme
    Application.ScreenUpdating = False
    With Sheets("Feuil1").Cells(1)
        .CurrentRegion.Clear
        With .Resize(n, UBound(a, 2))
            .Value = a
            .Font.Name = "calibri"
            .Font.Size = 10
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .Borders(xlInsideVertical).Weight = xlThin
            .BorderAround Weight:=xlThin
            With .Rows(1)
                .Font.Size = 11
                .Interior.ColorIndex = 44
                .BorderAround Weight:=xlThin
            End With
            If UBound(a, 2) > 5 Then
                With .Resize(1, 5)
                    .AutoFill .Resize(, UBound(a, 2))
                End With
            End If
             .Columns.AutoFit
        End With
        .Parent.Activate
    End With
    Application.ScreenUpdating = True
End Sub

Bonne fin d'année à tous

klin89

Bonsoir à tous,

J'ai enfin pu mettre la main sur un ordinateur et testé les macros ! Vos deux macros fonctionne parfaitement.

Je vais choisir la 2ème car avec les tests que j'ai effectué, elle est dynamique si d'autres colonnes devaient se rajouter.

Merci pour votre travail et excellent début d'année !

Rechercher des sujets similaires à "reorganiser base donnee"