Esto es VBA, o una macro que puede ejecutar en su hoja. Debes golpear alt + F11 para abrir el indicador de Visual Basic para la aplicación, vaya a su libro de trabajo y right click - insert - module
y pegue este código allí. A continuación, puede ejecutar el módulo desde VBA presionando F5 . Esta macro se llama "prueba"
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
Esto se ejecutará a través de una hoja de cálculo ordenada y combinar filas consecutivas que coinciden con el cliente y el año y elimina la fila ahora vacía. La hoja de cálculo debe ordenarse de la forma en que la ha presentado, clientes y años ascendentes, Esta macro en particular no mirará más allá de las filas consecutivas .
Editar - es totalmente posible mi with statement
es completamente innecesario, pero no está haciendo daño a nadie ..
REVISADO 28/02/14
Alguien usó esta respuesta en otra. pregunta y cuando volví pensé que este VBA era pobre. Lo he rehecho
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
Revisado 05/04/16
Preguntó de nuevo ¿Cómo combinar valores de varias filas en una sola fila? Tener un módulo, pero necesita las variables explicando. y de nuevo, es bastante pobre.
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
Sin embargo, dependiendo del problema, podría ser mejor step -1
en un número de fila para que nada se salte.
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
Otra opción:
Special
- & gt;Blanks
- & gt;OK
=
prensa ↑ , entonces CTRL + ENTERSpecial
- & gt;Blanks
- & gt;OK
=IF(
prensa ← tipo=
prensa ← prensa ↓ tipo,
prensa ↓ tipo,0)
entonces CTRL + ENTERCopy
yPaste Special as Values
EDITAR:
Explicación: Estoy tratando de hacer uso de GoTo Blanks opción. Una vez que haya seleccionado los espacios en blanco, puede ingresar la misma fórmula para todas las celdas en blanco seleccionadas. Respecto a la pregunta de OP, los datos parecen tener consistente espacios en blanco, es decir:
Value A
los espacios en blanco de la columna tienen el mismoCustomerID
como en la fila anterior no en blanco. Del mismo modoValue B
los espacios en blanco de la columna tienen el mismoCustomerID
como debajo de la fila no en blanco.fuente
La forma más efectiva de hacer esto es volcar todos los datos en una Tabla de Pivote y soltar 'Cliente' en Etiquetas de Fila y luego continuar con las otras columnas. Puede colocar el 'Año' en el encabezado de la columna si desea ver el desglose por año
Las tablas dinámicas se pueden encontrar en Insertar en Excel 2010
fuente
Aquí hay pasos para crear una tabla separada con los datos condensados.
Customer
yYear
. Esto proporcionará el marco para la tabla condensada.En B2 (la primera entrada para
Value A
) introduzca la siguiente:=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))),"")
Ingrese la fórmula como una fórmula matricial presionando Ctrl + Cambio + Entrar .
Rellena la fórmula de la columna. Luego rellene para llenar el
Value B
columna también. Voila!Algunas notas:
1000000
s en la fórmula a algo mayor que su número de filas.fuente
Todo el mundo está utilizando una gran cantidad de código VBA o funciones complicadas para esto. Tengo un método que tarda un segundo en implementarse pero es mucho más comprensible y muy fácil de ajustar dependiendo de otras posibilidades.
En el ejemplo que has dado anteriormente, pega estas (4) funciones en las celdas, E2, F2, G2 y H2, respectivamente (las celdas de referencia de las funciones F y amp; G):
Arrastra estas fórmulas tan abajo como sea necesario. Genera una sola fila de datos cada vez que están presentes 2 filas, sin afectar las filas individuales. Pegue los valores especiales (para eliminar las fórmulas) de las columnas E-F-G-H en otro lugar y ordénelos por cliente para eliminar todas las filas adicionales.
fuente