que estaba programado para este sábado. Así que dedicaremos esta mañana a un problema que se nos puede presentar a los usuarios de Excel en castellano (o cualquier otra configuración regional fuera del inglés americano).
Supongamos una tabla con fechas y ventas. Podemos mostrar el detalle de ventas de un período con facilidad usando Autofiltro. Esto no es ninguna novedad para ninguno de mis lectores (ni para el 99% de los usuarios de Excel).
Si queremos analizar los datos de la tabla con frecuencia podemos crear una macro para ahorrarnos algunos de los pasos del uso de Autofiltro. La idea es que en una celda pongamos la fecha de inicio del período a analizar, en otra la fecha de cierre del período y apretando hagamos correr una macro que haga la tarea.
Suponiendo que no somos expertos en Vba, empezamos por grabar las acciones que hacemos para aplicar el autofiltro
Al grabar una macro es recomendable darle un nombre significativo, agregar un método abreviado de teclado (preferentemente combinando la tecla Mayúsculas) y poner una descripción de la tarea que cumple la macro.
Supongamos que queremos filtrar la lista para que muestre las ventas del segundo trimestre del 2007 (nótese que ya hemos agregado las celdas para introducir las fechas en la parte superior de la hoja)
EL código resultante es el siguiente
Sub Filtrar_periodo()
'
' Filtrar_periodo Macro
' Filtrar la lista entre dos fechas
'
' Acceso directo: Ctrl+May?s+F
'
Selection.AutoFilter
ActiveSheet.Range("$A$6:$F$2088").AutoFilter Field:=1, Criteria1:= _
">=01/04/2007", Operator:=xlAnd, Criteria2:="<=30/06/2007"
End Sub
El código que resulta de grabar las acciones presenta dos problemas:
- El rango de la tabla es fijo, Range("$A$1:$F$2083")
- Los criterios de filtrado también están preestablecidos en el código
Para que nuestra macro sea útil tenemos que modificar el código de manera que podamos cambiar las fechas según nuestras necesidades y que el rango de la tabla se adapte cuando esta cambia.
Ahora editamos nuestro código donde definimos dos variables tipo String (texto) para los criterio de filtrado.
El código es el siguiente
Sub filtrar_periodo_mejorado()
Dim strCriterio1 As String
Dim strCriterio2 As String
strCriterio1 = ">=" & Range("celFechaDe")
strCriterio2 = "<=" & Range("celFechaHasta")
With ActiveSheet
If .AutoFilterMode = True Then .AutoFilterMode = False
End With
Range("A6").AutoFilter field:=1, Criteria1:=strCriterio1, _
Operator:=xlAnd, Criteria2:=strCriterio2
End Sub
Al activar la macro obtenemos el siguiente resultado
Excel nos informa graciosamente que no se han encontrado filas que cumplan con los criterios!
El problema consiste en que en Vba Excel usa la notación americana de fechas (mes/día/año) de manera que la fecha 01/04/2007 ha sido transformada en 04/01/2007
La segunda fecha no ha sufrido transformación dado que no existe el mes número 30.
La forma de solucionar este problema es pasar las fechas a una variable de tipo Long y con esta variable armar la cadena de texto del criterio.
El código es:
Sub filtrar_periodo_mejorado()
Dim lFecha1 As Long, lFecha2 As Long
lFecha1 = Range("celFechaDe")
lFecha2 = Range("celFechaHasta")
With ActiveSheet
If .AutoFilterMode = True Then .AutoFilterMode = False
End With
Range("A6").AutoFilter field:=1, Criteria1:=">=" & lFecha1, _
Operator:=xlAnd, Criteria2:="<=" & lFecha2
End Sub
Como puede verse solo definimos dos variables de tipo Long par alas fechas y la cadena de texto de los criterios la armamos con el operador “ &”
Ahora nuestro modelo funciona sin inconvenientes, sin importar cuáles sean las definiciones regionales del sistema
El archivo con ejemplo y el código puede descargarse aquí .