Hojas de cálculo en Excel - página principal

Informar de que está ejecutándose un macro

Cuando tenemos una hoja de cálculo en la que realizamos muchas operaciones a través de macros, es probable que alguna vez nos haya entrado la duda sobre si Excel se nos ha quedado colgado, o si realmente el macro está ejecutándose y se está haciendo algo.

Para informar al usuario (o a nosotros mismos, si somos los usuarios finales de esas aplicaciones en excel), podemos hacerlo de varias formas:

a) Podemos mostrar un mensaje en la barra de estado.
b) Podemos mostrar un mensaje en una celda.
c) Podemos mostrar un mensaje en una ventana emergente.
d) Podemos mostrar una barra de proceso indicando el porcentaje que llevamos ejecutando.
e) Podemos mostrar un mensaje en el botón que lanza el macro.

Probablemente haya más opciones, pero es posible que sean variaciones de esas que he enumerado. Personalmente, el que más me gusta es la última de ellas, la de mostrar un mensaje en el botón que dispara el macro. Su mecánica la vamos a explicar mediante un ejemplo:

Supongamos que tenemos un macro que evalúa una serie de números que tenemos (entre el 1 y el 60000), y donde queremos comprobar si todos son o no correlativos. El macro que evaluará esto se pondrá en marcha cuando pulsemos un botón que tiene por nombre "Comprobar correlativos". El objetivo será determinar si hay un salto entre uno y otro número, colocando un texto en la celda de la derecha de aquellos números que no sean correlativos, que ponga "No correlativo".

Esta es la hoja de cálculo:


Y el macro que utilizaremos será este:


Sub comprobar_correlativos()
'Ocultamos el prodecimiento
Application.ScreenUpdating = False
'Nos situamos en la primera celda
Range("A1").Select
'ahora recorreremos la columna,
'y nos pararemos cuando encuentre una fila vacía

Do While Not IsEmpty(ActiveCell)
If ActiveCell.Row > 1 Then
'Si el dato no es igual al de la fila anterior...
If ActiveCell - ActiveCell.Offset(-1, 0) > 1 Then
'Mostramos un mensaje
ActiveCell.Offset(0, 1) = "No correlativo"
End If
End If
'Bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
'Mostramos el prodecimiento
Application.ScreenUpdating = True
End Sub

Vamos a hacer que mientras se ejecute el macro, se nos presente un nombre distinto en el botón que lo ejecuta. En este caso, cambiaremos el texto "Comprobar correlativos" por el de "Comprobando…", y además lo pondremos de color rojo, para volver a ponerle al final y cuando acabe de ejecutarse el macro, el nombre que tenía el botón inicialmente, es decir, para volver a ponerle "Comprobar correlativos".


Para conseguir este efecto, simplemente deberemos añadir un código al principio y al final del macro. En nuestro ejemplo, nos deberá quedar así:


Sub comprobar_correlativos()
'Fichamos la celda donde estamos,
'para volver a ella al final

celda = ActiveCell.Address
'Seleccionamos el botón cuyo nombre queramos cambiar
ActiveSheet.Shapes("Button 1").Select
'le cambiamos el nombre, y lo ponemos en rojo
Selection.Characters.Text = "Comprobando..."
With Selection.Font
.ColorIndex = 3
End With
'Ocultamos el prodecimiento
Application.ScreenUpdating = False
'Nos situamos en la primera celda
Range("A1").Select
'ahora recorreremos la columna,
'y nos pararemos cuando encuentre una fila vacía

Do While Not IsEmpty(ActiveCell)
'Miramos si el dato de esa fila, restándole
'1, nos da el valor de la fila anterior. En caso
'contrario, mostraremos un mensaje en la columna de la
'derecha (en una celda adyacente).

If ActiveCell.Row > 1 Then
'Si el dato no es igual al de la fila anterior...
If ActiveCell - ActiveCell.Offset(-1, 0) > 1 Then
'Mostramos un mensaje
ActiveCell.Offset(0, 1) = "No correlativo"
End If
End If
'Bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
'Seleccionamos el botón
ActiveSheet.Shapes("Button 1").Select
'le cambiamos el nombre, poniéndole el que tenía
'inicialmente y lo ponemos en negro

Selection.Characters.Text = "Comprobar correlativos"
With Selection.Font
.ColorIndex = xlAutomatic
End With
'volvemos a la celda donde estábamos
Range(celda).Select
'Mostramos el prodecimiento
Application.ScreenUpdating = True
End Sub

Observad que hemos ocultado los pasos que ejecuta el procedimiento (Application.ScreenUpdating = False), justo después de cambiarle el nombre al botón, poniéndole el texto que informa que se está ejecutando el macro y poniéndolo de color rojo. Si la línea que oculta el procedimiento la ponemos como primera línea del macro, no veremos que cambia el nombre del botón, pues esa línea que oculta los pasos que va haciendo el macro nos oculta absolutamente todo, tanto lo que hace en las celdas, como lo que hacemos con el botón al cambiarle el nombre. Recordadlo porque a veces no solemos caer en estos pequeños detalles.

Evidentemente este ejemplo que os presento hoy, solo tiene sentido aplicarlo en aquellos macros que como mínimo requieran de cierto tiempo de ejecución (por ejemplo, más de dos o tres segundos), pues si son macros casi instantáneos, no tiene sentido cambiarle el nombre a un botón para volver a ponerle el nombre que tenía tan solo unas milésimas de segundo después, ya que no vamos a poder apreciar los cambios.

Desde aquí podéis descargar el fichero, con el ejemplo que hemos visto en este artículo.



3 comentarios:

Anónimo dijo...

Hola Javier, aprendemos muchísimo con lo que nos cuentas; muchas gracias por todo.
Quería preguntarte si hay alguna manera de seleccionar todas las celdas que contienen números y multiplicarlas por (-1) para cambiar su signo.

Muchas gracias por tu ayuda

El pilt®afilla - www.3piesalgato.com dijo...

Prueba con esto:

Sub por_menos_1()
'nos situamos en la celda A1
Range("A1").Select
'hasta que no encuentre una fila vacía, que baje
Do While Not IsEmpty(ActiveCell)
'si es un número, lo multiplicamos por -1
If IsNumeric(ActiveCell) And Left(ActiveCell.Formula, 1) <> "=" Then
ActiveCell = ActiveCell * -1
'bajamos una fila
End If
ActiveCell.Offset(1, 0).Select
Loop
End Sub

Limitaciones: Si una fórmula te devuelve un número (por ejemplo: =43*92), el resultado no cambia de signo, pues no tocamos las fórmulas, tan solo tocamos los números.

Anónimo dijo...

Hola espero que estes bien, tengo una duda yo uso mucho libros de excel que contienen numero y texto a la vez ejemplo (20AB, 85EF)se puede hacer una macro donde solo cambie el color del texto por color Rojo y numero color negro. espero que me ayudes gracias.