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:

lunes, febrero 11, 2008

Redondeo de horas en Excel

Cuando queremos redondear tiempos o fechas en Excel debemos tomar en cuenta que, en lo que tiempo y fechas se refiere, Excel no es WYSIWYG(what you see it's what you get, queriendo decir, lo que ves es lo que es).
Como ya hemos explicado, para Excel la fecha 11 de febrero de 2008 es el número 39489(los días transcurridos desde el 1ro. de enero de 1900). La hora 18:00 es el número 0.75 (que resulta de dividir 18 por 24).
En resumen, existe una diferencia entre como Excel muestra las fechas y las horas en pantalla y como las considera para realizar operaciones.
También cuando queremos redondear fechas y horas debemos tomar en cuenta esta cuestión.
Supongamos, como pedía uno de mis lectores, que queremos redondear la hora 2:20 a la hora más cercana. Si usamos la fórmula =REDONDEAR(A1;0), obtenemos un resultado erróneo




Este resultado se debe a que para Excel la hora 2:20 es el número 0.097222 y por lo tanto, al redondear a un número entero obtenemos 0. Esto podemos verlo si aplicamos el formato General a las celdas



La fórmula correcta para redondear horas es =REDONDEAR(A1*24,0)/24



Es decir: 0.09722 X 24 = 2.3333 ---> REDONDEAR(2.3333;0)= 2 ---> 2/24= 0.8333
Y finalmente, cuando ponemos formato de hora a 0.8333 vemos en la celda 02:00

Si queremos redondear por medias horas, usamos como factor 48 en lugar de 24



Si queremos redondear por múltiplos de 15 minutos (cuarto de hora) usamos 96 (24X4), =REDONDEAR(A1*96,0)/96; para múltiplo de 20 minutos usamos 72, etc.

La regla general es =REDONDEAR(A1*(60/m*24),0)/(60/m*24), donde m es la cantidad de minutos en el múltiplo.

Una variante interesante a esta técnica es la propuesta en Daily Dose of Excel. Ésta consiste en crear un nombre con la constante "=24*60"



De esta manera podemos usar el nombre en nuestra fórmula de esta manera




Technorati Tags:

sábado, febrero 09, 2008

Cargo de horas de trabajo con Excel.

Otras de las tareas usuales con Excel es el cálculo de horas a cargar por un proyecto. Sencillamente, calculamos el total de horas y lo multiplicamos por la tarifa. A pesar de lo obvio que parece, debemos tomar en cuenta cómo Excel considera las horas en los cálculos.
Por ejemplo, si hemos invertido 10 horas de trabajo y la tarifa acordada con nuestro cliente es 50 euros, estaríamos tentado ha hacer este cálculo:"10:00 X € 50.00 = € 500". Pongámoslo ahora en una hoja de Excel



El resultado en la celda C2 es "incorrecto". Como explicamos en la nota anterior, esto se debe a que el valor de la celda A2 es en realidad 0.416666666666667 (10 horas dividido por 24 horas).
Para corregir este "error" (que en realidad no lo es) multiplicamos nuestra fórmula original por 24



En la "vida real" las cosas son más complicadas. Por lo general trabajamos con tarifas horarias diferenciales. Supongamos esta tarifa diferencial para cargar un proyecto



La idea es cargar a nuestro cliente con una tarifa decreciente en función de la cantidad de horas.

Siguiendo las indicaciones de la nota anterior sobre el cálculo con horas, construimos esta tabla con las horas trabajadas en el proyecto



Para cargar a nuestro cliente tenemos que dividir las horas de trabajos en porciones de 8 horas. El modelo propuesto es el siguiente



Todas las celdas en el rango A11:B13 tienen el formato [hh]:mm. La celda A14 tiene el formato [h]:mm +, para que el sino + aparezca, sin convertir el contenido de la celda en texto.
Los intervalos los fijamos en forma dinámica, donde la duración del intervalo está definida por las celdas B11 – A11 (8 horas en nuestro caso). Esta diferencia la ponemos en un nombre (escala):



En la celda A12 ponemos la fórmula =B11, en la celda A13, =B12. En la celda B12 ponemos la fórmula =A12+escala, en la celda B13 =A13+escala. De esta manera nuestro modelo será dinámico y se ajustará automáticamente a los cambios en el tamaño del intervalo.
En la columna Horas, en la celda D11 ponemos la fórmula

=MIN(escala,$D$6)

Usamos esta fórmula en lugar de la función SI para determinar si el total de horas trabajadas es menor que el primer intervalo de nuestra tarifa diferencial.
En las celdas del rango D12:D14 usamos la fórmula

=MIN(escala,$D$6-SUMA($D$11:D11))

La expresión SUMA($D$11:D11) va resumiendo le total de horas que ya hemos cargado. Hay que prestar atención a las direcciones absolutas y relativas en la función SUMA.

Para ver cómo el modelo ajusta automáticamente los intervalos, cambiamos el primer intervalo a, por ejemplo, seis horas







Technorati Tags: