2014-09-17

Insertar un reloj en Excel usando VBA

Title Nuestro objetivo es crear el siguiente reloj en una hoja de Excel:

Planteamiento

1. Partimos de la siguiente idea:

Una celda, A1 en el ejemplo, en la que insertaremos mediante VBA la fórmula AHORA, que devuelve la fecha y hora actuales. La formateamos para que muestre solamente la hora.
La cámara vinculada a la celda anterior, que nos aporta más flexibilidad para modificar su tamaño y posición dentro del hoja.
Un botón creado con una forma que vincularemos al código que iniciará y detendrá el reloj.

VBA

Sub Boton() 
  With ActiveSheet
      If .Shapes("Forma").TextFrame.Characters.Text = "Iniciar" Then
          .Shapes("Forma").TextFrame.Characters.Text = "Parar" 'Texto
          .Shapes("Forma").Fill.ForeColor.RGB = RGB(255, 0, 0) 'Color
          .Shapes("Forma").TextFrame.Characters.Font.ColorIndex = 2 'Fuente
      Call Reloj
      Else
          .Shapes("Forma").TextFrame.Characters.Text = "Iniciar"
          .Shapes("Forma").Fill.ForeColor.RGB = RGB(153, 204, 0) 
          .Shapes("Forma").TextFrame.Characters.Font.ColorIndex = 1 ?
      End If
  End With
End Sub
Con el código anterior creamos un único botón con dos alternativas en función del texto de la forma. Si el texto es Iniciar, cambia el texto a Parar, el color de la forma a rojo y el color de la fuente a blanco y ejecuta la macro Reloj. En caso contrario, cambia el texto a Iniciar, el color de la forma a verde y no ejecuta la subrutina Reloj.

Sub Reloj()
  If ActiveSheet.Shapes("Forma").TextFrame.Characters.Text = "Parar" Then
    Range("A1") = Now
    Application.OnTime Now + TimeValue("00:00:01"), "Reloj"
  End If
End Sub
En la subrutina anterior si el texto de la forma es Parar, es decir, la acabamos de iniciar, inserta en la celda A1 la función AHORA (NOW). Y con Application.OnTime programamos que se ejecute la propia subrutina Reloj cada segundo. Si apretamos de nuevo el botón anterior y el texto de la forma es Iniciar, es decir, la acabamos de parar, se detendrá esta macro.

Toques finales

Formateamos la celda en la que insertamos AHORA para mostrar la hora sin fecha. Presionamos CTRL+1 para mostrar el cuadro de diálogo Formato de celdas y aplicar el formato correspondiente de Hora.

Asignamos la subrutina Boton a la forma:

1. Cambiamos el nombre de la forma al que especifiquemos en nuestro código, Forma en nuestro ejemplo. Seleccionamos la forma y en el cuadro Nombre de la barra de fórmulas escribimos el nombre correspondiente.

2. Seleccionamos la forma, clic con el botón secundario del ratón y luego en Asignar macro. En el cuadro de diálogo, elegimos el nombre de la macro correspondiente y clic en aceptar.

Referencias:
Método Application.OnTime (Excel)

2 comentarios:

  1. me sale error en el codigo
    .Shapes("Forma").TextFrame.Characters.Font.ColorIndex = 1 ?

    ResponderEliminar
    Respuestas
    1. Lo más probable es que no hayas nombrado a tu forma "Forma". Casi imposible saber con tan pocos datos. Plantea tu pregunta con mucho más detalle en un foro de Excel y VBA.

      Eliminar

Nube de datos