Crear Botones

21/06/2004 - 17:47 por gema.bernardo | Informe spam
Hola Héctor.. y demás gente!

Hace unos días me respondiste a la duda de como crear botones
dinámicamente en una hoja excel. Lo que contabas es totalmente válido,
pero no del todo aplicable a mi caso... Me explico:

La idea es crear botones en una hoja en posiciones dinamicas y con
diferentes funcionalidades... Tal y como indicabas, me creo un boton de
formulario y le asigno una posicion y una macro a ejecutar tal y como se
puede ver en el código q me pasaste:

Private Sub AgregarBoton( _
ByVal Hoja As Worksheet, _
ByVal Ubicacion As String, _
ByVal Título As String, _
ByVal Macro As String)
Dim Izquierda As Single, Arriba As Single, Ancho As Single, Alto As
Single
With Hoja
Izquierda = .Range(Ubicacion).Left
Arriba = .Range(Ubicacion).Top
Ancho = .Range(Ubicacion).Width
Alto = .Range(Ubicacion).Height
With .Buttons.Add(Izquierda, Arriba, Ancho, Alto)
.Caption = Título
.OnAction = Macro
End With
End With
End Sub

Ejecutando este procedimiento todo ok... pero como le puedo pasar
parametrod a la macro???? La idea es ahorrar en macros y no tener
1macro/boton dado que voy a tener del orden de 120 botones, pero la
funcionalidad solo varia de pintar en una u otra hoja. Ejemplo:

Tengo que construir una tabla con dos filas y dos columnas en "hoja1":

Dia 1 | BOTON1
Dia 2 | BOTON2

y quiero que usando la misma macro para los dos botones,
- Si pincho en BOTON1, le paso el parametro 1 a la macro, y pinto en la
celda A1 de la "hoja2": DIA 1.
- Si pincho en BOTON1, le paso el parametro 1 a la macro, y pinto en la
celda A1 de la "hoja3": DIA 2.


Y por ultimo una curiosidad... cual es la diferencia entre usar un boton
de Formulario y un Control ToolBox?????????

Un saludo de una informatica recien llegada al mundo del EXCEL ;-) y
gracias por adelantado.

Gema Bernardo.

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
22/06/2004 - 06:48 | Informe spam
hola, Gema !

... como crear botones dinamicamente ... totalmente valido ... pero no del todo aplicable a mi caso...
... este procedimiento todo ok... pero como le puedo pasar parametros a la macro????
... idea es ahorrar en macros y no tener 1macro/boton ... voy a tener del orden de 120 botones
... la funcionalidad solo varia de pintar en una u otra hoja. Ejemplo:
Dia 1 | BOTON1
Dia 2 | BOTON2
y quiero que usando la misma macro para los dos botones,
- Si pincho en BOTON1, le paso el parametro 1 a la macro, y pinto en la celda A1 de la "hoja2": DIA 1.
- Si pincho en BOTON2, le paso el parametro 2 a la macro, y pinto en la celda A1 de la "hoja3": DIA 2.

Y ... una curiosidad... cual es la diferencia entre usar un boton de Formulario y un Control ToolBox?????????



para la primera parte de esta consulta [y segun 'entiendo'], la 'tematica' es +/- como sigue...
Boton1 => 'DIA 1' [en la celda 'A1'] => de la 'Hoja2'
Boton2 => 'DIA 2' [en la celda 'A1'] => de la 'Hoja3' [... hasta ...]
Boton120 => 'DIA 120' [en la celda 'A1'] => de la 'Hoja121'
[es decir...] 'el numero' del boton ES el numero de dia [en la celda 'A1'] de la hoja [numero_de_boton + 1]
=>se supone que la hoja a la que 'afectara' el boton [segun su numero]... EXISTE !!!<si lo anterior es 'acertado'... 'basta' con que la macro 'unica/general'... 'tome' [o... 'lea'] el numero del boton 'clickado' ;)
=>para 'asegurar' la correcta 'lectura' del numero de boton... 'asegurate' que a la hora de 'generarlo/s'...
'exista' UN ESPACIO entre el 'nombre' del boton y su numero 'correspondiente'< el 'como se las averigue' la macro [general/unica] para todos los botones... te expongo un ejemplo al final ;)

con respecto de la diferencia entre los objetos de las barras de herramientas [formularios - cuadro de controles]...
- los de 'cuadro de controles' NO tienen una propiedad 'OnAction' [para 'asignar' macros a los mismos] :((
- aunque tambien los puedes 'incrustar' en hojas [por codigo]...
=> las macros que 'ejecutan' estan 'asociadas' a eventos [p.e. 'click'] en el modulo de codigo de la hoja donde 'estan'
=> al crearlos 'al vuelo'... [tambien] es necesario 'generar' sus codigos [para cada uno de ellos] :((
=> lo anterior... nos deja con la necesidad de 'generar' [por lo menos] TRES lineas de codigo para cada uno :(((
y... si la idea es 'ahorrar' en macros... \׆×/

¿comentas?
saludos,
hector.
- ... usando la 'misma' macro [AgregarBoton] ...
macros en un modulo de codigo 'normal' ==' esta macro agrega tres botones [81, 82 y 83] para afectar a las hojas Hoja82, Hoja83 y Hoja84 _
si no 'estas' en 'Hoja1'... cambia => Hoja:=ActiveSheet <= por => Hoja:=Worksheets("Hoja1") <= _
observa que el titulo del boton tiene un espacio ANTES de 'ponerle' el numero correspondiente al boton '
Sub AgregarVariosBotones()
Dim CeldasBoton As Variant, NumerosBoton As Variant, Sig As Integer
CeldasBoton = Array("b1", "d3", "f5:g6")
NumerosBoton = Array(81, 82, 83)
For Sig = LBound(CeldasBoton) To UBound(CeldasBoton)
Call AgregarBoton( _
Hoja:=ActiveSheet, _
Ubicacion:=CeldasBoton(Sig), _
Título:="Botón " & NumerosBoton(Sig), _
Macro:="AccionDeBotones")
Next
End Sub
' [esta seria] la macro que se asigna A TODOS los botones '
Private Sub AccionDeBotones()
Dim NumeroBoton As Integer
With ActiveSheet.Buttons(Application.Caller)
NumeroBoton = Val(Mid(.Caption, InStr(.Caption, " ") + 1))
End With
Worksheets("Hoja" & NumeroBoton + 1).Range("a1") = "DIA " & NumeroBoton
End Sub
Respuesta Responder a este mensaje
#2 gema.bernardo
22/06/2004 - 10:17 | Informe spam
Ufff gracias.. me ha venido genial la idea de usar el nombre del boton
para pasarle parametros... pero ahora dos cosillas más...

1) ¿Cómo puedo hacer para que no me salga el nombre del boton?
Se me ha ocurrido poner el caption del mismo color que le boton... pero no
doy con el color correspondiente, asi que si sabeis otra forma genial!!

Dim Bt As Object
Set bt = .Buttons.Add(Izquierda, Arriba, Ancho, Alto)
bt.Caption = "Hola"
bt.Font.ColorIndex = 3


2) ¿Y como se hace para localizar y borrar determinados botones de una
hoja?

Ejemplo: boton en Rango("A1")
¿como lo elimino mediante código VBA?


MUUUUUUUCHAS GRACIAS POR LA AYUDA QUE ME ESTAS PROPORCIONANDO.




Héctor Miguel wrote:

hola, Gema !

> ... como crear botones dinamicamente ... totalmente valido ... pero no del


todo aplicable a mi caso...
> ... este procedimiento todo ok... pero como le puedo pasar parametros a la


macro????
> ... idea es ahorrar en macros y no tener 1macro/boton ... voy a tener del


orden de 120 botones
> ... la funcionalidad solo varia de pintar en una u otra hoja. Ejemplo:
> Dia 1 | BOTON1
> Dia 2 | BOTON2
> y quiero que usando la misma macro para los dos botones,
> - Si pincho en BOTON1, le paso el parametro 1 a la macro, y pinto en la


celda A1 de la "hoja2": DIA 1.
> - Si pincho en BOTON2, le paso el parametro 2 a la macro, y pinto en la


celda A1 de la "hoja3": DIA 2.

> Y ... una curiosidad... cual es la diferencia entre usar un boton de


Formulario y un Control ToolBox?????????

para la primera parte de esta consulta [y segun 'entiendo'], la 'tematica'


es +/- como sigue...
Boton1 => 'DIA 1' [en la celda 'A1'] => de la 'Hoja2'
Boton2 => 'DIA 2' [en la celda 'A1'] => de la 'Hoja3' [... hasta ...]
Boton120 => 'DIA 120' [en la celda 'A1'] => de la 'Hoja121'
[es decir...] 'el numero' del boton ES el numero de dia [en la celda 'A1']


de la hoja [numero_de_boton + 1]
=>se supone que la hoja a la que 'afectara' el boton [segun su numero]...


EXISTE !!!<> si lo anterior es 'acertado'... 'basta' con que la macro 'unica/general'...
'tome' [o... 'lea'] el numero del boton 'clickado' ;)
=>para 'asegurar' la correcta 'lectura' del numero de boton... 'asegurate'


que a la hora de 'generarlo/s'...
'exista' UN ESPACIO entre el 'nombre' del boton y su numero


'correspondiente'<> el 'como se las averigue' la macro [general/unica] para todos los
botones... te expongo un ejemplo al final ;)

con respecto de la diferencia entre los objetos de las barras de


herramientas [formularios - cuadro de controles]...
- los de 'cuadro de controles' NO tienen una propiedad 'OnAction' [para


'asignar' macros a los mismos] :((
- aunque tambien los puedes 'incrustar' en hojas [por codigo]...
=> las macros que 'ejecutan' estan 'asociadas' a eventos [p.e. 'click'] en


el modulo de codigo de la hoja donde 'estan'
=> al crearlos 'al vuelo'... [tambien] es necesario 'generar' sus codigos


[para cada uno de ellos] :((
=> lo anterior... nos deja con la necesidad de 'generar' [por lo menos]


TRES lineas de codigo para cada uno :(((
y... si la idea es 'ahorrar' en macros... ׆×/

¿comentas?
saludos,
hector.
- ... usando la 'misma' macro [AgregarBoton] ...
macros en un modulo de codigo 'normal' ==> ' esta macro agrega tres botones [81, 82 y 83] para afectar a las hojas


Hoja82, Hoja83 y Hoja84 _
si no 'estas' en 'Hoja1'... cambia => Hoja:=ActiveSheet <= por =>


Hoja:=Worksheets("Hoja1") <= _
observa que el titulo del boton tiene un espacio ANTES de 'ponerle' el


numero correspondiente al boton '
Sub AgregarVariosBotones()
Dim CeldasBoton As Variant, NumerosBoton As Variant, Sig As Integer
CeldasBoton = Array("b1", "d3", "f5:g6")
NumerosBoton = Array(81, 82, 83)
For Sig = LBound(CeldasBoton) To UBound(CeldasBoton)
Call AgregarBoton( _
Hoja:=ActiveSheet, _
Ubicacion:=CeldasBoton(Sig), _
Título:="Botón " & NumerosBoton(Sig), _
Macro:="AccionDeBotones")
Next
End Sub
' [esta seria] la macro que se asigna A TODOS los botones '
Private Sub AccionDeBotones()
Dim NumeroBoton As Integer
With ActiveSheet.Buttons(Application.Caller)
NumeroBoton = Val(Mid(.Caption, InStr(.Caption, " ") + 1))
End With
Worksheets("Hoja" & NumeroBoton + 1).Range("a1") = "DIA " & NumeroBoton
End Sub
Respuesta Responder a este mensaje
#3 Héctor Miguel
22/06/2004 - 20:59 | Informe spam
hola, Gema !

... me ha venido ... usar el nombre del boton para pasarle parametros


=> gracias por el 'feed-back' ;)

... dos cosillas mas...
1) ¿... que no me salga el nombre del boton?
Se me ha ocurrido poner el caption del mismo color que le boton... pero no doy con el color correspondiente [...]
2) ¿Y como se hace para localizar y borrar determinados botones de una hoja?
Ejemplo: boton en Rango("A1") ¿como lo elimino mediante codigo VBA?



1.- considerando que los colores de caras y texto en los botones los 'maneja' windows [y cada usuario] :((
[yo creo que...] sera mejor 'dejar en blanco' la propiedad 'caption' y 'pasarle' el nombre a la propiedad 'name' :))
a) =>modifica el bloque 'with' en el procdimiento 'AgregarBotones' [al crear los botones] a lo siguiente...
With .Buttons.Add(Izquierda, Arriba, Ancho, Alto)
.Caption = ""
.Name = Titulo
.OnAction = Macro
End With
b) => y... sustituye [en la macto 'general'] la 'captura' del numero de boton para que lo 'tome' de la propiedad 'name'...
With ActiveSheet.Buttons(Application.Caller)
NumeroBoton = Val(Mid(.Name, InStr(.Name, " ") + 1))
End With

2.- para eliminar los botones [y/o cualquier figura] en una celda especifica...
es necesario hacer un 'barrido' por TODAS los objetos 'Shape' de la hoja y 'comparar' su ubicacion ;)
un 'ejemplo' de un procedimiento que puedas usar de manera 'independiente' [como el de 'AgregarBotones'] seria...
en un modulo de codigo 'normal' ==Private Sub EliminarBoton( _
ByVal Hoja As Worksheet, _
ByVal Celda As String)
Dim Boton As Shape
With Hoja
For Each Boton In .Shapes
If Boton.TopLeftCell.Address = Range(Celda).Address Then Boton.Delete
Next
End With
End Sub
¨¨¨¨¨¨¨¨¨¨¨¨¨
y... la manera de 'llamarlo' [desde cualquier otra parte de tu codigo] seria...
[... otras lineas en tu codigo ...]
EliminarBoton ActiveSheet, "b2"

[... otras lineas en tu codigo ...]

¿comentas?
saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida