Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Una inesperada lluvia acaba de arruinarme el bautismo de fuego de mi nueva bicicleta XC,
una Scott Spark 60
que estaba programado para este sbado. As que dedicaremos esta maana a un problema
que se nos puede presentar a los usuarios de Excel en castellano (o cualquier otra
configuracin regional fuera del ingls americano).
Supongamos una tabla con fechas y ventas. Podemos mostrar el detalle de ventas de un
perodo 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 perodo a analizar, en otra la fecha de cierre del perodo 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 mtodo
abreviado de teclado (preferentemente combinando la tecla Maysculas) y poner una
descripcin de la tarea que cumple la macro.
Supongamos que queremos filtrar la lista para que muestre las ventas del segundo trimestre
del 2007 (ntese que ya hemos agregado las celdas para introducir las fechas en la parte
superior de la hoja)
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
Para que nuestra macro sea til tenemos que modificar el cdigo de manera que podamos
cambiar las fechas segn nuestras necesidades y que el rango de la tabla se adapte cuando
esta cambia.
Empecemos por crear dos nombres que se refieran a las celdas B2 (celFechaDe) y B3
(celFechaHasta). La forma m prctica de hacerlo es introduciendo los nombres en el cuadro
de Nombres
Ahora editamos nuestro cdigo donde definimos dos variables tipo String (texto) para los
criterio de filtrado.
El cdigo es el siguiente
Sub filtrar_periodo_mejorado()
Dim strCriterio1 As String
Dim strCriterio2 As String
With ActiveSheet
If .AutoFilterMode = True Then .AutoFilterMode = False
End With
End Sub
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 notacin americana de fechas (mes/da/ao)
de manera que la fecha 01/04/2007 ha sido transformada en 04/01/2007
La segunda fecha no ha sufrido transformacin dado que no existe el mes nmero 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 cdigo 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
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 cules sean las definiciones
regionales del sistema
30 comments:
Muy bueno, gracias por tus aportes! Pero me llama la atencin cmo es que no se recorre la
hoja hacia abajo sino que el encabezado se mantiene mientras que lo filtrado se mueve
independiente! Como hiciste eso!? te estara agradecido que me lo comentaras! De antemano
gracias! Excelente tu blog!! Saludos!
PD: Lastima lo de tu bicicleta pero nunca es tarde para darle su estrenada jeje
Muy sencillo! Seleccionas la fila adecuada y utilizas Inmovilizar Paneles (en Excel 2007/10 en
Vista--Ventana; en Excel 2003 o anterior en el men Ventana--Inmovilizar Paneles).
La bicicleta fue estrenada al da siguiente, contra viento y marea (y no poco barro).
Excelente comentario, gracias por seguir compartiendo esos detalles que a lo mejor al 90% de
los usuarios de Excel no les interesa y no saben de lo que se estan perdiendo y el trabajo que
se pueden ahorrar al aplicar todos estos consejo o simplemente lo dinmico que puede ser
una hoja de Excel. Nuevamente gracias
No creo que este sea al local correcto pero no pude encontrar otro; quisiera consultar donde
puedo encontrar un listado de temas o si hay un buscador de temas por las pginas del site.
Saludos
HBanchieri
En parte superior del blog hay una nube de etiquetas con los distintos temas. Tambin se
puede hacer una bsqueda en la casilla "buscar en el blog".
Annimo, 06 julio, 2011 02:07
Extraordinario blog. Nunca me haba dado la oportunidad de comentar nada, hasta hoy.
Gracias a este blog me descubr y me inici en el mundillo de las macros, que encuentro
absolutamente fascinante. Quiero hacer una sugerencia al tema, si en lugar de agregar un
botn para correr la macro, se crea una macro por evento ligada al cambio en la celda
celFechaHasta y validando que haya valor en ambos rangos, se ahorrara otro clic (y se vera
bastante ms impresionante No?) Un saludo, estimado autor. Atte Hugo Jimnez
If Union(Target, Range("celFechaHasta")).Address = _
Range("celFechaHasta").Address Then
Call filtrar_periodo_mejorado
End If
End Sub
Buenas tardes. Agradezco su ayuda en lo sgte: Tengo un archivo en excel con contrasea y
necesito desbloquearlo para poder modificar algunas formular. Trat de hacerlo intruduciendo
una macro como vi en un sitio de internet pero el archivo no me permite crear macros ni
modificar las existentes. como podr hacer para desbloquearlo?? Gracias
Juan,
hay muchas aplicaciones que se pueden descargar de la Internet para desbloquear
contraseas. Si se trata de un archivo desarrollado por otra persona lo ms indicado sera
pedirle a ella la contrasea.
Hola buen dia Jorge primero felicitarte por tu blog esta genial lo estoy leyendo y tengo un duda
o pregunta de como puedo hacer con esto, hice todo los pasos a diferencia del ejemplo que
tienes yo solo necesito que busque 1 solo valor dentro de la lista:
Sub buscar()
'
' buscar Macro
' busca Rex
strCriteria1 = Range("Rex")
With ActiveSheet
If .AutoFilterMode = True Then .AutoFilterMode = False
End With
Range("B2").Select
Range("B5").AutoFilter Field:=1, Criteria1:="strCriteria1", _
Operator:=xlAnd
End Sub
mi problema especificamente es que por ejemplo de la lista que tengo para buscar son codigos
A82WM7510
A82WM7051
A82WM7053
A82FJ01
y lo que quiero es que la funcion que haga es que busque por ejemplo A82 y me de los
resultados de toda la lista que contengan esas primeras letras, que modificacion tendria que
hacer porque solo me da resultados si pongo el nombre completo si no, no me arroja
resultados porque me pide que sea exacto el nombre y yo quiere que tenga la funcion de
CONTIENE.