How to fix an Excel listbox that can't scroll

2020-02-09 08:29发布

A killer problem I've had in excel UIs since as long as I can remember, is with listbox scrolling.

When you have more elements in a listbox that can be displayed, a scoll bar will appear. In certain conditions, however, scrolling the bar all the way to the bottom of the list and releasing it, will "jump" the bar a notch upwards, and you won't be able to see the last item in the list. This is illustrated here: Can't scroll all the way down

There are many forum posts presenting this issue, and the solution has always been "Set the integral height property to false, and then set it to true again." What this does is slightly resize the listbox so that it the height is rounded to the height of a single row, and then no items are left hidden.

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

There are certain cases, however, where this does not work. If you are:

  1. Programatically setting the height of your listbox
  2. NOT using simple listbox selection (fmMultiSelectSingle)

Then simply setting integral height to false and then true after or between changes to height will make an adjustment to the height of your listbox, but when you go to scroll down, the problem will remain - the last item cannot be seen.

The key to this frustrating question is that while everyone else on the internet is confirming that the 'integralHeight' solution works for them, these very special cases are frustrated wondering why it doesn't work for them. So how do they get their fix?

9条回答
该账号已被封号
2楼-- · 2020-02-09 08:52

i know this is very old post. but i've been through a lot to fix this problem, so i just wanna share my tip. :)

first of all, integralheight method doesn't work when worksheet zoom level is not 100%.

it will change listbox height and width, location, etc. (even if you set object property 'doesn't move or reseize with cell')

and when you try to take it its original size and location with code to fix this, this time its last item can't be seen

my tip is simple. there's combination between font size and listbox height.

if your font size is 6-10(arial, regular), listbox height goes well with multiples of 12.75 (btw my list box style is 1 : ListStyle, 1-fmListStyleOption. it could be different with style 0)

as long as height is same with these multiples of 12.75, there will be no problem.

in case of font size 12(arial, regular), it's multiples of 13.55

so if there's no restiction about listbox size in your project, just resizing it slightly depending on your font size gives more comfort. :)

查看更多
趁早两清
3楼-- · 2020-02-09 08:56

found ridiculously simple way to resolve this issue. adjust your height up or down a little bit so bottom line of list box is between check boxes, then you can scroll down to last item even if IntegralHeight is set to false

查看更多
【Aperson】
4楼-- · 2020-02-09 08:59

What I've seen in the past on forums is just adding an extra blank row to your list box. That should do it.

查看更多
爷、活的狠高调
5楼-- · 2020-02-09 09:00

Thanks Alain. Your fix worked well for me.

I found a subsequent problem related to the height of the ListBox when resized, that it varied in an unpredictable way depending on the initial height. The resized height was different again when displayed on another machine with 125% text scaling. For example, if I set a height between 358 and 370, the resized height is either 370.65 or 371.4 on my machine but on the machine with 125% text scaling, it is 360.1, 370.25 or 380.45. With such large variability, the result was that the ListBox could obscure other controls below it.

The fix was to start with the maximum height I wanted and reduce the initial height until the resized height was less than the maximum height I wanted. I do this whenever I display that 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
查看更多
太酷不给撩
6楼-- · 2020-02-09 09:02

Just set the Integral Height property to True

查看更多
聊天终结者
7楼-- · 2020-02-09 09:09

With lstbox

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

End With

This worked for me. No need of setting Integral height property

查看更多
登录 后发表回答