miércoles, febrero 20, 2008

Buscar el valor más cercano en una lista de Excel

Excel cuenta con varias funciones de búsqueda, como BUSCARV, BUSCARH y COINCIDIR.
Estas funciones permiten realizar búsquedas exactas o aproximadas. Supongamos esta situación




Para encontrar la posición del valor buscado (8.5) en la tabla usamos la función COINCIDIR, omitiendo el tercer argumento de la función. En esta situación la función da como resultado 1. Si hubiéramos hecho una búsqueda exacta, el resultado sería #N/A.


El problema con este resultado es que si buscamos la posición del valor más cercano al valor buscado, el resultado tendría que haber sido 2, ya que el valor buscado (8.5) está más cerca del segundo valor en la lista (10) que del primero (5).

Para obtener la posición del valor más cercano al valor buscado tenemos que usar esta fórmula matricial:

={COINCIDIR(MIN(ABS(B2:B7-B9)),B2:B7-B9)}



Para entender esta fórmula tendremos que analizarla de "adentro hacia fuera".

La expresión ABS(B2:B7-B9), al estar dentro de una fórmula matricial, de cómo resultado el menor de los valores del rango B2-B9, B3-B9,…,B7-B9.
El mínimo de esta serie de valores es 1.5, que ocupa el segundo lugar en la serie



El resultado de la fórmula COINCIDIR puede usarse como argumento de la función INDICE para encontrar el valor más cercano al buscado en la lista de valores. En nuestro caso:

={INDICE(B2:B7,COINCIDIR(MIN(ABS(B2:B7-B9)),B2:B7-B9))}





Technorati Tags:

lunes, febrero 18, 2008

Tabla de tasas de cambio con la función TRANSPONER

Un compañero de trabajo me consultaba hoy sobre el uso de la función TRANSPONER sobre la cual ya he escrito en el pasado.
Mi explicación fue interrumpida con un "y para qué sirve en la vida real?". El ejemplo de la nota (ver enlace) le pareció complicado y, aceptémoslo, un tanto rebuscado.
No me quedó más remedio que crear un ejemplo más ilustrativo, que es el siguiente: una tabla de tasas de cambios cruzados con la función TRANSPONER. Una tabla de este tipo aparece en mi nota sobre cómo construir un presupuesto de viaje, pero allí no explico cómo construirla.
Empezamos por una tabla sencilla con el nombre de las monedas y su tasa de cambio, por ejemplo, respecto al Euro



Para trabajar con más comodidad, definimos un nombre que contendrá el rango B3:B6, que llamaremos "tasas"



Ahora construimos el marco para nuestra tabla



Seleccionamos el rango B11:E11 y ponemos la fórmula matricial =$B$3/TRANSPONER(tasas)



Los paréntesis "{" y "}" aparecen al introducir la fórmula pulsando simultáneamente Ctrl+Mayúsculas+Enter, como con toda función matricial.

Copiamos la fórmula al resto de las filas, cambiando la celda de referencia (B4 para el franco suizo, B5 para la libra esterlina y B6 para el yen japonés).



Si queremos orientar la tabla en otro sentido, podemos usar la fórmula matricial ={=$B$3/tasas}



O transponer la primer tabla con TRANSPONER



El cuaderno del ejemplo se puede descargar aquí.




Technorati Tags:

sábado, febrero 16, 2008

Crear un botón flotante para macros en Excel.

Crear macros en Excel es fácil. En particular si usamos la grabadora de macros. Esta herramienta, si bien no crea macros eficientes, si nos permite automatizar tareas sencillas.
Uno de los métodos más comunes para correr macros es ligarlas a un botón. Esto, como ya hemos visto, lo hacemos creando el botón con la barra de herramientas de Formularios o de Cuadro de Controles y ligando la macro a él.
Supongamos esta macro

Sub hola()
    Dim Mensaje

    Mensaje = "La hora es: " & Time & vbCrLf

    Select Case Time
      Case Is <= 0.5
        Mensaje = Mensaje & "Buenos días!"
      Case 0.5 To 0.75
        Mensaje = Mensaje & "Buenas tardes!"
      Case Else
        Mensaje = Mensaje & "Buenas noches!"
      End Select

    MsgBox Mensaje

End Sub

Esta macro produce un mensaje que muestra la hora y un de acuerdo a ésta, un saludo. Para correrla la ligamos a un botón



Al apretar el botón veremos



Uno de mis lectores me consultaba cómo hacer que este botón "flote" sobre la hoja. Esto le era necesario ya que se trataba de una hoja con muchas columnas y al navegar en la hoja, el botón quedaba oculto.

Apresurémonos a decir que hay otras soluciones fuera de ligar una macro a un botón. Podemos ligar la macro a un menú o crear un atajo de teclado, como ya hemos mostrado. De esta manera, podemos activar la macro sin importar donde estemos en la hoja.

Pero, si por algún misterioso motivo, no tenemos más remedio que ligar la macro a un botón y queremos que éste esté siempre visible, las posibilidades son:
1 – Crea una barra de herramientas y ligarle la macro
2 – Crear un UserForm y definirlo como "modeless"

Personalmente prefiero la primer opción. La ventaja de la segunda, es que nos permite determinar el tamaño de la forma.

Para crear una barra de herramientas personalizada con la macro hacemos lo siguiente:

# abrimos el menú Ver-Barras de Herramientas-Personalizar y apretamos el botón Nueva



# Le damos un nombre a la nueva barra y apretamos Aceptar



# Abrimos la pestaña Comandos y buscamos Macros en la ventana Categorías



# Ahora arrastramos la opción Personalizar el botón a la nueva barra de herramientas



# Con un clic del botón derecho abrimos el menú de la barra y seleccionamos la opción Asignar macro, lo que hacemos tal como con el botón.



A partir de esta momento, la barra flotará sobre la hoja, no importa adonde nos desplacemos.
Esta barra estará presente en todas las hojas del cuaderno, hasta que la cerremos. Esto puede ser una ventaja o una desventaja, dependiendo de la macro. Si la macro debe correr sólo cuando determinada hoja sea la activa, esto puede ser un inconveniente,

Crear un UserForm flotante requiere un poco más de conocimiento y práctica de Visual Basic. Los pasos son los siguientes:

# Abrimos el editor de Vba (Alt+F11), agregamos un Userform y sobre el pegamos un botón



# Cambiamos el valor de Caption en la ventana de Propiedades del botón a "Saludar"



# Hacemos un doble clic sobre el botón para abrir el módulo y ponemos este código



# Volvemos al UserForm (Ctrl+Tab) y en la ventana Propiedades del Userform cambiamos la propiedad ShowModal a False



Esto permitirá seguir trabajando en la hoja a pesar de no haber cerrado el formulario.

# Programamos el evento Workbook_Open, si queremos que el botón aparezca en todas las hojas, cuando abrimos el cuaderno

Private Sub Workbook_Open()
    UserForm1 Show
End Sub

Si queremos que el botón aparezca sólo en una hoja determinada, programamos también el evento en el módulo de la hoja

Private Sub Worksheet_Activate()
    UserForm1.Show
End Sub

En las restantes hojas tendremos que cerrar el formulario, o programar el evento Activate de esas hojas así:

Private Sub Worksheet_Activate()
    Unload UserForm1
End Sub

# Cambiamos el tamaño del UserForm y/o del botón de acuerdo a nuestros deseos.




Technorati Tags: