viernes, octubre 17, 2014

Lista desplegable con contenido condicional - versión con Vba

Supongamos este escenario:

tenemos una lista que asocia nombres con valores

donde los nombres se repiten.

Queremos crear una lista desplegable que muestre los valores asociados al nombre que eliljamos en la celda G2 de este ejemplo


Vamos a mostrar como está construido este modelo.

Comenzamos por mostrar la columna A que están oculta. Esta columna contiene un rango dinámico donde ponemos los valores asociados al nombre que aparece en la celda G2.


El rango D1:E14 que contiene los nombres y sus valores está definido como Tabla.
La columna A contiene los valores asociados al nombre introducido en la celda G2.
Para poner estos valores usamos un evento de tipo Change

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$G$2" Then
        Range("tblNombreValor[#All]").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range("G1:G2"), CopyToRange:=Range("A1"), Unique:=False
    End If
 
End Sub


El código usa la funcionalidad Filtro Avanzado (Datos - Ordenar y Filtrar - Avanzadas) que nos permite filtrar una tabla y copiar los resultados a otro rango.

Definimos un nombre que se refiere a este rango dinámicamente con esta fórmula

=Hoja1!$A$2:INDICE(Hoja1!$A:$A,CONTARA(Hoja1!$A:$A))


Ahora definimos una validación de datos en la celda H2 con la opción Lista y el nombre definido ListValores en la casilla Origen


Con esto concluimos la construcción del modelo. El archivo del ejemplo se puede descargar aquí.

En cuanto al formato condicional para señalar las filas del nombre introducido en G2, usamos la opción Formula con esta definición



domingo, septiembre 28, 2014

El extraño caso de los guiones distintos

En el pasado hemos visto y analizado los extraños casos del signo + en Excel (que amplié en esta nota), del espacio inamovible (ASCII160) y del cálculo manual persistente.
Hoy voy a agregar un nuevo capítulo a la serie: el extraño caso de los guiones distintos

Veamos esta situación


En la celda B2 hemos tipeado el texto "Sucursal 1 - Norte"; en la celda C2 hemos copiado copiado el mismo texto escrito previamente en Word; la comparación de ambos textos, que suponemos idénticos, en la celda D2 da "FALSO".
El primer sospechoso es la presencia de espacios lo que podemos comprobar usando la función LARGO

Sin embargo la comparación en la celda D2 nos muestra que ambos textos tienen el mismo largo. Si bien los lectores más atentos habrán advertido la diferencia entre el guión en la celda B2 y el de la celda C2, esto no es siempre evidente; en particular si la hoja contiene grandes cantidades de datos.

Para encontrar el problema vamos a "destripar" los textos en sus componentes y compararlos uno por uno. Para hacerlo usaremos la función EXTRAE

En la celda Be ponemos la fórmula =EXTRAE($B$2,FILA()-3,1) y la copiamos hacia abajo hasta obtener todos los caracteres del texto; hacemos lo mismo en la celda C4 pero refiriéndonos al texto en la celda C2.
En la columna D comparamos entre la la columna B y la C. Inmediatamente vemos que el problema está en la fila 15, los guiones son distintos.

Cuando usamos el guión Word activa la autocorrección y lo convierte en en el guión un tanto distinto


Esta cambio pasa inadvertido (el menú para deshacer el cambio sólo aparece si apuntamos con el mouse al guión).
Esto no pasaría de ser una anécdota si no fuera porqué el mismo problema suele presentarse al importar textos de páginas WEB y de otras fuentes.

El remedio para esta situación es reemplazar el guión "largo" (em dash) por el guión "corto" (el guión "corto" es en realidad el signo menos; el guión largo se lo conoce como "em dash").
El reemplazo lo podemos hacer usando Buscar y Reemplazar (Ctrl L). Pero el problema es que el "guión largo" no está asociado a ninguna tecla en el teclado. Para poder "teclear" el guión largo usaremos la técnica conocida como Códigos Alt (Alt Codes). Sin deternos en la historia, la técnica consiste en mantener apretada la tecla Alt y pulsar el código del caracter en el teclado númerico (situado a la parte derecha del teclado). En nuestro caso el código del "em dash" es 0150




miércoles, septiembre 10, 2014

La función MONEDA de Excel

¿Alguien usó alguna vez la función MONEDA de Excel? La función MONEDA y sus dos "primas hermanas" MONEDA.FRAC y MONEDA.DEC pertenecen esa colección de funciones que ni siquiera sabíamos que existen.

Según la ayuda en línea de Excel el objetivo de la función MONEDA es convertir un número en texto usando formato de moneda


Introducimos un número (o referencia a una celda que contiene un número), definimos la cantidad de decimales y el resultado es el número precedido por el símbolo de la moneda (de acuerdo a las definiciones del sistema). Lejos de ser la función más sofisticada de Excel.

Las mencionadas "primas" tienen usos que pueden ser útiles en ciertas circunstancias. EL objetivo original de la función MONEDA.FRAC, siempre de acuerdo a la ayuda en línea de Excel, es:

Convierte una cotización de un valor bursátil, expresada en forma decimal, en fraccionaria. Use MONEDA.FRAC para convertir números decimales de moneda, como precios de valores bursátiles, en fracción.
En lugar de intentar explicar el significado de la definición, voy a mostrar un uso posible.

Por lo general los sistema de control de horarios usan la notación decimal. Por ejemplo, 2.5 horas representa 2 horas y 30 minutos; 2.75 representa 2 horas y 45 minutos. La forma decimal puede conducir a confusiones y ya hemos visto cómo convertir esta forma en formato horario:

  1. dividimos 2.75 por 24
  2. cambiamos el formato de la celda a [hh]:mm
  3. el resultado será 02:45

En lugar del formato horario podemos usar MONEDA.FRAC de la siguiente manera

=MONEDA.FRAC(A2,60)


La parte decimal del número muestra ahora los minutos (2 horas, 45 minutos).