Questo è VBA o una macro che puoi eseguire sul tuo foglio. È necessario premere alt+ F11per visualizzare il prompt di Visual Basic, andare alla cartella di lavoro right click - insert - module
e incollare questo codice. È quindi possibile eseguire il modulo dall'interno di VBA premendo F5. Questa macro è denominata "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
Questo verrà eseguito attraverso un foglio di calcolo ordinato e combinerà righe consecutive che corrispondono sia al cliente che all'anno ed eliminerà la riga ora vuota. Il foglio di calcolo deve essere ordinato nel modo in cui lo hai presentato, clienti e anni in ordine crescente, questa particolare macro non avrà un aspetto oltre le righe consecutive .
Modifica - è del tutto possibile che il mio with statement
sia completamente inutile, ma non fa male a nessuno ..
RIVISITATO 28/02/14
Qualcuno ha usato questa risposta in un'altra domanda e quando sono tornato ho pensato che questo VBA fosse scarso. L'ho rifatto -
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
Rivisitato il 05/04/16
Chiesto di nuovo Come combinare i valori di più righe in una singola riga? Avere un modulo, ma hanno bisogno delle spiegazioni delle variabili e, di nuovo, è piuttosto scadente.
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
Tuttavia, a seconda del problema, potrebbe essere meglio step -1
su un numero di riga, quindi nulla viene ignorato.
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