2012-02-28 22:05:49 +0000 2012-02-28 22:05:49 +0000
10
10

Comment combiner les valeurs de plusieurs lignes en une seule ligne dans Excel ?

J'ai un fichier Excel qui contient des données annuelles sur les clients pour deux valeurs différentes. Les données ont été fournies avec une ligne séparée pour la valeur de chaque année et de chaque client. C'est-à-dire que cela ressemble à ceci :

Je suis coincé avec une ligne pour le client 1 pour la valeur A en 2009 et une ligne séparée pour la valeur B pour le même client dans la même année.

Dans certains cas, il n'y a pas de Valeur A ou de Valeur B. Dans l'exemple ci-dessus, vous pouvez voir que le Client 1 n'a pas de Valeur B en 2011, donc aucune ligne n'a été générée pour cela. Et, bien que non représentés dans l'exemple, certains clients n'auront aucune donnée pour l'une ou l'autre valeur dans une année (et donc aucune ligne pour ce client dans cette année). Dans ce cas, il n'y a pas de ligne pour ce client cette année-là.

Je veux mettre cela dans une feuille de calcul où il y a une ligne pour les deux valeurs pour chaque année et chaque client. C'est-à-dire que je veux que les données ressemblent à ceci :

Quel est le moyen le plus efficace de créer ce résultat ?

Réponses (5)

6
6
6
2012-02-29 12:18:49 +0000

Il s'agit de VBA, ou d'une macro que vous pouvez exécuter sur votre feuille. Vous devez appuyer sur alt+F11 pour faire apparaître l'invite Visual Basic for Application, allez dans votre classeur et right click - insert - module et collez ce code dedans. Vous pouvez ensuite exécuter le module à partir de VBA en appuyant sur F5. Cette macro s'appelle “test”

Sub test()
'define variables
Dim RowNum as long, LastRow As long
'turn off screen updating
Application.ScreenUpdating = False
'start below titles and make full selection of data
RowNum = 2
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
Range("A2", Cells(LastRow, 4)).Select
'For loop for all rows in selection with cells
For Each Row In Selection
    With Cells
    'if customer name matches
    If Cells(RowNum, 1) = Cells(RowNum + 1, 1) Then
        'and if customer year matches
        If Cells(RowNum, 4) = Cells(RowNum + 1, 4) Then
            'move attribute 2 up next to attribute 1 and delete empty line
            Cells(RowNum + 1, 3).Copy Destination:=Cells(RowNum, 3)
            Rows(RowNum + 1).EntireRow.Delete
        End If
     End If
    End With
'increase rownum for next test
RowNum = RowNum + 1
Next Row
'turn on screen updating
Application.ScreenUpdating = True

End Sub

Cette macro sera exécutée dans une feuille de calcul triée et combinera les lignes consécutives qui correspondent à la fois au client et à l'année et supprimera la ligne maintenant vide. La feuille de calcul doit être triée de la manière dont vous l'avez présentée, clients et années en ordre croissant, cette macro particulière ne regardera pas au-delà des lignes consécutives.

Edit - il est tout à fait possible que mon with statement soit complètement inutile, mais il ne fait de mal à personne..

REVISITED 02/28/14

Quelqu'un a utilisé cette réponse dans une autre question et quand j'y suis retourné, je trouvais cette VBA pauvre. Je l'ai refaite -

Sub CombineRowsRevisited()

Dim c As Range
Dim i As Integer

For Each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
If c = c.Offset(1) And c.Offset(,4) = c.Offset(1,4) Then
            c.Offset(,3) = c.Offset(1,3)
            c.Offset(1).EntireRow.Delete
End If

Next

End Sub

Réexaminée le 16/04/05

Demandée à nouveau Comment combiner les valeurs de plusieurs lignes en une seule ligne ? Avoir un module, mais avoir besoin des variables expliquant et encore, c'est assez médiocre.

Sub CombineRowsRevisitedAgain()
    Dim myCell As Range
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    For Each myCell In Range(Cells("A2"), Cells(lastRow, 1))
        If (myCell = myCell.Offset(1)) And (myCell.Offset(0, 4) = myCell.Offset(1, 4)) Then
            myCell.Offset(0, 3) = myCell.Offset(1, 3)
            myCell.Offset(1).EntireRow.Delete
        End If
    Next
End Sub

Cependant, en fonction du problème, il peut être préférable de mettre step -1 sur un numéro de ligne pour que rien ne soit sauté.

Sub CombineRowsRevisitedStep()
    Dim currentRow As Long
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For currentRow = lastRow To 2 Step -1
        If Cells(currentRow, 1) = Cells(currentRow - 1, 1) And _
        Cells(currentRow, 4) = Cells(currentRow - 1, 4) Then
            Cells(currentRow - 1, 3) = Cells(currentRow, 3)
            Rows(currentRow).EntireRow.Delete
        End If
    Next

End Sub
2
2
2
2013-07-17 18:08:36 +0000

Une autre option :

  1. sélectionnez la colonne B, appuyez sur CTRL+G -> Special-> Blanks -> OK
  2. Tapez = appuyez sur ↑, puis sur CTRL+ENTER
  3. Sélectionnez la colonne C, appuyez sur CTRL+G -> Special-> Blanks -> OK
  4. Tapez =IF( appuyez sur ← tapez = appuyez sur ← tapez ↓ tapez , appuyez sur ↓ tapez ,0) puis CTRL+ENTER
  5. Sélectionnez toutes les données et Copy et Paste Special as Values
  6. Supprimez les doublons.

EDIT:

Explication: J'essaie d'utiliser l'option GoTo Blanks . Une fois que vous avez sélectionné des blancs, vous pouvez entrer la même formule pour toutes les cellules blanches sélectionnées. En ce qui concerne la question de l'OP, les données semblent avoir des blancs consistants, c'est-à-dire que les blancs de la colonne Value A ont le même CustomerID que la ligne non blanche ci-dessus. De la même manière, les blancs de la colonne Value B ont le même CustomerID qu'en dessous de la ligne non vierge.

0
0
0
2012-02-29 18:12:36 +0000

Voici les étapes à suivre pour créer un tableau séparé avec les données condensées.

  1. copiez votre tableau complet et collez-le sur une nouvelle feuille.
  2. Sélectionnez votre nouveau tableau et supprimez les doublons (ruban de données -> Supprimer les doublons) sur les colonnes Customer et Year. Cela fournira le cadre du tableau condensé.
  3. Dans B2 (la première entrée pour Value A), entrez ce qui suit :

  4. Remplissez la formule en bas de la colonne. Ensuite, remplissez la colonne Value B également. Voilà !

Quelques notes :

  • Vous devrez bien sûr ajuster les adresses en fonction de vos données. À titre de référence, la feuille 1 est constituée des données originales des colonnes A à D.
  • Je suppose que vos données (ou en-têtes) commencent à la rangée 1. C'est probablement vrai s'il s'agit d'un transfert de données. La formule devra être ajustée si ce n'est pas le cas.
  • Je suppose que votre tableau compte moins d'un million de lignes. Si vous en avez plus, modifiez les 1000000 dans la formule pour qu'elle soit supérieure à votre nombre de lignes.
  • Si votre tableau compte plusieurs milliers de lignes (100 000+), vous pouvez envisager d'utiliser une solution VBA à la place, car les formules de tableaux peuvent s'enliser dans de grands tableaux.
0
0
0
2016-07-15 16:44:30 +0000

Tout le monde utilise beaucoup de code VBA ou des fonctions compliquées pour cela. J'ai une méthode qui prend une seconde à mettre en œuvre mais qui est beaucoup plus compréhensible et très facile à ajuster en fonction de diverses autres possibilités.

Dans l'exemple que vous avez donné ci-dessus, collez ces (4) fonctions dans les cellules E2, F2, G2 et H2, respectivement (les fonctions F&G font référence aux cellules ci-dessus) :

=IF(D2=D3, A2, IF(D2<>D1, A2, ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, B2, ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, IF(C2=0,"",C2),""))    
=IF(D2=D3, D2, IF(D2<>D1, D2, ""))

Faites glisser ces formules aussi loin que nécessaire. Il génère une seule ligne de données chaque fois que 2 lignes sont présentes, laissant les lignes individuelles non affectées. Collez spécialement les valeurs (pour supprimer les formules) des colonnes E-F-G-H ailleurs et triez-les par client pour supprimer toutes les lignes supplémentaires.

0
0
0
2012-02-28 22:15:04 +0000

La façon la plus efficace de procéder est de transférer toutes les données dans un tableau croisé dynamique et de placer le terme “client” dans les étiquettes des rangées, puis de faire le suivi avec les autres colonnes. Vous pouvez insérer l’“Année” dans l'en-tête de la colonne si vous souhaitez voir la ventilation par année

Les tableaux croisés dynamiques se trouvent sous Insérer dans Excel 2010