Está en la página 1de 4

jueves, 22 de enero de 2015

VBA: Copiar datos filtrados/visibles de una Tabla.


Veremos hoy un trabajo doble interesante:
Primero veremos cmo aplicar un filtro de fechas con macros sobre una Tabla (problemtico
habitualmente por una incompatibilidad de la configuracin regional)
Segundo cmo copiar y pegar el resultado del filtro aplicado.
Partiremos de la siguiente hoja:

El trabajo del siguiente procedimiento consiste primero en aplicar un Filtro de fechas sobre el campo
'Fecha'; para ello deberemos tener la precaucin de definir las variables con el tipo Long.
El motivo es salvar la configuracin regional enfrentada de nuestra hoja de clculo (dd/mm/aaaa) y la
de VBA (mm/dd/yyyy)... al definirlo como Long (nmero entero), tratamos la fecha como lo que es
para Excel, un nmero entero (en cualquier configuracin regional, un nmero es un nmero...).
Una vez conseguido y aplicado el filtro, seleccionaremos slo las celdas visible empleando el
mtodoSpecialCells(xlCellTypeVisible), a partir del cuerpo de la Tabla con la
propiedad .DataBodyRange
Insertamos y ejecutamos el siguiente procedimiento, asignado al botn 'EXTRAER':
view plainprint?

1.

Sub RangoFecha()

2.

'definimos las variables como Long para poder aplicar el autofiltro

3.

'unica forma de salvar el problema de la configuracin regional

4.

Dim FechaDesde As Long, FechaHasta As Long

5.

'definimos variables para aplicar el filtro sobre la tabla

6.

FechaDesde = CDate(Range("B1").Value)

7.

FechaHasta = CDate(Range("B2").Value)

8.
9.

'aplciamos el autofiltro sobre nuestro Tabla

10. ActiveSheet.ListObjects("TblDatos").Range.AutoFilter _
11.

Field:=1, Criteria1:=">=" & FechaDesde, Operator:=xlAnd, Criteria2:="<=" & FechaHasta

12.
13. 'aplciamos el copiado del resultado
14. Dim rng As Range
15.
16. 'trabajamos slo sobre el cuerpo de la Tabla (.DataBodyRange)
17. 'no sobre cabecera o fila totales
18. With ActiveSheet.ListObjects("TblDatos").DataBodyRange
19.

'definimos el rango visible

20.

'depurando el error por si no hubiera nada filtrado

21.

On Error Resume Next

22.

Set rng = .Resize(.Rows.Count, .Columns.Count).SpecialCells(xlCellTypeVisible)

23.

On Error GoTo 0

24. End With


25.
26. 'controlamos el fallo..
27. If rng Is Nothing Then
28.

'si no hubiera nada como resultado del filtro

29.

MsgBox "Sin datos a copiar"

30. Else
31.

'en caso hubiera algn dato

32.

MsgBox rng.Address

'mostramos el rango de celdas..

33.

rng.Copy Destination:=Range("C23")

34.

Application.CutCopyMode = False

'copiamos el rango y lo pegamos a partir de C23


'liberamos el Portapapeles

35. End If
36.
37. 'finalizamos quitando el filtro aplicado
38. ActiveSheet.ListObjects("TblDatos").Range.AutoFilter Field:=1
39.
40. End Sub
El resultado tras la ejecucin de la macro es el siguiente... Tras aplicar el filtro vemos el Cuadro de
mensaje que muestra el rango de celdas visibles dentro del cuerpo de la Tabla

Y se continuamos la ejecucin veremos el copiado y pegado de estos datos:

También podría gustarte