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