jueves, 21 de junio de 2012

Filtro avanzado.¿Por qué no me funciona?


Funciones utilizadas:

Espacios()
EsTexto()

Rangos con nombre:

Modelo3=Modelos!$A$1:$D$61
Filtro1=Filtro!$A$1:$F$2
Filtro2=Filtro!$A$8:$F$9
Destino=Salida!$A$1:$D$1

La semana pasada estuve ayudando a mi mujer a preparar un filtro que le daba problemas. Aparentemente el filtro estaba bien hecho, pero no funcionaba.
Los datos provenían de la informática corporativa de su empresa, un fichero de texto separado por punto y coma. La importación del fichero, como no podía ser de otra manera, se realizó sin ningún tipo de problemas.
El filtro es un filtro atípico, hay que filtrar unos determinados códigos, es decir hay que quedarse con aquellos códigos que son distintos a una lista de códigos. 
Al cabo de un rato de trastear con el fichero vimos que la columna con los códigos a filtrar incluía una serie de espacios en blanco  (no visibles) después del código, que eran los que hacían que el filtro no funcionase.
Como, evidentemente, no puedo subir a la red un fichero con los datos reales de la empresa, he preparado un fichero, a base de fechas, emulando el problema encontrado (y encontrando otro). Los datos son una sola columna (Columna A de la hoja Modelos) con fechas en formato AAAAMMDD seguidas de unos espacios en blanco. En el ejemplo compruebo la existencia o no de espacios indeseados concatenando por delante y por detrás un asterisco (columna B). En la columna C, mediante la función ESPACIOS() elimino esos espacios no deseados. En la columna D compruebo que esos espacios han desaparecido. Hecho esto preparé un filtro  (filtro2) para no seleccionar determinados domingos, pero, el filtro no funcionaba, no filtraba esos domingos.
 ¿Qué le sucede a este filtro? Muy sencillo, los datos de la columna C son texto y los datos del filtro preparado, tal cual lo preparé (hoja filtro rango A8:F9) son numéricos. La existencia de esta diferencia la compruebo en E2 (=C2=20120101, que da falso) y en F2 (=C2="20120101", que da verdadero). En E3 (=ESTEXTO(C2)) pregunto expresamente si es texto y el resultado es verdadero.
En el fichero original, el de mi esposa, los códigos son alfanuméricos, pueden ser numéricos puros, alfabéticos puros o una una mezcla de ambos. Además, algún código puede que se  haya retocado, o incluso incluido, a mano una vez convertido a excel el fichero de texto original. Por tanto nadie nos garantiza que todos los elementos de la columna con los códigos sean texto. Para no complicarme mucho la vida fuerzo a que todos los códigos sean texto concatenando un * por delante y otro por detrás (columna D de la hoja modelos) y modifico el filtro (filtro1) para incluir asteriscos  (hoja Filtro, rango A1:F2). No he profundizado en mejorar este tema, probablemente se pueda, pero de esta manera funciona correctamente.







  

viernes, 8 de junio de 2012

Un poquito de programación. La grabadora de macros.

El grabador de macros graba desde el momento en el que lo activamos hasta el momento en el que lo desactivamos cualquier operación que hagamos. Esto nos permite, sin profundizar demasiado en el Visual Basic para excel, automatizar de una manera sencilla tareas repetitivas.
Para activarlo :
  1. Ver
  2. Barra de herramientas.
  3. Visual Basic.
Aparece una banderola con las opciones de VBasic. De momento solo voy a comentar tres de ellas:
  1.  La primera es el triangulo típico del play de cualquier reproductor. Nos permite ejecutar una macro.
  2. La segunda, un botón rojo, también típico de cualquier grabador. A partir del momento en que pulsamos este botón, excel graba todo lo que hagamos. Al pulsarlo se convierte en un pequeño cuadrado, también el típico icono de pausa de los grabadores.
  3. La tercera que voy a comentar es el editor de visual basic. Nos permite acceder al código grabado, modificarlo, o crear un código nuevo.
 Desde mi punto de vista Vbasic para excel es muy potente, permite hacer cosas insospechadas.