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

Asociar un macro a un botón

Un problema con el que se encuentran los usuarios de excel que están empezando con el tema de los macros, es poder asociarlos a un botón, para hacer más sencilla su utilización. La verdad es que la técnica es muy sencilla, y si vamos a distribuir nuestra hoja de cálculo entre amigos, compañeros, o simplemente vamos a colgarla en internet, el hecho de que la hoja tenga botones, le da cierto toque de profesionalidad, o de ser una hoja de cálculo hecha por alguien que aparentemente domina todos los secretos de excel.

Si los macros son un jeroglífico para ti, no te preocupes, en realidad no son tan complicados. Si quieres aprender sobre su uso, puedes consultar este artículo donde explico como hacer macros.

Para poder asociar un macro a un botón, necesitaremos tener un macro. Vamos a suponer que tenemos uno de los macros más sencillos que podemos hacer, para imprimir la hoja activa, es decir, para imprimir la hoja de cálculo que tenemos en primer plano, o sea, aquella con la que estamos trabajando (para que nos funcione, deberemos tener algo escrito en la hoja de cálculo, pues en caso contrario, no podremos imprimir nada):


Sub imprimir_hoja()
'Imprimimos la hoja de excel con una sola copia
ActiveWindow.SelectedSheets.PrintOut Copies:=1
End Sub


Ahora nos queda hacer lo más visual, se decir, el botón para asociar el macro al mismo. Así nos ahorraremos el tener que seleccionar el macro desde el menú Herramientas, seleccionando a continuación Macro, luego Macros..., y finalmente el macro que deseamos ejecutar, de la lista que se nos muestra.

Para crear el botón, vamos a suponer que tenemos una hoja de cálculo como la que muestra la siguiente imagen:


Y vamos a suponer que lo que deseamos es que nos quede así, con un botón al lado de la tabla:


Para ello, lo primero que tendremos que hacer, es copiar el macro llamado imprimir_hoja, cuyo código os puse más arriba. Hay que copiarlo en un módulo VBA. Para acceder al modo VBA, desde excel pulsaremos la tecla Alt, y a continuación, y sin soltar esa tecla, pulsaremos la tecla F11. Ahora ya tendremos el modo VBA (Visual Basic para Aplicaciones) delante de nuestras narices. Para pegar el código del macro, seleccionaremos desde el modo VBA, en el menú Insertar, la opción Módulo. Ahí, en esa pantalla que nos aparecerá, es donde deberemos pegar el código del macro que os puse anteriormente.

Una vez hecho eso, cerraremos la ventana VBA, y volveremos a excel. Ahora, ya desde excel, y sin cerrar el libro activo (pues es en ese libro donde hemos grabado el macro), seleccionaremos en el menú Ver, la opción Barra de herramientas, y seleccionaremos Formularios. Y nos aparecerá en pantalla esta nueva barra de herramientas, como esta que podéis ver a la izquierda.

Como cualquier otra barra de herramientas, desde excel la podremos mover por la pantalla, y colocarla si lo deseamos debajo o encima de las que ya tenemos, o a la izquierda o la derecha, para que no nos ocupe tanto espacio en la pantalla.

Ahora pulsaremos sobre el icono del botón que aparece en esa barra de formularios, y que he indicado con una flecha de color rojo.

Ahora tan solo deberemos acceder a aquella parte de la hoja de cálculo donde deseamos dibujar el botón, y con el botón izquierdo del mouse presionado, comenzaremos a dibujarlo. Cuando veamos que su tamaño nos convence, soltaremos el botón izquierdo del mouse, y veremos como a continuación nos aparece una pantalla como esta, para asociar el botón a un macro:


Tan solo deberemos seleccionar el macro imprimir_hoja que nos aparece allí, y pulsaremos el botón Aceptar. Ahora, ya podremos cerrar la barra de formularios, para lo cual podremos hacer varias cosas: cerrar la barra, pulsando el aspa (la X que aparece arriba a la derecha), o bien volviendo al menú Ver, seleccionando la opción Barra de herramientas, y pulsaremos sobre la opción Formularios, que nos aparece marcada con una muesca a su izquierda, así, de esa forma, al cliqeuar sobre ella, la deseleccionaremos (se simultanean la selección, y la deselección).

Ya casi para finalizar, lo que haremos será cambiarle el nombre al botón. Como veremos, nos aparece el nombre por defecto Botón 1. Para cambiarle el nombre tenemos varias opciones, pero elegiremos la más sencilla para no tener problemas:


Pulsaremos sobre el botón llamado Botón 1, pero con el botón derecho del mouse (si pulsamos con el botón izquierdo, se ejecutará el macro asociado al mismo, es decir, se imprimirá la hoja de cálculo). Cuando pulsemos con el botón derecho del mouse, nos aparecerá un menú de opciones. Seleccionaremos Modificar texto (seleccionaremos esta opción, con el botón izquierdo del mouse, como se selecciona algo normalmente). Al hacer eso, veremos como el puntero del mouse parpadea dentro del botón, justo delante de su nombre, para que lo cambiemos a nuestro antojo. Si lo deseamos, podemos ponerle por nombre Imprimir hoja. Hemos de tener en cuenta que cuanto más descriptivo sea el nombre del botón, más sencillo será saber que es lo que hace el macro asociado al mismo.

Si haciendo pruebas, habéis puesto más botones de la cuenta y deseáis eliminarlos, seleccionáis el botón en cuestión, con de la misma forma que para editar el texto del mismo, es decir, pulsando con el botón derecho del mouse sobre el botón del macro, de tal forma que os aparezca como en la siguiente imagen, con una selección alrededor del mismo, y pulsaremos la tecla Supr (suprimir), para eliminar el botón:


A partir de ahora, darle a tus hojas de cálculo tendrán un toque de distinción y profesionalidad, va a ser una tarea muy sencilla, porque como veis, esto de crear botones para asociarlos a un macro, no tiene ningún secreto.



39 comentarios:

hfajardo dijo...

Hola Javier Marco:
Felicitaciones por este magnifico aporte, muy didáctico y sencillo tus explicaciones, sigue compartiendo tu experiencia...graciassssss por haber profesionales como tu.

Te pido por favor ampliar un poco mas el tema de macros para leer ficheros de texto, por ejemplo, como copiar valores determinados en celdas determinadas?. Digamos que tenemos un listado de valores en txt:

aaaaaaa
fffffff
a=5 m=10 x=120
b=3 n=4 y=150
c=1 p=8 z=100

ddddd
a=0 m=356 x=15
b=11 n=24 y=9
c=12 p=7 z=6

....etc

Como pasariamos los valores de x,y,z en las celdas A1,B1,C1..., A2,B2,C2, ...etc, teniendo presente que existen mas datos donde se repiten dicha estructura... dando la opción de buscar el fichero, que podria estar en cualquier ruta.
Reitero mis agradecimientos. ¡¡¡Feliz 2009!!!

Javier Marco dijo...

Mírate esta entrada donde hablo de como leer un fichero de texto. De ahí podrás sacar algunas ideas, como leer el número de línea que corresponda (3, 4, 5, 8, 9, 10, etc...). Luego tendrás que pasar los datos a variables. Supongamos que pasas la línea 3 donde tienes:

a=5 m=10 x=120

Metes ese dato en un vector (un array), recuperas el tercer elemento del vector, es decir, x=120, y si quieres simplificarlo, haces un reemplazo:
variable =
replace(variable,"x=","")

y en la variable, tendrás el valor 120. Solo te quedará grabarlo en la celda que deses.

Así con cada dato.

jesus dijo...

Hola.
Enhorabuena por tu blog que trata sobre excel, un programa que yo utilizo casi para cualquier cosa que tengo que hacer. Aunque tu blog no sea un consultorio sobre manejo de excel, si pudieras ayudarme te lo agradecería eternamente. No consigo hacer algo que ya estoy llegando a pensar que no se puede hacer. Se trata de guardar una hoja excel dándole como nombre el contenido de una celda determinada. He probado con una macro de guardar como... sustituyendo Libro1.xls, el nombre que guarda por defecto por Range("A1").Select que es la celda que contiene el nombre como quiero que se guarde, pero me da error de sintaxis. Tal vez debería usar una variable, pero no tengo ni idea de como. Si se te ocurre cómo, me ayudarías enormemente.
Gracias y un saludo.

hfajardo dijo...

Javier Marco:
Gracias por tu pronta respuesta, mi consulta va, como consecuencia de haber estudiado tu articulo que mencionas, esoy iniciandome en este maravilloso mundo de las macros, lo he intentado pero tengo algunos vacios, trabajo mucho con reportes similares y el copiado lo hago manualmente con el riesgo de cometer errores, por eso recurría a su amplio conocimiento.
Seguiré intentandolo, pero seria muy bueno que lo concretes en un ejemplo...
Gracias y estoy pendiente de tus maravillosos artículos...

Javier Marco dijo...

Si te da error de sintaxis es porque hay algún caracter raro que no excel no lo admite como nombre de fichero. Que recuerde ahora mismo, son estos, los caracteres que no se admiten (no pueden estar en la celda esa cuyo nombre quieres que tenga el fichero):

:/\?*[]

JULIAN dijo...

Muy buenos aportes, personalmente soy un principiante aficionado en excel, y estas herramientas has sido de mucha ayuda.
Puedes si no es mucha molestia, cada vez que publiques un truco nuevo informarme por mail o hacermelo llegar.

muchas gracias.

Javier Marco dijo...

Muchas gracias por tu comentario. Normalmente y si no hay contratiempos, cada semana suelo publicar algo, aunque puede que alguna semana no haya novedades :-)

Javier Marco dijo...

hfajardo, prueba esto (descárgalo), que igual te resuelve el problema ese que tienes de importación de datos desde un fichero de texto:

http://www.megaupload.com/es/?d=KJ4D8100

Espero que leas este comentario :-)

JULIAN dijo...

Estuve ensayando el codigo que dejaste para leer los seriales de los discos, con el fin de que un libro solo pueda ser utilizado en determindados computadores o usado determinado numero de veces, pero no he logrado que funcione.... me puedes colaborar con mas informacion sobre esta herramieta.

gracias

hfajardo dijo...

Javier, magnifico, estoy muy agradecido, una maravilla la macro, funciona a la perfección para datos que tenga la estructura que te solicite. Los reportes que uso tienen datos como E:,N:,Hgt: en los lugares de x=,y=,z= reemplazandolos funciona bien la Macro.
Pero permiteme una solicitud mas: que debo hacer para que funcione sin modificaciones teniendo en cuenta que despues de cada dos puntos hay espacios vacios, asi: "E: 798952.683" (tres espacios), "N: 9115975.974" (dos espacios) y "Hgt: 4196.884" (un espacio) y después de esta ultima linea hay un dato duplicado por extaer: "Orth: 4176.566". Además como sería si quiero extaer datos de angulos sexagecimales como 7 05 23 separados por espacios y que me muestre 7°05'23". Por favor necesito tu ayuda.
Gracias, estoy contento por tu respuesta, como te decía anteriormente, estoy pendiente de todo tus artículos y me estan sirviendo mucho. Quise enviarte imágenes para mas claridad pero no lo logré...
Saludos.

Javier Marco dijo...

hfajardo, en el aviso legal que encontrarás al pie de este blog, encontrarás mi correo electrónico. Seguimos por allí.

hfajardo dijo...

Gracias Javier, me comunicaré por dicho medio, felicitaciones por el blog, el mejor, ayuda a mucha gente.

hfajardo dijo...

Excelente solución Javier, la rutina funciona de maravilla, te agradesco infinitamente, eres el mejor, es increible las cosas que podemos hacer con las macros.
Graciasss, y sigo pendiente de todos tus artículos...

Javier Marco dijo...

Gracias por tu comentario. Yo solo soy un usuario más de excel :-)

Anónimo dijo...

MUY INTERESANTE, ESTO DE LAS MACROS, TENGO UNA DUDA ES POSIBLE ASIGNAR A UN BOTON 2 MACROS, TENGO UNA HECHA EN VISUAL BASIC (UN FORMULARIO DE ENTRADA DE DATOS) Y LA OTRA CON LA OPCION DE MACROS (VER - GRABAR NUEVA MACRO) QUE HACE UN PAR DE CALCULOS. NECESITO QUE SE EJECUTEN SIMULTANEAMENTE PERO SI TRATO DE ASIGNARSELA AL BOTON UNA EXCLUYE LA OTRA. QUE SOLUCION PUEDE HABER?. GRACIAS

Javier Marco dijo...

Puedes hacer lo siguiente: Asignar un macro a un botón, y que ese macro llame al otro macro. Para ello te bastará incluir el nombre del macro nº 2, en la última línea del macro nº 1. Algo como esto:

Sub aviso1()
MsgBox ("hola")
Call aviso2
End Sub

Sub aviso2()
MsgBox ("adiós")
End Sub

Si te fijas hay un: Call aviso2, porque estamos llamando al macro nº 2. Puedes omitir la palabra "Call", pues con poner solamente el nombre del macro nº 2, también funcionará.

Saludos

JULIAN dijo...

HOLAS, COMO HAGO PARA CREAR UN FORMULARIO DE ENTRADA DE DATOS, PERO QUE EL FORMULARIO ESTE EN UNA HOJA Y LOS DATOS SE ALMACENEN EN OTRA.

GRACIAS.

JULIAN dijo...

no he podido hacer que el codigo para leer el serial de un disco funcione, que puedo hacer.

quisera saber si tienes otro codigo para la misma funcion.

pablo dijo...

hola a todos

me pueden ayudar, nesecito dar activacion a un boton guardar, este boton debe guardar por ejemplo una planilla con los mismos datos pero un una base de datos, todo esto en excel por su pesto ya amigos gracias

Anónimo dijo...

hola amigos yo engo el siguiente problema yo tengo una hoja de calculo con valores tanto en el primer renglon como en la primera columna lo que yo quiero hacer es una macro que me busque a partir de la segun columna (b) hacia abajo si existe un valor en alguna celda si existe que pase a la siguiente columna y haga lo mismo si en la columna que esta checando no hay valor alguno que me haga una formula hacia abajo.
espero me entiendan mi correo es guerodiaz_1@yahoo.com.mx

Carlos dijo...

Estupendo y miy interesante este blog.
Muchas grácias al autor.

Anónimo dijo...

hola Javier, interesantisimo tu blog, solicito tu ayuda, en una hoja de excel deben capturar medidas, distancias, etc. y con un boton calcula todos los datos, quiero que despues de 20 veces que abran la hoja, poder eliminar el boton que hace los calculos porque es un demo.
¿Como puedo condicionarla a 20 usos? y ¿como eliminar el boton?, porque en el lugar del boton quiero poner un texto invitandolos a comprar esta aplicacion
gracias de antemano, bye.

Javier Marco dijo...

En este artículo seta explicado: Protegiendo nuestros trabajos en excel.

Anónimo dijo...

Excelente Javier, eso es lo que necesitaba, muchas gracias.

Anónimo dijo...

Gracias por tu aporte.

Tengo el siguiente inconveniente.
Cree una macro que al ejecutarla en forma manual me funciona sin problemas, sin embargo al indexarla a un botón, esta deja de funcionar, la macro es la que dejo a continuación, espero me puedas ayudar.

Sub Respuesta()
'
' Respuesta Macro
' Macro grabada el 26-02-2010 por Aguas
'

'

Range("A6:AD6").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Paso").Select
Range("A6").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Range("A5").Select
Selection.AutoFilter
Selection.End(xlToRight).Select
Selection.AutoFilter Field:=30, Criteria1:="Resuelto"
Cells.Select
Range("V1").Activate
Selection.Copy
Sheets.Add
ActiveSheet.Paste
Range("A1").Select
Sheets("Paso").Select
Selection.AutoFilter Field:=30
Range("A6:AD6").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.ClearContents
Selection.AutoFilter
Range("A5").Select
Sheets("Base").Select
Range("A5").Select
Selection.AutoFilter
Selection.AutoFilter Field:=30, Criteria1:="Resuelto"
Range("A5:AC5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Sheets("Paso").Select
Range("A5").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy
Sheets("Base").Select
Range("A5").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.AutoFilter
Range("A5:AD1168").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Sort Key1:=Range("G6"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Sheets("Paso").Select
Cells.Select
Selection.Copy
ActiveSheet.Previous.Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Sheets("Base").Select
Range("A5").Select

End Sub

Saludos,
Alex Bañados.

Anónimo dijo...

Lo deje dentro de un rectangulo y me funcionó.

El botón lo borre y asimilé el rectangulo a un botón.

No tengo idea porque no me funciona dentro de un botón, si manualmente y dentro de un rectangulo funciona correctamente.

Como solución parche me deja tranquilo.

Si tienen respuesta a mi problema se los agradezco.
Saludos,
Alex Bañados

Germán S dijo...

Hola tengo una pregunta, se puede crear un boton que ejecute un solver en la hoja de calculo?

Javier Marco dijo...

Es un poco más complicado, pero se puede.

Lo explico para Excel 2003. Lo primero que tienes que hacer es cargar el complemento de Solver: Herramientas --> Complementos --> Muesca en Solver.

Luego te vas al entorno VBA (Alt + F11). Desde el menú Herrmientas --> Referencias --> Cargas el complemtno de Solver. Si no te aparece en la lista, le das al botón examinar, y buscar las ubicación esta: C:\Archivos de programa\Microsoft Office\OFFICE11\Macros\SOLVER y haces clic en el fichero "Solver.xla" (para verlo, recuerda seleccionar: todos los archivos, en el tipo de archivos a mostrar, cuando te cargue esa ventana para examinar).

Una vea cargado el complemento Solver.xla, te vas a un módulo y creas un macro como este (esun ejemplo):

Sub Lanzar_solver()
SolverAceptar definirCelda:="$D$11", valorMáxMín:=1, valorDe:="0", _
celdasCambiantes:="$D$7"
SolverResolver
Range("G24").Select
End Sub

De esa forma tendrás Solver en un macro, y sin errores de funciones desconocidas, o falta de memoria (mensajes que suelen salir, cuando no se han cargado los complementos solver).

Saludos.

Karla dijo...

Hola Javier Marco, muchas gacias por tu blog es muy bueno, sin embrgo tengo una duda con lo de asociar un macro a un boton, ddo q estoy utilizando la versión 2007 no logro encontrar la barra de herramientas de formularios, he logrado colocar el boton de formularios en la barra de acceso rapido pero no esa barra de la cual tu sacaste el botón, me podrias ayudar?

Muchas gracias desde ya

Javier Marco dijo...

Karla, pincha en la ficha de "Programador" (la de la derecha del todo), y luego en "Insertar". Allí podrás añadir el botón correspondiente.

Si no ves la ficha de Programador, haz clic en el botón redondo de arriba a la izquierda, y pincha en el botón de abajo que te saldrá (está algo escondido), y que pone “Opciones de Excel”. Luego en “Más frecuentes”, activa la casilla de verificación Mostrar llamada “Mostrar ficha Programador en la cinta de opciones”. Aceptas todo, y listo, te aparecerá la ficha de Programador, a la derecha de la ficha “Vista”.

Hector dijo...

Hola Javier Marco:
Enhorabuena por tu blog, me está resultado de gran utilidad. Tengo un problemilla y no se como solucionarlo. Estoy trabajando con Excel 2007 y quiero hacer lo siguiente: al pulsar un botón, se ejecuta una macro que realiza unas operaciones matemáticas en unas determinadas celdas. Como puedo hacer para que al pulsar otro botón, se ejecute otra macro que también realiza operaciones matemáticas, pero que las fórmulas están ubicadas en las mismas celdas de la macro anterior.
Gracias y un saludo.

William dijo...

Hola JULIAN tengo una consulta es la siguiente: como realizo la opcion de escoger dentro de una base de datos el dato principal y los que estan al lado de este , que formula utilizo, no encuentro como hacerlo, me puedes ayudar gracias

William dijo...

Pregunta : necesito realizar un ejercicio con una condicion: las variables son 10 y solo la formula de si aplica hasta 7 , como realizo las otras?

Javier Marco dijo...

Si no recuerdo mal, los anidamientos condicionales están limitados en Excel 2003 a 7 anidamientos, mientras que en Excel 2007 son 32 anidamientos.

Una forma de saltarse esa limitación, es poniéndole nombre a las funciones. Aquí lo tienes explicado: http://www.cpearson.com/excel/nested.htm

Aquí puedes aprender a ponerle nombre a las celdas, que es lo mismo para las funciones.

Anónimo dijo...

MUCHAS GRACIAS. ESTOY COMENZANDO A MANEJAR MACROS...
DESDE LO FÁCIL SE LLEGA A LO COMPLEJO

Anónimo dijo...

Felicitaciones por tus aportes, he aprendido mucho contigo. Tengo una duda, en un comentario se ha explicado como asociar 2 macros a 1 botón, pero existe la posibilidad que esas 2 macros fueses opuestas??, es decir, que si pincho una vez al boton se me oculte una fila, y cuando pinche otra vez se me muestre. Un saludo, y muchas gracias por todo

Javier Marco dijo...

Efectivamente, se puede hacer. Simplemente debes controlar la acción con un condicional, para comprobar si la fila está oculta, y mostrarla, o viceversa. Aquí tienes el ejemplo:

Sub Ocultar_y_desocultar()
'Seleccionamos la fila 5
Rows("5:5").Select
'Si la fila está visible, la ocultamos
If Selection.EntireRow.Hidden = True Then
Selection.EntireRow.Hidden = False
'en caso contrario, es decir, si está oculta, entonces la mostramos
Else
Selection.EntireRow.Hidden = True
End If
End Sub

Simplemente recuerda no colocar el botón del macro en la fila que vayas a ocultar, para tenerlo siempre visible.

Saludos.

Anónimo dijo...

Muchiiiiiiisimas gracias, funciona perfectamente, ayudas a muchas personas con sus dudas.

Anónimo dijo...

Gracias!!!