Foto cortesía de: jimbl
Cuando trabajas sobre una hoja con varios cientos o miles de registros, se te presenta la molestia de no saber dónde colocar el botón que ejecute la macro que has desarrollado. ¿No es verdad?
Tarea un poco difícil, porque el usuario siempre se va a estar moviendo en todas direcciones, sobre todo hacia abajo, donde nuestro botón sale del campo visual. Sería Excelente poder crear un botón flotante para nuestra macro; pero ya sea porque quieres hacerlo diferente, o porque no quieres que el usuario cierre accidentalmente la ventanita con el botón, te voy a mostrar cómo hacerlo con una autoforma.
Botón Flotante en Excel
Primero vas a crear tu botón con una autoforma, a tu gusto. Esta es una de las ventajas de hacerlo así, porque puedes darle la forma y el color que quieras a tu botón. El mío me quedó así:
No olvides darle un nombre al botón. Yo le puse “btnEjecutar”
Ahora, vas a crear una macro dentro de la hoja en la que dibujaste el botón. Esto debido a que debemos controlar el evento Worksheet_SelectionChange que se dispara cada vez que el usuario cambia la selección.
Este sería el código a utilizar:
En este código, le estamos indicando a Excel que cada vez que nos movamos por la hoja, calcule la posición de la celda y se la asigne a la autoforma que tiene por nombre “btnEjecutar”.
- Con el atributo .Left de nuestro botón, le estamos indicando que la distancia desde la izquierda de la pantalla, sea igual a la distancia que tiene la celda que está a la derecha de la celda activa.
- Con el atributo .Top de nuestro botón, estamos asignándole la misma distancia que tiene la celda activa desde la parte superior de la pantalla.
- El atributo .Height es simplemente para que siempre se adapte al alto de la celda activa. Puedes quitarle esta línea si tienes una planilla con muchas filas de diferente altura.
El botón flotante En acción
En esta imagen puedes ver a nuestro simpático botón moviéndose por toda la hoja cada vez que cambiamos la celda activa. No importa hacia dónde nos movamos, nos seguirá “como un perrito fiel”
Consejos adicionales para que modifiques el código
Si no quieres que el botón flotante se mueva de columna, puedes eliminar la siguiente línea:
[aviso tipo=”code” titulo=””].Left = Cells(fila, columna + 1).Left[/aviso]
Por el contrario, si quisieras que tu botón no se mueva de fila, pero sí de columna, puedes eliminar la siguiente línea:
[aviso tipo=”code” titulo=””].Top = ActiveCell.Top[/aviso]
Si tu hoja tiene muchas filas con altura diferente entre si, puedes eliminar la siguiente línea:
[aviso tipo=”code” titulo=””].Height = ActiveCell.Height[/aviso]
El ejemplo terminado
Aquí te dejo el ejemplo terminado en un libro de Excel habilitado para macros. Solo haz clic en el botón y sigue las instrucciones. ¡Es Gratis!
No te olvides de permitir la ejecución de macros al abrirlo, para que funcione el código.
Eso es todo por hoy. Espero que le saques provecho a este ejemplo y lo apliques en tus proyectos.
¡Nos vemos!
[firma]
17 comentarios en “¿Te gustaría crear un botón flotante en Excel?”
Muchas gracias Raymundo!!!!!!!
Gracias a ti, Jose María.
¡Un saludo!
Ufff, acabo de llegar aqui y me has salvado la vida, tenia un libro de excel con muchas hojas sobre cargadas de botones y esto es mi soliución, solo tengo un problema, es posible limitar el rango de actuacion del desplazamiento? Me interesa por ejemplo que solo se desplazara entre B12 Y B34, Saludoss y gracias
Hola, Eduardo. Pues habría que detectar el rango con un intersect y cancelar la acción si está dentro de lo que tú indicas.
Saludos
Hola Raymundo, buenas tardes.
Estoy leyendo este artículo, y quisiera saber si es posible que el botón se mantuviera en la parte superior de la pantalla mientras se hace scroll hacia abajo, no necesariamente cuando cambiamos de celda.
Gracias!
Hola, Ceci. Tendrías que meterte con las clases en VBA, un poco más complejo el tema.
Saludos
Excelente, me funciono logre cambiarle la forma e insetar otros botones…pero ahora quiero insertar un forma rectangular con fondo de color amarillo…intento enviarlo atras para que el texto de la celda resalte pero no lo hace como se haría en ese caso?
Hola, Jrd. La autoforma siempre estará sobre la celda, por eso en el ejemplo yo la pongo a un lado, sobre celdas que no tienen nada que pueda ser estorbado. También podrías reducir la opacidad de la autoforma, de manera que puede “verse a través” de la autoforma.
Saludos
Hola Raymundo, espero estés bien. Agradezco me ayudes con este caso.
Como hacer que el botón que contiene la macro este siempre al lado de una celda especifica, sin importar si agrego o elimino una fila por encima del botón.
Me funciono perfecto solo que el botón comenzó a acortarse (se llamaba “validacion de datos” luego “validacion” luego “valid” y luego desapareció por completo de la hoja) y ya no lo encuentro!!
Super agradecida si me puede ayudar!
Raymundo hola, buenas tardes, como se podría hacer para que se mueva en una sola columna y que esté limitado entre dos filas, es decir q se mueva en la columna B, pero solo entre las filas 2 y 20?
Hola Raymundo, por favor me puedes ayudar, quiero ubicar el botón al lado izquierdo de la celda seleccionada.
no puedo crear la macro alguien podria ayudarme ?
Gracias, Raymundo; He conseguido mover el botón hacia la derecha (.Left = Cells(fila, columna + 4).Left); peroquisiera ponerlo justo debajo de la CeldaActiva
Lo he conseguido:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveSheet.Shapes.Range(“botonPASTE”).Top = ActiveCell.Top + 16
ActiveSheet.Shapes.Range(“botonPASTE”).Left = ActiveCell.Left
End Sub
(En mi caso todas las filas tienen alto “16”; aunque no me preocupa, no sé como debería hacer si fuese altura variable, Gracias de todos modos)
¿Cómo puedo hacer para que eso me funcione solamente en un rango de celdas? No quiero que me siga por toda la hoja del libro
Hola Javier.
Pues en ese caso tendrías que limitarlo al rango deseado. En el evento WorkSheet_SelectionChange podrías usar el método Intersect, pasándole el rango donde sí quieres que aparezca:
If Intersect(ActiveCell, Range(“A1:F1000”)) Is Nothing Then
Else
‘ Aquí meterías el código a partir de fila = Target.row
End If
Saludos