Hola a todos!
Llevo recibidas ya varias consultas sobre el tema de los duplicados y su tratamiento a la hora de agrupar informaciones. Esto es un tema recurrente y que dependiendo del escenario en el que trabajemos puede ser más o menos sencillo.
Por ejemplo, en muchos casos lo podemos solucionar con una tabla dinámica, en otros casos con una macro que elimine duplicados y componer luego el resto de informaciones con otras rutinas, etc.
En el ejemplo de hoy (muy básico) os mostraré una forma que se adapta bien a la hora de trabajar con procesos programados y no utiliza las tablas dinámicas (evitando así el tener luego que tratar con formatos y restricciones típicas de las tablas).
Vamos al ejemplo, imaginad que tenéis el resumen de facturación de tres de vuestros empleados. Los datos son por persona, mes e importe:
Y lo que deseamos es obtener únicamente la suma acumulada por vendedor, es decir:
Y claro, la opción más rápida es hacer una tabla dinámica y listo. Pero imaginemos que queremos un proceso programado, por ejemplo para obtener unos datos que luego analizaremos o transformaremos en rutinas posteriores, en ese caso la tabla dinámica, (aunque se puede programar) no sería la mejor opción.
Para ello, os propongo utilizar ADO con una consulta muy sencilla de SQL que nos hará todo el trabajo.
La consulta sería esta:
obSQL = "SELECT [FACTURACION$].[VENDEDOR], SUM ([FACTURACION$].[IMPORTE]) AS FACTURACION_ANUAL " & _
"FROM [FACTURACION$] GROUP BY [FACTURACION$].[VENDEDOR] "
Donde, como ya sabéis de post anteriores, [FACTURACION$]
es el nombre de la hoja (siempre con $ al final) y [VENDEDOR]
hace referencia al campo de nuestra tabla.
Esta es la macro completa:
Option Explicit
Sub AGRUPAR_SUMA()
'DECLARAMOS VARIABLES
Dim Dataread As ADODB.Recordset, obSQL As String
Dim cnn As ADODB.Connection, MiLibro As String
Dim i As Long, titulo As String
'ESCRIBIMOS CONSULTA SQL DE AGRUPACIÓN Y SUMA
obSQL = "SELECT [FACTURACION$].[VENDEDOR], SUM ([FACTURACION$].[IMPORTE]) AS FACTURACION_ANUAL " & _
"FROM [FACTURACION$] GROUP BY [FACTURACION$].[VENDEDOR] "
'Guardamos el nombre del libro activo para utilizarlo en la conexión ADO
MiLibro = ActiveWorkbook.Name
'Iniciamos la conexión ADO
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "DATA SOURCE=" & Application.ActiveWorkbook.Path + "\" & MiLibro
.Properties("Extended Properties") = "Excel 8.0"
.Open
End With
'Procedemos a grabar los datos de la consulta en un RS
Set Dataread = New ADODB.Recordset
With Dataread
.Source = obSQL
.ActiveConnection = cnn
.CursorLocation = adUseClient
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
With Worksheets("RESUMEN_ANUAL")
.Select
'Pasamos los datos a la hoja RESUMEN_ANUAL
.Cells(2, 1).CopyFromRecordset Dataread
'Creamos encabezados
For i = 0 To Dataread.Fields.Count - 1
titulo = Dataread.Fields(i).Name
.Cells(1, i + 1) = titulo
Next
End With
'Liberamos y cerramos variables
Dataread.Close: Set Dataread = Nothing
cnn.Close: Set cnn = Nothing
End Sub
Dado que estamos trabajando con ADO, Os recuerdo que es necesario marcar la referencia Microsoft ActiveX Data Object 2.8 Library (o la que corresponda) para que todos los componentes funcionen correctamente.
Trabajar con esta metodología hará nuestros procesos mucho más eficientes.
Descarga el archivo de ejemplo pulsando en: CONSULTA SQL DE AGRUPACIÓN Y SUMA CON ADO
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies