Excel - Una macro para combinar filas seleccionadas

Problema

Tengo datos de origen en Excel con este aspecto:

CustomerID SalesMonth SalesAmount

 12345 enero 150 12345 marzo 100 12345 abril 200 56789 enero 800 56789 10 de mayo 78945 20 de noviembre 44444 enero 1000 ... 

La combinación de CustomerID y SalesMonth es única.

Y me gustaría combinar los datos de origen en una pestaña diferente de Excel en una forma como esta:

CustomerID 1stMonth 1stMonth 2ndMonth 2ndMonth 3rdMonth 3rdMount

 12345 enero 150 marzo 100 abril 200 56789 enero 800 mayo 10 78945 20 de noviembre 44444 enero 1000 

En total, puede haber hasta 10 meses diferentes para un cliente (algunos tienen solo 1 o 2). Es importante que no haya 'brechas' en ninguna de las filas de salida, por ejemplo, si un cliente solo tiene ventas en noviembre, entonces la celda '1stMonth' debería leer 'Nov' para ese cliente.

Solución

Pruebe esta macro y vea la hoja 2 (copie los datos en la hoja 1 a la hoja 3 como precaución de seguridad)

 Subprueba () Atenuar cliente como rango, ddata () Como rango, custodia Como rango, cunq Como rango, filt Como rango Dim dest Como rango, j Todo el tiempo, k Tan largo con hojas de trabajo ("hoja 1") Establecer cliente = Rango ( .Range ("A1"), .Range ("A1"). End (xlDown)) Establecer custunq = .Range ("A1"). End (xlDown) .Offset (5, 0) customer.AdvancedFilter xlFilterCopy,, custunq, True Set custunq = Rango (custunq.Offset (1, 0), custunq.End (xlDown)) Para cada custunq In custunq .Range ("A1"). CurrentRegion.AutoFilter field: = 1, Criteria1: = custunq.Value Establezca filt = .Range ("A1"). CurrentRegion.Offset (1, 0) .Resize (Rows.Count - 1, Columns.Count). _ SpecialCells (xlCellTypeVisible) j = WorksheetFunction.CountA (filt.Columns (1)) 'MsgBox j ReDim ddata (1 To j) Con hojas de trabajo ("sheet2") Establecer dest = .Cells (Rows.Count, "A"). Fin (xlUp) .Offset (1, 0) dest = filt (1, 1) Fin con For k = 1 To j Establecer ddata (k) = .Range (filt (k, 2), filt (k, 3)) ddata (k) .Copia con las hojas de trabajo ("hoja2") .Células (dest.Row, Columns.Count) .End (xlToLeft) .Offset (0, 1) .PasteSpecial End With Next k .Range ("A1"). CurrentRegion.AutoFilter Next custunq Range (.Range ("a1"). End (xlDown) .Offset (1, 0), .Cells (Rows.Count, "A"). End (xlUp)). EntireRow.Delete End With End Sub Sub deshacer () Hojas de trabajo ("sheet2"). Cells.Clear End Sub 

Gracias a Venkat1926 por este consejo.

Artículo Anterior Artículo Siguiente

Los Mejores Consejos