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.