selección seleccion opcion múltiple multiple lista formulario desplegable dependientes cuadros cuadro combinados casillas excel vba user-interface listbox

seleccion - Cómo arreglar un cuadro de lista de Excel que no puede desplazar el último elemento a la vista



lista desplegable excel (8)

Algo que tenía que descubrir por mí mismo, y que no se puede encontrar en ningún otro lado (y es por eso que lo estoy publicando aquí), es que este problema tenía la dimensión adicional de depender del método de selección. Aunque no puedo comprender cómo la forma en que funciona la barra de desplazamiento está relacionada no solo con la altura y la propiedad de altura integral, sino también con la propiedad .MultiSelect, he encontrado que sí lo está.

Cuando el método .IntegralHeight que se muestra arriba no funciona, el siguiente método de alguna manera lo hace:

With lstbox .IntegralHeight = False .Height = myHeight .IntegralHeight = True .MultiSelect = fmMultiSelectSingle .MultiSelect = fmMultiSelectExtended End With

Simplemente cambiando la propiedad .MultiSelect a fmMultiSelectSingle, y luego restaurándola al estilo de selección deseado, la altura de la lista se ajustará automáticamente por la propiedad .IntegralHeight a una altura ligeramente diferente que cuando estas acciones no se realizan: el la diferencia hace que la barra de desplazamiento funcione correctamente:

Espero que el descubrimiento de este caso especial y una solución más precisa ahorre a alguien las horas de frustración y experimentación que tuve que pasar.

Un problema mortal que he tenido en las UI de Excel desde que tengo memoria es con el desplazamiento de la lista de listas.

Cuando tiene más elementos en un cuadro de lista que se pueden mostrar, aparecerá una barra de desplazamiento. Sin embargo, en ciertas condiciones, al desplazar la barra hasta el final de la lista y soltarla, se "saltará" la barra una muesca hacia arriba, y no podrá ver el último elemento de la lista. Esto se ilustra aquí:

Hay muchas publicaciones en el foro que presentan este problema, y ​​la solución siempre ha sido "Establecer la propiedad de altura integral en falso y luego establecerla en verdadero otra vez". Lo que hace es cambiar el tamaño del cuadro de lista para que la altura se redondee a la altura de una sola fila, y luego no quedan elementos ocultos.

With lstbox .IntegralHeight = False .Height = myHeight .IntegralHeight = True End With

Sin embargo, hay ciertos casos en que esto no funciona. Si usted es:

  1. Programar la altura de tu listbox
  2. NO utilizando la selección de cuadro de lista simple (fmMultiSelectSingle)

Luego, simplemente estableciendo la altura integral en falso y luego en verdadero después o entre los cambios a la altura hará un ajuste a la altura de su cuadro de lista, pero cuando vaya a desplazarse hacia abajo, el problema permanecerá: el último elemento no se puede ver.

La clave de esta frustrante pregunta es que mientras todos los demás en Internet confirman que la solución ''integralHeight'' funciona para ellos, estos casos muy especiales se frustran y se preguntan por qué no funciona para ellos. Entonces, ¿cómo obtienen su solución?


Lo que he visto en el pasado en los foros es simplemente agregar una fila en blanco adicional a su cuadro de lista. Deberias hacer eso.


En mi caso, la solución fue este método:

with listbox .IntegralHeight = False .Height = myHeight .Width = myWidth .IntegralHeight = True .Height = myHeight .Width = myWidth end with

Disfrutar.


Simplemente configure la propiedad Integral Height en True


Tuve que anclar la posición desde que mi ListBox cruzaba la página:

With ListBox1 .IntegralHeight = False .IntegralHeight = True .Height = 45 .Width = 69 .Top = 0 .Left = 1255.5 End With


With lstbox

`.Height = myHeight` `.MultiSelect = fmMultiSelectExtended` `.MultiSelect = fmMultiSelectSingle`

End With

Esto funcionó para mí. No es necesario establecer la propiedad Integral height


encontró una forma ridículamente simple de resolver este problema. Ajuste su altura hacia arriba o hacia abajo un poco para que la línea inferior del cuadro de lista esté entre casillas de verificación, luego puede desplazarse hacia abajo hasta el último elemento, incluso si IntegralHeight está configurado como falso


Gracias Alain. Tu solución funcionó bien para mí.

Encontré un problema posterior relacionado con la altura del ListBox al redimensionarlo, que variaba de forma impredecible en función de la altura inicial. La altura redimensionada era diferente nuevamente cuando se mostraba en otra máquina con una escala de texto del 125%. Por ejemplo, si configuro una altura entre 358 y 370, la altura cambiada de tamaño es 370.65 o 371.4 en mi máquina pero en la máquina con 125% de escala de texto, es 360.1, 370.25 o 380.45. Con una variabilidad tan grande, el resultado fue que el ListBox podría oscurecer otros controles debajo de él.

La solución era comenzar con la altura máxima que quería y reducir la altura inicial hasta que la altura redimensionada fuera menor que la altura máxima que quería. Lo hago cada vez que veo ese ListBox.

Hmax = 372 ''Target Height H1 = Hmax With SteelForm.Controls.Item("ListBox1") Do H1 = H1 - 1 .IntegralHeight = False .Height = H1 .IntegralHeight = True .MultiSelect = fmMultiSelectSingle .MultiSelect = fmMultiSelectExtended DoEvents Loop Until .Height < Hmax End With