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