¿Cómo combinar valores de varias filas en una sola fila en Excel?


10

Tengo un volcado de datos en Excel que consiste en datos anuales de clientes para dos valores diferentes. Los datos se proporcionaron con una fila separada por valor para cada año y cliente. Es decir. se parece a esto:

enter image description here

Estoy atascado con una fila para el Cliente 1 para el Valor A en 2009 y un fila separada para el Valor B para el mismo cliente en el mismo año.

En algunos casos, no hay un Valor A o un Valor B. En el ejemplo anterior, puede ver que el Cliente 1 no tiene un Valor B en 2011, por lo que no se generó una fila para eso. Y, aunque no está representado en el ejemplo, algunos clientes no tendrán datos para ninguno de los valores en un año (y, por lo tanto, no tendrán filas para ese cliente en ese año). En esa situación, carecer de una fila para ese cliente en ese año está bien.

Quiero poner esto en una hoja de trabajo donde hay una fila para ambos Valores por cada año y cliente. Es decir, quiero que los datos se vean así:

enter image description here

¿Cuál es la forma más efectiva de crear ese resultado?

Respuestas:


6

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

El guión funcionó muy bien, gracias!
Greg R.

2

Otra opción:

  1. Seleccione la Columna B, presione CTRL + G - & gt; Special - & gt; Blanks - & gt; OK
  2. Tipo = prensa , entonces CTRL + ENTER
  3. Seleccione la columna C, presione CTRL + G - & gt; Special - & gt; Blanks - & gt; OK
  4. Tipo =IF( prensa tipo = prensa prensa tipo , prensa tipo ,0) entonces CTRL + ENTER
  5. Seleccionar todos los datos y Copy y Paste Special as Values
  6. Eliminar duplicados.

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 mismo CustomerID como en la fila anterior no en blanco. Del mismo modo Value B los espacios en blanco de la columna tienen el mismo CustomerID como debajo de la fila no en blanco.


Hola zx8754. ¿Podría por favor agregar algunas explicaciones de cuál es la idea detrás de su solución?
nixda

Explicación de @nixda agregada, lo siento, pensé que los pasos eran lo suficientemente claros.
zx8754

0

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


Sin embargo, tendrá problemas con las celdas que no tienen valor en la columna B porque Excel no tendrá forma de saber que el valor en B2 y B3 están relacionados de alguna manera.
xXPhenom22Xx

Es cierto que tengo poca experiencia con las tablas dinámicas, pero no creo que las tablas dinámicas resuelvan el problema que tengo. Quiero los datos de todos los valores para un cliente en una fila por año para poder manipularlos (por ejemplo, crear una columna que agregue Valor A + Valor B), no solo cambiar la forma en que lo veo a través de una Tabla dinámica. Literalmente quiero que los datos se estructuren de manera diferente en la hoja de trabajo.
Greg R.

Sí, sería difícil a menos que siempre haya columnas alternas con datos faltantes como en el ejemplo. Si este no es el caso, entonces no hay una manera para que Excel logre lo que usted quiere, lógicamente.
xXPhenom22Xx

Greg: puede resolver el problema así: una vez que esté en la tabla dinámica en el formato que desee, cópielo de la tabla dinámica en otra ubicación (la misma hoja u otra) y luego podrá manipularlo de la manera que desee. , incluyendo la adición de columnas, fórmulas, etc.
yosh m

0

Aquí hay pasos para crear una tabla separada con los datos condensados.

  1. Copie toda la tabla y péguela en una hoja nueva.
  2. Seleccione su nueva tabla y Eliminar duplicados (cinta de datos - & gt; Eliminar duplicados) en las columnas Customer y Year. Esto proporcionará el marco para la tabla condensada.
  3. 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 .

  4. Rellena la fórmula de la columna. Luego rellene para llenar el Value B columna también. Voila!

Algunas notas:

  • Por supuesto, deberá ajustar las direcciones para que se ajusten a sus datos. Para referencia, Hoja1 son los datos originales en las columnas A a D.
  • Supongo que sus datos (o encabezados) comienzan en la fila 1. Esto probablemente sea cierto si se trata de un volcado de datos. La fórmula tendrá que ser ajustada si este no es el caso.
  • Supongo que su tabla tiene menos de un millón de filas. Si de alguna manera tienes más que eso, cambia el 1000000 s en la fórmula a algo mayor que su número de filas.
  • Si su tabla tiene muchos miles de filas (100,000+), puede considerar usar una solución de VBA, ya que las fórmulas de matriz se pueden atascar con matrices grandes.

0

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):

=IF(D2=D3, A2,         IF(D2<>D1, A2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, B2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, IF(C2=0,"",C2),""))    
=IF(D2=D3, D2,         IF(D2<>D1, D2,            ""))

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.