Il s'agit de VBA ou d'une macro que vous pouvez exécuter sur votre feuille. Vous devez appuyer sur alt+ F11pour afficher l'invite Visual Basic pour Application, accédez à votre classeur right click - insert - module
et collez-y ce code. Vous pouvez ensuite exécuter le module à partir de VBA en appuyant sur F5. Cette macro est nommée "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
Cela passera par une feuille de calcul triée et combinera des 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 comme vous l'avez présentée, les clients et les années 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 cela ne fait de mal à personne ..
REVISITED 28/02/14
Quelqu'un a utilisé cette réponse dans une autre question et quand je suis revenu, je pensais que ce VBA était pauvre. Je l'ai refait -
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
Revisité le 05/04/16
Redemandé Comment combiner les valeurs de plusieurs lignes en une seule ligne? Avoir un module, mais besoin d'expliquer les variables et encore une fois, c'est assez pauvre.
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, selon le problème, il peut être préférable de step -1
saisir un numéro de ligne afin que rien ne soit ignoré.
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
La façon la plus efficace de le faire est de vider toutes les données dans un tableau croisé dynamique et de déposer «Client» dans les étiquettes de lignes, puis de suivre les autres colonnes. Vous pouvez déposer l '«Année» dans l'en-tête de la colonne si vous souhaitez voir la répartition par année
Les tableaux croisés dynamiques se trouvent sous Insérer dans Excel 2010
la source
Voici les étapes pour créer une table séparée avec les données condensées.
Customer
etYear
. Cela fournira le cadre du tableau condensé.Dans B2 (la première entrée pour
Value A
) entrez les informations suivantes:=IFERROR(INDEX(Sheet1!B$1:B$11,MIN(IF(Sheet1!$A$1:$A$11=$A2,IF(Sheet1!$D$1:$D$11=$D2,IF(Sheet1!B$1:B$11<>"",ROW(Sheet1!$A$1:$A$11),1000000),1000000),1000000))),"")
Entrez la formule sous forme de formule matricielle en appuyant sur Ctrl+ Shift+ Enter.
Remplissez la formule dans la colonne. Remplissez ensuite pour remplir également la
Value B
colonne. Voila!Quelques notes:
1000000
s de la formule en quelque chose de plus grand que votre nombre de lignes.la source
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):
Faites glisser ces formules aussi bas que nécessaire. Il génère une seule ligne de données chaque fois que 2 lignes sont présentes, laissant les lignes simples inchangées. Collez les valeurs spéciales (pour supprimer les formules) des colonnes EFGH ailleurs et triez-les par client pour supprimer toutes les lignes supplémentaires.
la source