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

#6 Ivan
04/11/2006 - 04:50 | Informe spam
hola Hector Miguel, como siempre tu ayuda vale un 'potosí', gracias de
nuevo

lo primero un inciso -> creo que se me ha ido un poco la 'pelota' con
lo del evento click (me he liado con el change de los combobox), pero
de todas formas has cogido la idea totalmente

bueno, aunque por aqui empieza a ser un 'mucho' tarde, y la mencionada
pelota puede tener mas de un rebote en falso, te comento un poco sobre
lo que veo en tu respuesta (sin haber hecho pruebas) y sobre mis
intenciones

sobre la op1 -> no lo conocia y creo que me va a ser bastante util para
otras situaciones, pero para el actual caso (comandos de submenu) ¿es
posible una matriz de 4 elementos, o el maximo es de 3?, supongo que
vendra en la ayuda, pero como te comentaba ni siquiera lo he mirado

sobre la op2 -> aqui me ocurre lo mismo que antes: en algunas ocasiones
he intentado asignar a la prop. OnAction de un comando un procedimiento
con argumentos y no me lo ha permitido ¿quizas no tenga que llevar las
comillas si tiene argumentos?¿o que puedo haber hecho mal? si no
recuerdo mal, me decia que el argumento no era opcional, pero si no me
equivoco si lo tenia asignado (incluso creo recordar que era el propio
caption, aunque no te lo aseguro)

paso a contarte por encima este caso en concreto: se trata de emular el
Ver -> Barras de herramientas -> Barra tal...

esto lo he conseguido hacer bastante bien sin tener que recurrir a los
modulos de clase. Incluso simulo la casilla de verificacion con el
procedimiento de la consulta.

En total tengo 4 barras de herramientas que suponen otros tantos
comandos del submenu, a los cuales les asigno en OnAction una macro
exacta, excepto en la barra que se debe ocultar/mostrar, por lo que
habia pensado hacer una unica que decidiera mediante un select case o
similar la barra a ocultar/ver segun el comando pulsado. Este es uno de
los 4 codigos ->

Sub Ver_No_Ver_bGeneral()
With Application.CommandBars("Barra_General")
If .Visible = False Then
.Visible = True
With Hoja1
.[h16] = "Marcado": .[h56] = "Verdadero"
End With
Else
.Visible = False
With Hoja1
.[h16] = "Desmarcado": .[h56] = "Falso"
End With
End If
End With
Actualizar_Visibles
End Sub

la 1ª celda ([h16]) pertenece a la columa 'Visible' de la lista que
utilizo para crear las barras (en el mismo proc. creo la de menus y las
de herramientas) y solo cambia la imagen del comando del submenu 'ver
barras de herramientas' para simula el checkbox. A las otras barras les
corresponde h17, h18 y h19

la 2ª celda ([h56]) se corresponde con la barra correspondiente, he
indica si esta esta visible o no al crearla, en funcion de como la haya
dejado el usuario la ultima vez. Aqui las barras no estan seguidas,
pero no creo que sea mucho problema

supongo que haria falta un bucle de algun tipo, para actualizar estas
celdas, pero esto tampoco creo que sea complicado.

el problema lo tengo/tenia hasta ahora en averiguar la opcion pulsada.
Mañana empezare a indagar tus propuestas a ver lo que sale y te
comento

mientras tanto si te ocurre algo, nos vemos por aqui

bueno, como siempre, disculpa el rollo

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

__ 1 __
sobre la op1 -> no lo conocia y creo que me va a ser bastante util para otras situaciones
pero para el actual caso (comandos de submenu) es posible una matriz de 4 elementos, o el maximo es de 3?
supongo que vendra en la ayuda, pero como te comentaba ni siquiera lo he mirado



1) si comentas el porque de la necesidad de 4 [o mas] elementos ???

__ 2 __
sobre la op2 -> aqui me ocurre lo mismo que antes: en algunas ocasiones he intentado asignar a la prop. OnAction de un comando
un procedimiento con argumentos y no me lo ha permitido quizas no tenga que llevar las comillas si tiene argumentos?
o que puedo haber hecho mal?... me decia que el argumento no era opcional, pero si no me equivoco si lo tenia asignado
(incluso creo recordar que era el propio caption, aunque no te lo aseguro)



2) si comentas el 'como' has intentado asignar una macro 'parametrizada' a la propiedad OnAction ???
y cuales son los argumentos/parametros que solicita el procedimiento asignado :))

[por lo demas... espero tus comentarios adicionales] :D

saludos,
hector.
Respuesta Responder a este mensaje
#8 Ivan
05/11/2006 - 01:11 | Informe spam
hola de nuevo, Hector Miguel. paso a comentarte

1) si comentas el porque de la necesidad de 4 [o mas] elementos ???



seria para saber que elemento de submenu ha sido el pulsado. segun
entiendo de tu explicacion sobre Application.Caller, me haria falta un
4º elemento en la matriz para acceder a la posicion del elemento de
submenu.

Estos son los elementos de la matriz que tu mencionas para una barra
de menus:

- > (1) la posicion del comando, (2) el numero del menu, (3) el numero
de la barra de menus

y pienso que me haria falta algo asi

-> (1) la posicion del comando en el submenu, (2) la posicion del
submenu en el menu, (3) el numero del menu, (4) el numero de la barra
de menus

de todas formas te comento tambien los resultados de mis pruebas (pocas
de momento) con .Caller. Despues de varios intentos no he sabido como
aplicar la matriz(no son mi fuerte, y la ayuda en este caso no ayuda
demasiado, al menos a mi) para que me devolviera un resultado.

De momento lo mas que he conseguido, con este procedimiento de pruebas
->

Sub Ver_O_No()
Dim ind As Byte
With
Application.CommandBars("Menus_Libreria").Controls(2).Controls(3)
On Error Resume Next
For ind = 1 To 4
If Application.Caller = .Controls(ind).Caption Then
MsgBox "Se ha pulsado " & .Controls(ind).Caption
Exit For
End If
Next
On Error GoTo 0
End With
End Sub

ha sido que el msgbox me devuelva siempre el nombre del 1er comando del
submenu, aunque pulse cualquier otro de los 4. He hecho varias pruebas
bastante diferentes, e incluso en uno de los casos, que incluia
sucesivos bucles por los 'niveles' de los comandos y menus, me
du/tri/cuatri..plicaba los menus cada vez que se ejecutaba la macro,
sin ningun sentido aparente. Anecdotas aparte, no consigo comprender la
forma de uso de Caller

2) si comentas el 'como' has intentado asignar una macro 'parametrizada' a la propiedad OnAction ???
y cuales son los argumentos/parametros que solicita el procedimiento asignado :))



en este caso, en las pruebas que realice hace algun tiempo, 'creo' que
simplemente intente algo parecido a esto: ->

-> .OnAction = "Procedimiento("asignacion")"

y aunque no recuerdo el error, ni siquiera si lo daba, si se que no
conseguia ningun resultado. De heco ahora, tras tus palabras, he vuelto
a hacer alguna prueba, y no ocurre absolutamente nada, no da error,
pero tampoco hace nada. Este ej. seria una adaptacion del codigo de mi
anterior mensaje.->

Sub Ver_No_Ver_Con_Arg(Nombre As String)
Dim nCelda1 As String, nCelda2 As String
Select Case Nombre
Case "Barra_General": nCelda1 = "h16": nCelda2 = "h56"
Case "Barra_Editar": nCelda1 = "h17": nCelda2 = "h60"
Case "Barra_Utilidades": nCelda1 = "h18": nCelda2 = "h66"
Case "Barra_Ver": nCelda1 = "h19": nCelda2 = "h72"
End Select
With Application.CommandBars(Nombre)
If .Visible = False Then
.Visible = True
With Hoja1
.Range(nCelda1) = "Marcado": .Range(nCelda2) = "Verdadero"
End With
Else
.Visible = False
With Hoja1
.Range(nCelda1) = "Desmarcado": .Range(nCelda2) = "Falso"
End With
End If
End With
Actualizar_Visibles
End Sub

como te comentaba, no hace nada en absoluto. Se lo asigno a la prop.
OnACtion en la creacion del comando a traves de la lista de la hoja que
me sirve de 'matriz' para crear losmenus/barras, Asi asignaba el
original (que funcionaba sin (aparentes)problemas) y asigno el resto de
las macros al resto de comandos

bueno, despues de este nuevo rollo y a la espera de tus comentarios,
voy a seguir 'buscando' .

gracias de nuevo y hasta pronto
Ivan

PD > [por lo demas... espero tus comentarios adicionales] :D -> a
estas alturas, el objetivo de esta consulta concreta esta logrado creo
que mas o menos bien con lo que tengo ya, pero me temo que, tras la
'irrupcion' de Caller en mi vida y el retorno a ella de los argumentos
beligerantes con OnAction, me costara concilar el sueño hasta que al
menos logre tener algun atisbo de comprension.de sus enigmas..
Respuesta Responder a este mensaje
#9 Ivan
05/11/2006 - 01:40 | Informe spam
hola de nuevo, Hector

por ej. esto si me funciona -> asignando con el mismo metod el proc.
'pruebaVer' a onAction

Sub pruebaVer()
Call Ver_No_Ver_Con_Arg("Barra_General")
End Sub

pero volvemos a lo mismo ¿como cambio el argumento por una referencia
al comando pulsado?

he probado asi->

Sub pruebaVer()
Call Ver_No_Ver_Con_Arg(Application.Caller)
End Sub

pero me da el error "No coiciden los tipos", pensaba que caller
devolvia un string con el nombre del comando, pero ya veo que no

bueno, para añadir a la duda

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

-> [creo que] con el siguiente ejemplo podras adaptar/[casi]-solucionar/...
[si no todas...] una gran parte de los temas relacionados con esta segunda parte de tu consulta :D

__ recortes de la consulta __
... saber que elemento de submenu ha sido el pulsado...
... en las pruebas que realice hace algun tiempo, 'creo' que simplemente intente algo parecido a esto:
... -> .OnAction = "Procedimiento("asignacion")"
... aunque no recuerdo el error, ni siquiera si lo daba, si se que no conseguia ningun resultado...



1) se puede 'asumir' que al tener diversos botones/controles/sub-menus y comandos/... etc. 'dispersos por ahi'...
-> cada uno 'ejecuta' [o debiera ejecutar] una accion especifica/particular/unica/exclusiva/... [voy bien ?]
[incluso sin importar en que 'nivel' de control se encuentren en un objeto command/bar/control/...] :D
[asumiendo que en caso diferente... no tendria 'caso' dispersar un control con la misma accion en varios lugares] -?-

2) si lo anterior es correcto, podrias utilizar -solo- UNA macro de 'uso general'... CON UN 'unico' parametro/argumento -?-

3) si un procedimiento 'general' tiene asignado un parametro/argumento, la forma de 'asignar' dicho procedimiento es +/- como sigue:
a) delimitar el enunciado de la macro asignable entre comillas dobles
b) iniciar la cadena con el nombre de la macro con un apostrofo
c) separar con un espacio el nombre de la macro del parametro/argumento
d) 'cerrar' la cadena con el nombre de la macro Y el argumento con otro apostrofo
e) [obviamente] 'cerrar' el enunciado de la macro con comillas dobles

4) segun el 'tipo' de parametro/argumento asigado a la macro [texto, numero, verdadero/falso, ...]
seria necesario delimitar por DOBLES comillas dobles al 'parametro/argumento' [p.e. en el caso de textos]

si suponemos un procedimiento 'general' que recibe un parametro numerico [+/- como el siguiente]:

Sub Macro_general(ByVal Opcion As Byte)
Select Case Opcion
Case 1
MsgBox "Ejecutando la opcion 1..."
Case 20
MsgBox "Ejecutando la opcion 20..."
End Select
End Sub

-> la forma de asignarlo por medio de la propiedad OnAction es: -> .OnAction = "'macro_general 1'"

si suponemos un procedimiento 'general' que recibe un parametro de texto [+/- como el siguiente]:

Sub Macro_general(ByVal Texto As String)
Select Case Texto
Case "Hola"
MsgBox "Mensaje de entrada..."
Case "Adios"
MsgBox "Mensaje de despedida..."
End Select
End Sub

-> la forma de asignarlo por medio de la propiedad OnAction es: -> .OnAction = "'macro_general ""Hola""'"

5) [obviamente] la 'construccion' de la cadena con la asignacion de la macro... no tiene por que ser 'rigida'
puede ser construida a partir de la union de otras variables [no se si esto sea +/- 'claro'] :))

6) si el procedimiento tiene asignados dos [o mas] parametros/argumentos...
habra que separar con una coma a partir del primer argumento
-> recuerda que el primero esta separado por un espacio despues del nombre del procedimiento ;)
-> y no pierdad de vista el 'tipo' de los paametros/argumentos asignados al procedimiento ;)

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