¿es posible sincronizar la rueda del ratón y una scrollbar de (o añadida a)
un control en un formulario creado en vba excel? en el caso que me ocupa
ahora mismo se trata de un frame que contiene un label (con un texto
bastante extenso) de un tamaño bastante mayor (de alto) que el frame, pero
si con otro control tipo listbox, o,..., fuera mas fácil, no tendría
problema (al menos de antemano) en cambiarlo.
creo recordar haber visto alguna propiedad en algún control que hace
referencia al tema, pero ahora mismo no doy con ella. Quizás fuera en VB
bueno, si podéis echarme una mano una vez mas os lo agradezco
un saludo y hasta pronto
Ivan
> es posible sincronizar la rueda del raton y una scrollbar de (o a#adida a) un control en un formulario creado en vba excel?
> en el caso que me ocupa ahora mismo se trata de un frame que contiene un label (con un texto bastante extenso) [...]
[requiere de excel 2000 o superior]
-> http://www.enhanceddatasystems.com/ED/Pages/ExcelListScrolls.htm
saludos,
hector.
le estoy echando un ojo a la pagina, y en cuanto lo pruebe/traduzca te
comento alguna duda que ya me va surgiendo
ya he conseguido adaptar el codigo del enlace (provisionalmente) a su
uso con el frame y parece ir bien, aunque no acabo de captar del todo
como se 'pasa la cantidad de giro' de la rueda, ni el alcance del
posible riesgo que parecen indicar las advertencias del autor.
en cuanto a la 'cantidad' de giro y su equivalencia/proporcion con las
'medidas/desplazamiento' de los controles, supongo que es cuestion de
seguir dandole 'vueltas', o, en su defecto, resignarse a usarlo sin
entenderlo
pero en cuanto al posible riesgo en el uso de los codigos, si te
agradeceria, si tienes tiempo, que me aclararas hasta que punto existe
y en que consiste, si es que no se trata tan solo de un temor
amplificado por mi precario ingles.
por otro lado, y respecto a esto ->
> [requiere de excel 2000 o superior]
supongo que el posible error en caso ser inferior viene previsto en
esta parte del procedimiento 'GetFromHandle' ->
strClassName = IIf(Val(Application.Version) > 8, "ThunderDFrame", _
"ThunderXFrame") & vbNullChar
y que en caso de instalar el archivo en una version inferior, esto
evitaria que diera error y se pudiera trabajar (sin rueda) normalmente
¿o puede surgir algun problema en estos casos?
Bueno, en cualquier caso muchas gracias de nuevo, todavia me queda
darle unas cuantas vueltas y adaptarlo a lo que quiero, pero resulta
bastante entretenido/interesante.
al final te pongo el fragmento que he añadio para el frame en el
codigo original por si vieras alguna pega
un saludo y hasta pronto
Ivan
en el procedimiento 'WheelHandlerOriginal' he añadido / modificado
esto->
>>If TypeOf ctlName Is msForms.ListBox Then
por esto ->
>>If TypeOf ctlName Is msForms.ListBox Or TypeOf ctlName Is msForms.Frame Then
y dentro de este condicional le he añadido, tras las instrucciones si
el control es un listbox, le he añadido esto->
If TypeOf ctlName Is msForms.ListBox Then ' esta linea es añadida
If .ListCount = 0 Then Exit Sub
lMove = IIf(bUp, -lLines, lLines
lTopIndex = .TopIndex + lMove
If lTopIndex < 0 Then
lTopIndex = 0
ElseIf lTopIndex > .ListCount - (.Height / 10) + 2 Then
lTopIndex = .TopIndex
End If
.TopIndex = lTopIndex
Exit Sub
ElseIf TypeOf ctlName Is msForms.Frame Then ' a partir de aqui
tambien
lMove = IIf(bUp, -lLines, lLines)
lTopIndex = .ScrollTop + lMove
If lTopIndex < 0 Then
lTopIndex = 0
ElseIf lTopIndex > .ScrollHeight - (.Height / 10) + 2 Then
lTopIndex = .ScrollTop
End If
.ScrollTop = lTopIndex
Exit Sub
End If
gracias de nuevo y un saludo
[en realidad] hay una 'inconsistencia' en estos 2 fragmentos del codigo utilizado en el ejemplo de la pagina:
a) IIf(Val(Application.Version) > 8, "ThunderDFrame", "ThunderXFrame") & vbNullChar
b) If TypeOf ctlName Is msForms.ListBox Or TypeOf [etc. etc. etc.]
a) la 'clase' para los formularios en excel 9 [2000] es "ThunderXFrame" y para la version 8 [97] es "ThunderDFrame"
[la comprobacion 'intenta' detectarlo a traves del Val(Application.Version) PERO...
b) TypeOf <= NO tiene soporte sino hasta VBA 6 [excel 2000], por lo que fallaria si se utiliza en VBA 5 [excel 97] :-((
por lo del tema de 'posibles riesgos'... [dejame hacer unas pruebas... hace tiempo que no practico con ese ejemplo] :))
saludos,
hector.
__ la consulta original __
> ... aunque no acabo de captar del todo como se 'pasa la cantidad de giro' de la rueda
> ni el alcance del posible riesgo que parecen indicar las advertencias del autor.
> ... supongo que es cuestion de seguir dandole 'vueltas', o, en su defecto, resignarse a usarlo sin entenderlo
> ... en cuanto al posible riesgo en el uso de los codigos... que me aclararas hasta que punto existe y en que consiste
> si es que no se trata tan solo de un temor amplificado por mi precario ingles.
>
> por otro lado, y respecto a esto ->
> [requiere de excel 2000 o superior]
> supongo que el posible error en caso ser inferior viene previsto en esta parte del procedimiento 'GetFromHandle' ->
> strClassName = IIf(Val(Application.Version) > 8, "ThunderDFrame", _
> "ThunderXFrame") & vbNullChar
> y que en caso de instalar el archivo en una version inferior, esto evitaria que diera error y se pudiera trabajar (sin rueda) normalmente
> o puede surgir algun problema en estos casos? [...]
> ... en el procedimiento 'WheelHandlerOriginal' he añadido / modificado esto->
>> If TypeOf ctlName Is msForms.ListBox Then
> por esto ->
>> If TypeOf ctlName Is msForms.ListBox Or TypeOf ctlName Is msForms.Frame Then [...]
voy con un poco de prisa, y ademas lo que voy a comentar lo mismo es una
tonteria ( sobre todo porque supongo que sino ya lo hubieran usado).
¿TypeName tampoco tiene soporte para inferiores al 2000?. lo comento porque,
repasando un archivo que me envio hace poco V.Vinc, he encontrado este
codigo que expongo espero que con su venia ->
'Esta función nos buscará el controlador de ventana de una que coincida
' con su propiedad 'Caption'.
Public Function BuscarControlador(ByVal strCaption As String) As Long
Dim strClassName As String
'Primero determinamos la clase de ventana que se debe buscar,
' lo cual depende de la versión de Excel que se está ejecutando.
'La clase a buscar será "ThunderXFrame" para versiones anteriores a
Office 2000,
' y "ThunderDFrame" para la iguales o posteriores
strClassName = IIf(Application.Version < 9, "ThunderXFrame",
"ThunderDFrame")
'FindWindow nos devolverá el controlador de ventana de la primera que
coincidan ambos argumentos
BuscarControlador = FindWindow(strClassName, strCaption)
End Function
y, posterior mente (creo, no me da tiempo a repasarlo bien ahora) si hace
referncia a los controles con typeName
bueno, lo mismo estoy diciendo una de mis burradas. Ahoras tengo que salir
pitando, pero en cuanto pueda le vuelvo a echar un ojo. Sobre todo es que se
me acaba de ocurrir, pero supongo que eso ya lo habrian visto si fuera asi
olvidate de mi anterior mensaje (creo que se me fue la 'olla',como se suele
decir (al menos por aqui), aparte de no haber tenido tiempo ni cabeza (esta
dudo que llegue a tener nunca) para mirarlo con calma. Ademas parece haber
mas 'expresiones' 'limitadas' en el codigo (pej. creo que AddressOf entre
ellas). En cuanto a esto, żconoces algun sitio donde se puedan mirar las
caracteristicas admitidas por cada version (mas bien las 'limitadas'/no
admitidas)?
y en cuanto al tema, te comento:
lo que he hecho al final ha sido poner en el initialice de formulario
esto ->
If application.Version > 8 Then HookWheel Me, Me.Width, Me.Height, 3
y esto en el terminate->
If application.Version > 8 Then UnHookWheel
pensando que asi se evitaria el error y se podria trabajar con versiones
anteriores, aunque sea sin la rueda.
el codigo funciona bien si no hay ningun otro error(y probado solo en excel
2002), pero si me ocurre alguno, aunque no tenga que ver con este asunto (y
en mis diversas pruebas suele haber unos cuantos) el equipo se cuelga,
supongo que porque windows no reconoce las llamadas żporque no se le ha
devuelto las cordenadas de pantallaa? o algo similar??? al suceder el error
antes del terminate.
he estado probando de diversas formas para intentar capturar el posible
error y devolver el control a windows, pero no consigo dar con ello. żQuizas
tenga que incluir un tratamiento de errores en todos los procedimientos
llamando a UnHookWheel en caso de error? Tambien he pensado en el evento
error de los controles, pero no se como capturar los parametros para
pasarselos.
bueno, aunque espero que al final las posibilidades de error sean minimas
(aunque supongo que seguiran siendo muchas) es engorroso a la hora de hacer
pruebas. Supongo que tambien puedo dejar el codigo para cuando la aplicacion
este ya mas o menos a prueba de errores, pero me gustaria saber si existe
alguna forma de devolver el control al sistema en caso de error.
disculpa el rollo, y en cualquier caso muchas gracias de nuevo
por si alguien tiene intere en el tema, pongo un link a una conversacion del
foro de VB en al que se analizan unos cuantos factores/riesgos y en la que,
al menos de momento y para mi caso concreto, pongo una solucion al final que
parece funcionar
un saludo
Ivan