如何修复无法将最后一个元素滚动到视图中的Excel列表框

自从我记得以来,我在excel UI中遇到的一个杀手级问题就是使用listbox滚动。

当您可以显示一个列表框中有更多的元素时,会出现一个scoll栏。 但是,在某些情况下,将条形一直滚动到列表的底部并将其释放,会使条形向上“跳跃”一个凹槽,并且无法看到列表中的最后一个项目。 这里说明: 无法一直向下滚动

有很多论坛post提出这个问题,解决scheme一直是“将整体高度属性设置为false,然后再次设置为true”。 这样做是稍微调整列表框的大小,使其高度四舍五入到单个行的高度,然后不隐藏任何项目。

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

但是,在某些情况下,这是行不通的。 如果你是:

  1. 以编程方式设置列表框的高度
  2. 使用简单的列表框select(fmMultiSelectSingle)

然后简单地将整体高度设置为false,然后在更改高度之后更改true,将调整列表框的高度,但是当您向下滚动时,问题将保持不变 – 最后一个项目无法看到。

这个令人沮丧的问题的关键是,虽然互联网上的其他人都确认“整体高度”解决scheme适用于他们,但这些非常特殊的情况令人沮丧,想知道为什么它不适合他们。 那么他们如何得到解决?

我必须为自己发现一些东西,这些东西在其他地方是找不到的(这就是为什么我要在这里发表),这个问题的另一个方面是依赖于select方法。 虽然我无法理解滚动条的工作方式不仅与高度和积分高度属性有关,还与.MultiSelect属性有关,但我发现它是如此。

当上面显示的.IntegralHeight方法不起作用时,下面的方法以某种方式执行:

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

通过简单地将.MultiSelect属性更改为fmMultiSelectSingle,然后将其恢复为所需的select样式,列表框的高度将由.IntegralHeight属性自动调整为与这些操作未执行时的高度略有不同不同的结果在滚动条工作正常:

解决方法奏效

我希望能够发现这种特殊情况和更精确的解决办法,可以节省一些我不得不经历的挫折和实验的时间。

在我的情况下,解决scheme是这种方法:

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

请享用。

自从列表框走过页面之后,我不得不把这个位置固定下来:

 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

这对我有效。 无需设置积分高度属性

发现可笑的简单方法来解决这个问题。 调整你的高度有点上下,所以列表框的底部是checkbox,然后你可以向下滚动到最后一项,即使IntegralHeight设置为false

谢谢阿兰。 你的修复对我来说效果不错。

我发现后续的问题与resize的ListBox的高度有关,它根据初始高度以不可预知的方式变化。 当在具有125%文本缩放的另一台机器上显示时,调整后的高度再次不同。 例如,如果我将高度设置在358和370之间,则调整后的高度在我的机器上为370.65或371.4,但在具有125%文本缩放的机器上为360.1,370.25或380.45。 有如此大的变化,结果是ListBox可能会遮掩下面的其他控件。

解决的办法是从我想要的最大高度开始,减小初始高度,直到调整后的高度小于我想要的最大高度。 每当我显示那个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 

过去在论坛上看到的只是在列表框中添加一个额外的空白行。 这应该做到这一点。

只需将积分高度属性设置为True