Copiar celdas según filtro seleccionado

expert@s!

Quiero crear una macro para representar gráficos en un user form a partir de unos datos. Esa parte ya la tengo y funciona perfectamente, lo que necesito es copiar los datos de una hoja (Base de Datos), a la hoja en la que está la tabla dinámica con el gráfico correspondiente. Esta BD tiene muchísimos datos y me gustaría copiar sólo los necesarios, es decir, si aplico filtro desde el UserForm seleccionando "Año", "Mes", "Artículo", "Vendedor" que sólo se me copien los datos del filtro a la tabla para representar, si copiara todos los datos y luego se aplicaran filtros, la macro tardaría bastante en finalizar la tarea.

Espero haberme explicado lo suficiente y que me puedan ayudar.

2 Respuestas

Respuesta
1

Debes copiar solo las celdas visibles es decir las filtradas con specialcells, mira este ejemplo

https://youtu.be/nPSFAZ8TvrQ

Respuesta
1

Se me ocurren 2 opciones:

Opción 1 - Filtrar en la propia BBDD

Dim filtroanno, filtromes, filtroarticulo, filtrovendedor, nombrebbdd, ultimafila, hojatd As String

' Estableces los valores teniendo en cuenta que son textbox donde incluyes las variables de búsqueda en el UserForm (cambia los nombres por los correctos)
filtroanno = TextboxAnno.Value
filtromes = TextboxMes.Value
filtroarticulo = TextboxArticulo.Value
filtrovendedor = TextboxVendedor.Value
nombrebbdd = "aquí pones el nombre de la hoja donde está la BBDD"
hojatd = "aquí pones el nombre de la hoja donde están los datos para generar el gráfico"
'Teniendo en cuenta 4 columnas con las 4 variables: Año, Mes, Artículo y Vendedor

Sheets(nombrebbdd).Select
Range("A2").Select

'Estableces la última fila de la BBDD
ultimafila = Sheets(nombrebbdd).Cells(Rows.Count, "A").End(xlUp).Row
'Filtras en la propia BBDD

Selection.AutoFilter
ActiveSheet.Range("$A$1:$D$" & ultimafila).AutoFilter Field:=1, Criteria1:=filtroanno
ActiveSheet.Range("$A$1:$D$" & ultimafila).AutoFilter Field:=2, Criteria1:=filtromes
ActiveSheet.Range("$A$1:$D$" & ultimafila).AutoFilter Field:=3, Criteria1:=filtroarticulo
ActiveSheet.Range("$A$1:$D$" & ultimafila).AutoFilter Field:=4, Criteria1:=filtrovendedor
'Estableces la última fila de la BBDD Filtrada
ultimafila = Sheets(nombrebbdd).Cells(Rows.Count, "A").End(xlUp).Row

'Copias los datos filtrados
Range("$A$1:$D$" & ultimafila).Copy

'Quitas el filtro
Selection.AutoFilter
'Accedes a la hoja donde tienes los datos del gráfico
Sheets(hojatd).Select
'Si los encabezados empiezan en la celda A1
Range("A2").Select
Selection.Paste

'liberas los datos copiados
Application.CutCopyMode = False

__________________________________________

Opción 2 - Crear un Loop recorriendo la BBDD

Dim filtroanno, filtromes, filtroarticulo, filtrovendedor, nombrebbdd, primerafilavacia, hojatd As String
Dim datoanno, datomes, datoarticulo, datovendedor As String
filtroanno = TextboxAnno.Value
filtromes = TextboxMes.Value
filtroarticulo = TextboxArticulo.Value
filtrovendedor = TextboxVendedor.Value
nombrebbdd = "aquí pones el nombre de la hoja donde está la BBDD"
Hojatd = "aquí pones el nombre de la hoja donde están los datos para generar el gráfico"

Sheets(nombrebbdd).Select
Range("A2").Select

'Iniciamos Loop mientras la celda contenga un valor

Do While ActiveCell.Value <> ""
'determinamos los valores del registro de la bbdd
datoanno = ActiveCell.Offset(0, 0).Value
datomes = ActiveCell.Offset(0, 1).Value
datoarticulo = ActiveCell.Offset(0, 2).Value
datovendedor = ActiveCell.Offset(0, 3).Value
'establecemos la condición de coincidencia de valores
If datoanno = filtroanno And datomes = filtromes And datoarticulo = filtroarticulo And datovendedor = filtrovendedor Then
Sheets(hojatd).Select
primerafilavacia = Sheets(nombrebbdd).Cells(Rows.Count, "A").End(xlUp).Row + 1
Range("A" & primerafilavacia).Select
'Asignamos los datos en la hoja del gráfico
ActiveCell.Offset(0, 0).Value = datoanno
ActiveCell.Offset(0, 1).Value = datomes
ActiveCell.Offset(0, 2).Value = datoarticulo
ActiveCell.Offset(0, 3).Value = datovendedor
Sheets(nombrebbdd).Select
End If
'pasamos al siguiente registro
ActiveCell.Offset(1, 0).Select

Loop

___________________________________

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas