Para empezar la Automatización de Reportes con Macros en Excel, nos ayudara a hacer el trabajo de día a horas o incluso minutos, con ayuda de Visual Basic.
En este caso retomaremos el ejercicio anterior, pero en esta ocasión lo resolveremos con una MACRO
Una vez tengamos abierto nuestro archivo presionamos alt+F11 para acceder al editor de visual basic y nos aparecerá la Macro después presionamos alt+I+M para generar un nuevo módulo.
- Una ves este nuestro modulo activo pondremos Sub Master () este es el nombre de nuestra MACRO
- Dim fila As Double nos permite crear nuestro rango dinámico
- Dim rgfiltro As Range esta es una variable de tipo “RAGE”
- Sheets(“BD”).Select nos permite seleccionar nuestra hoja de BD desde aquí podremos modificar nuestra hoja.
- Presionamos Ctrl + barra espaciadora fila = Range("C1").End(xlDown).Row esto nos dará el control sobre todas las filas, ya si agregamos o quitamos filas nuestro rango lo reconocerá.
- Print fila
- Range("D1:F1").EntireColumn.Insert shift:=xlRight con esto agregamos 3 comlunmas hacia la derecha a partir de la columna D.
- Range("C1").EntireColumn.TextToColumns Destination:=Range("C1"), DataType:=xlFixedWidth, fieldInfo:=Array(Array(0, 1), Array(10, 1), Array(12,1)), TrailingMinusNumbers:=True :el nombre de todos estos argumentos nos permitirá separar el texto en columnas.
Depuración de la Base de Datos
Después de esto empezaremos depurar nuestra BD de la siguiente forma:
- Range("D1").EntireColumn.Delete Shift:=xlRight
- Range("D1").Value = "Descripción"
- Range("E1").Value = "Categoría"
- Range("E3").FormulaR1C1 = "=MID(RC(-1),1,SEARCH("" ""),RC(-1,2))"
- Range("E3").FormulaR1C1 = "=MID(RC(-1),1,SEARCH("" ""),RC(-1,2))"
- Range("A3").FormulaR1C1 = "=R(-1)C"
- Range("B3").FormulaR1C1 = "=R(-1)C"
- Set rgfiltro = Worksheets("BD").Range("A1:G" & fila)
With rgfiltro
Empezamos con los filtros y lo aremos columna por columna, con “Autofilter” nos ayudara a filtrar todas las celdas vacías celdas visibles
- .AutoFilter
- .AutoFilter field:=4, Criterial:="<>"
- Range("E3:E" & fila).SpecialCells(xlCellTypeVisible).FormulaR1C1 = Range("E3").FormulaR1C1
- .AutoFilter
- .AutoFilter field:=1, Criterial:=""
- Range("A3:A" & fila).SpecialCells(xlCellTypeVisible).FormulaR1C1 = Range("A3").FormulaR1C1
- .AutoFilter
- .AutoFilter field:=2, Criterial:=""
- Range("B3:B" & fila).SpecialCells(xlCellTypeVisible).FormulaR1C1 = Range("B3").FormulaR1C1
- .AutoFilter
Estas fórmulas se aplican (Autofilter) ya que son rangos dinámicos y así se repite el siclo para el auto filtro
Para que nuestra macro no marque ningún error copiaremos toda nuestra BD y la pegaremos como valores así al filtrar nuestra información nos marcara ningún error.
Finalmente vamos a re-definir nuestra variable de filas ya que nuestros filtros anularon las filas vacías de este modo tendremos depurada nuestra BD.
En este punto de la macro insertaremos la Tabla Dinámica en la cual se verán reflejados los valores de nuestra BD depurada.
- ActiveSheets.Name="TD"
- Set rgfiltro = Worksheets("BD"). Range("A1:G" & fila)
- Private rgTD As String
- Private rgCoincidir As String
- Sub Crear_TD(rgfiltro As Range)
- CutCopyMode = False
- Add
- Name = "TD"
- PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
- rgfiltro, Version:=6).CreatePivotTable TableDestination:= _
- Worksheets("TD").Range("A3"), TableName:="TD", DefaultVersion:=6
- Sheets("TD").Select
- Cells(3, 1).Select
- With ActiveSheet.PivotTables("td")
Ya por último llamamos nuestra TD para que se ejecute después de depurar la BD.
Llenado del Reporte
Ya en este punto vamos a insertar las fórmulas de BUSCARV, vamos a efectuar las sumas.
Sub INSERTAR_FORMULAS()
- Dim rgTD As String
- Dim rgCoincidir As String
- rgTD = "TD!R4C1:R46C12"
- rgCoincidir = "TD!R4C1:R4C12"
- Sheets("Report").Select
- Range("C4").Value = "Bieldo"
- Range("D4").Value = "Bieldo Jardin"
- Range("E4").Value = "Candado"
- Range("F4").Value = "desarmador"
- Range("G4").Value = "Linterna"
- Range("H4").Value = "Cincel"
- Range("I4").Value = "Cinta"
- Range("J4").Value = "Antena"
- Range("K4").Value = "Foco"
- Range("C4").Value = "Bieldo"
- Range("C5:K5, C10:K16, C12:K23, C28:K29, C34:K41, C46:K53, C58:K60, C65:K72").FormulaR1C1 = "=VLOOKUP(""*""&RC1&""*""," & rgTD & "MATCH(""*""&R4C&""*""," & rgCoincidir & ",0),0)"
- Range("C6:K6").FormulaR1C1 = "=R(-1)C"
- Range("C17:K17").FormulaR1C1 = "=SUM(R[-7]C:R[-1]C)"
- Range("C24:K24").FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)"
- Range("C30:K30").FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)"
- Range("C42:K42").FormulaR1C1 = "=SUM(R[-8]C:R[-1]C)"
- Range("C54:K54").FormulaR1C1 = "=SUM(R[-8]C:R[-1]C)"
- Range("C61:K61").FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)"
- Range("C73:K73").FormulaR1C1 = "=SUM(R[-8]C:R[-1]C)"
- Range("C75:K75").FormulaR1C1 = "=VLOOKUP(""*""&RC26&""*""," & rgTD & "MATCH(""*""&R4C&""*""," & rgCoincidir & ",0),0)"
- Range("C77:K77").FormulaR1C1 = "=R6C+R17C+R24C+R30C+R42C+R54C+R61C+R73C"
End Sub
Hasta este punto hemos hecho todas las sumas de nuestro reporte; de esta manera, el llenado de este se realza de forma automática ya que nuestra macro nos permite realizar lo de una forma más optima y eficaz.
Como siguiente paso agregaremos al ultimo vendedor y así nuestra comprobación quedara sin errores y nuestro reporte quedara lleno sin ninguna diferencia.
Para este paso agregaremos otra macro la cual nos ayudará para agregar un nuevo apartado el cual contendrá los datos del vendedor que falta para cuadrar nuestro reporte.
Sub INSERTAR_VENDEDOR()
- Range("A4:A7").EntireRow.Insert shift:=x1up
- Range("A8:A10").Copy
- Range("A4").PasteSpecial (xlPasteAll)
- Range("A5").Value = "111"
- Range("B5").Value = "HUMBERTO RAMIREZ JUAREZ"
- Range("B4").Value = "CIUDAD DE MEXICO"
- Range("C81:K81").FormulaR1C1 = Range("C81").FormulaR1C1 & "+R6C"
- Range("C83:K83").FormulaR1C1 = "=R81C=R79C"
Y finalmente correremos nuestro maco agregando nuestras variables para que el ejercicio se ejecute de manera correcta y completa.
Personalizar Cinta de Opciones
Por ultimo y no menos importante agregaremos nuestro botón de ejecución para la macro el cual nos permitirá correr nuestra macro desde el principio y cada vez que lo necesitemos.
Nos dirigimos a nuestra cinta de opciones para poder agregar nuestro boton de la macro.