Hacer referencia a un elemento de submenu

03/11/2006 - 02:59 por Ivan | Informe spam
Hola a todos

tengo una una barra de menus con varios submenus, a cuyos elementos no
se como hacer referencia directa/sencilla una vez creados, o sea, en
procedimientos independientes del de creacion. Hasta ahora lo estoy
haciendo a base de sucesivos bucles ->

Menus->Submenu->Elemento

aunque asi parece funcionar bien, supongo que debe de haber forma de
nombrarlos sin los bucles.
He hecho varias pruebas tipo ->

-> With Commandbars(index).Controls(index): .Controls(index)

o directamente-> Commandbars("Caption")

pero de momento me da error.

este proc. es un ej. de uso que funciona bien: ->

Sub Actualizar_Visibles()
Dim Ind As Long
Dim Menu As CommandBarControl
Dim OpMenu As CommandBarControl
With Hoja1
For Each Menu In Application.CommandBars("Menus_Libreria").Controls
If Menu.Index = 2 Then
For Each OpMenu In Menu.Controls
If OpMenu.Index = 3 Then
For Ind = 1 To 4
Select Case Hoja1.Range("H" & 15 + Ind).Value
Case "Marcado": OpMenu.Controls(Ind).FaceId = 1087
Case "Desmarcado": OpMenu.Controls(Ind).FaceId = 1088
End Select
Next
End If
Next
End If
Next
End With
End Sub

como veis, aunque funcione bien, no deja de ser un poco engorroso tanto
codigo para decir solamente algo asi como->

-> Si la Celda(tal)="Cual" entonces el Elemento(tal).FaceId=x

bueno, supongo que lo que pienso es posible, pero hasta ahora no lo he
conseguido. Si podeis echarme 'otra' mano os lo agradezco

un saludo y hasta pronto
Ivan

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
03/11/2006 - 05:59 | Informe spam
hola, Ivan !

tengo una una barra de menus con varios submenus
a cuyos elementos nose como hacer referencia directa/sencilla una vez creados
o sea, enprocedimientos independientes del de creacion.
Hasta ahora lo estoyhaciendo a base de sucesivos bucles -> Menus->Submenu->Elemento
aunque asi parece funcionar bien, supongo que debe de haber forma denombrarlos sin los bucles.
He hecho varias pruebas tipo -> With Commandbars(index).Controls(index): .Controls(index)
o directamente-> Commandbars("Caption")
pero de momento me da error. [...]
no deja de ser un poco engorroso tantocodigo para decir solamente algo asi como->
-> Si la Celda(tal)="Cual" entonces el Elemento(tal).FaceId=x
bueno, supongo que lo que pienso es posible, pero hasta ahora no lo he conseguido...



[creo que] te serviria revisar las tecnicas que se describen en los siguientes enlaces:

John Walkenbach
Creating Custom Menus
http://www.j-walk.com/ss/excel/tips/tip53.htm

Ron De Bruin
Disable command bars and controls
http://www.rondebruin.nl/menuid.htm
http://www.rondebruin.nl/menuid.htm#articles

saludos,
hector.
Respuesta Responder a este mensaje
#2 Ivan
03/11/2006 - 17:32 | Informe spam
hola Hector Miguel, muchas gracias de nuevo

he de confesar que ya estaba usando una adaptacion del 'truco' de J.W.
para crear las barras (mediante una lista en una hoja), y que mi 2º
maestro, despues del foro, es su libro sobre VBA en excel 2003

pero aun asi no conseguia encontrar (seguramente por falta de
atencion/comprension) la manera de hacer referencia a un elemento (no
integrado) de un submenu(tampoco integrado) sin recurrir a los bucles

ahora, tras recorrer tus enlaces y los enlaces de tus enlaces
(consecuencia directa de mi precario ingles) me parece entender que,
aunque se puede prescindir de los bucles, es necesario declarar una
variable de objeto para referirse al elemento deseado, o sea, que no se
puede hacer referencia a el sin crear esta previamente,

-> por ej: Controls("MiElemento") creo entender que no seria valido,
que habria que hacer algo asi ->

-> Dim MiSubMenu as CommandBarControl
Set MiSubMenu Application.Commandbars("MiBarra").Controls("MiMenu")
MiSubmenu.Controls("MiElemento").FaceId = x

esto resolveria mi duda, pero no acabo de estar seguro de si existe la
otra posibilidad (la mencion directa), teniendo en cuenta que las
barras y sus elementos ya estarian creadas.

no se si he captado bien lo que he visto en los vinculos, pero esto es
a lo que he llegado, al menos de momento

en cualquier caso gracias de nuevo, y si puedes acabar de aclararme
esta duda, te lo agradezco

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#3 Héctor Miguel
03/11/2006 - 21:31 | Informe spam
hola, Ivan !

... ya estaba usando una adaptacion del 'truco' de J.W... pero aun asi no conseguia encontrar
... la manera de hacer referencia a un elemento (no integrado) de un submenu (tampoco integrado) sin recurrir a los bucles
... me parece entender que, aunque se puede prescindir de los bucles, es necesario declarar una variable de objeto
para referirse al elemento deseado, o sea, que no se puede hacer referencia a el sin crear esta previamente [...]
... pero no acabo de estar seguro de si existe la otra posibilidad (la mencion directa)
teniendo en cuenta que las barras y sus elementos ya estarian creadas.
no se si he captado bien lo que he visto en los vinculos, pero esto es a lo que he llegado, al menos de momento..



puedes usar/llamar/referenciar/.. 'control tras control' [siempre y cuando los controles 'dependientes' SI existan] +/- como sigue:
[piensa en los elementos integrados de la barra de menus de hoja de calculo en los siguientes 'niveles']:
1.- barra de menus de la hoja [numero de indice: 1, nombre 'interno': "worksheet menu bar"]
2.- menu formato [numero de indice: 5, nombre: el caption depende del idioma de la aplicacion]
3.- comando fila [numero de indice: 2, nombre: el caption depende del idioma de la aplicacion]
4.- comando alto de fila [numero de indice: 1, nombre: el caption depende del idioma de la aplicacion]

1.- MsgBox Application.CommandBars(1).Name ' o NameLocal
2.- MsgBox Application.CommandBars(1).Controls(5).Caption
3.- MsgBox Application.CommandBars(1).Controls(5).Controls(2).Caption
4.- MsgBox Application.CommandBars(1).Controls(5).Controls(2).Controls(1).Caption

si en lugar de los 'indices'... conoces [+/- exactamente] el 'Caption' de los [sub]controles [o administras la propiedad '.Tag'] ;)

saludos,
hector.
Respuesta Responder a este mensaje
#4 Ivan
04/11/2006 - 01:18 | Informe spam
hola Hector Miguel, gracias de nuevo

la verdad es que esta era una de las formas que creia haber probado sin
resultado (de ahí mi duda), pero algo debia hacer mal porque no lo
conseguia. Ahora este nuevo codigo funciona perfectamente, y ademas mi
duda queda totalmente aclarada ->

Sub Actualizar_Visibles()
Dim ind As Byte
With
Application.CommandBars("Menus_Libreria").Controls(2).Controls(3)
For ind = 1 To 4
Select Case Hoja1.Range("H" & 15 + ind).Value
Case "Marcado": .Controls(ind).FaceId = 1087
Case "Desmarcado": .Controls(ind).FaceId = 1088
End Select
Next
End With
End Sub

ahora, si me lo permites, una (pen)ultima consulta relacionada

¿es posible hacer referencia al elemento de menu 'Clickado'? me
refiero a algo parecido a 'If activecontrol=application.Controls(x)
then' , se trata de nuevo de intentar evitar los modulos de clase del
evento click de los commandbarscontrols, pero reconocer si se ha
elegido tal o cual opcion.

el motivo es asignar una misma macro a varios elementos, y que la macro
reconozca cual ha sido el pulsado para obrar en consecuencia.

bueno, no se si me he explicado, pero en cualquier caso muchas gracias
otra vez

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#5 Héctor Miguel
04/11/2006 - 02:19 | Informe spam
hola, Ivan !

es posible hacer referencia al elemento de menu 'Clickado'?... algo parecido a 'If activecontrol=application.Controls(x) then'
se trata de nuevo de intentar evitar los modulos de clase del evento click de los commandbarscontrols
pero reconocer si se ha elegido tal o cual opcion.
el motivo es asignar una misma macro a varios elementos, y que la macro reconozca cual ha sido el pulsado para obrar en consecuencia...



op1: cuando un boton en barras/menus de comandos tiene asignada un procedimiento con la propiedad .OnAction
el procedimiento asignado puede 'identificar quien lo ha llamado'... a traves de una instruccion Application.Caller que devuelve...
- una matriz horizontal de 3 elementos [si el boton esta en una barra de menus]:
(1) la posicion del comando, (2) el numero del menu, (3) el numero de la barra de menus
- una matriz horizontal de 2 elementos [si el boton esta en una barra de herramientas]:
(1) la posicion del comando, (2) el nombre de la barra de herramientas

op2: podrias desarrollar un procedimiento +/- 'general' [pero] que 'tome parametros' y [al momento de asignar el procedimiento]...
en la propiedad .OnAction para cada commandbarcontrol/button podrias agregar un 'identificador'
[p.e. la mismisima propiedad '.Caption' o '.Tag' de cada control] que haga las veces del parametro de la macro
y asi el procedimiento [unico y general] estaria en condiciones de saber cual boton es el que fue pulsado

[seguramente] habra otras alternativas y/o variantes/combinaciones/... [considerando que todavia hay otras propiedades y metodos] :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida