【问题标题】:How to fix an Excel listbox that can't scroll the last element into view如何修复无法将最后一个元素滚动到视图中的 Excel 列表框
【发布时间】:2011-05-02 16:10:49
【问题描述】:

从我记事起,我在 excel UI 中遇到的一个致命问题就是列表框滚动。

当列表框中有更多可以显示的元素时,会出现一个 scoll 条。但是,在某些情况下,将条滚动到列表底部并释放它,会使条向上“跳”一个档次,您将无法看到列表中的最后一项。这在此处进行了说明:

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

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

但是,在某些情况下,这不起作用。如果你是:

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

然后简单地将整数高度设置为 false ,然后在更改高度之后或之间设置为 true 将调整列表框的高度,但是当您向下滚动时,问题仍然存在 - 看不到最后一项。

这个令人沮丧的问题的关键在于,虽然互联网上的其他所有人都在确认“integralHeight”解决方案对他们有用,但这些非常特殊的情况却很沮丧,想知道为什么它对他们不起作用。那么他们如何解决问题呢?

【问题讨论】:

  • 任何关于我如何提出问题和提出的解决方案,或者我是否可能忽略了其他方面的反馈都非常受欢迎。

标签: excel vba user-interface listbox


【解决方案1】:

我必须自己发现的东西,并且在其他任何地方都找不到(这就是我在这里发布它的原因),是这个问题具有依赖于选择方法的附加维度。虽然我无法理解滚动条的工作方式不仅与高度和积分高度属性有关,还与 .MultiSelect 属性有关,但我发现确实如此。

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

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

只需将 .MultiSelect 属性更改为 fmMultiSelectSingle,然后将其恢复为所需的选择样式,列表框的高度将由 .IntegralHeight 属性自动调整为与不执行这些操作时稍有不同的高度执行 - 差异导致滚动条正常工作:

我希望这种特殊情况的发现和更精确的解决方法可以为人们节省我必须经历的数小时的挫折和实验。

【讨论】:

    【解决方案2】:

    我知道这是很老的帖子。 但是我已经经历了很多来解决这个问题,所以我只想分享我的提示。 :)

    首先, 当工作表缩放级别不是 100% 时,integralheight 方法不起作用。

    它会改变列表框的高度和宽度、位置等(即使你设置对象属性'不移动或重新占用单元格')

    当你尝试使用代码来修复它的原始大小和位置时,这一次它的最后一个项目看不到

    我的建议很简单。 字体大小和列表框高度之间存在组合。

    如果您的字体大小为 6-10(arial,常规),则列表框高度适合 12.75 的倍数(顺便说一句,我的列表框样式是 1:ListStyle,1-fmListStyleOption。它可能与样式 0 不同)

    只要高度与这些 12.75 的倍数相同,就没有问题。

    如果字体大小为 12(arial,regular),则为 13.55 的倍数

    因此,如果您的项目中没有对列表框大小的限制,只需根据您的字体大小稍微调整它的大小即可获得更多舒适感。 :)

    【讨论】:

    • 哇...我一直在寻找 2 个月的答案..这太简单了,终于有用了.. 荣誉
    • 哇....它的工作原理。太感谢了。你在拯救生命...... :)
    • 将我的 LB 高度更改为 102(12.75 的倍数)而不是 105,它现在可以在没有隐藏线的情况下工作,不确定计算是否准确,因为 103 也可以工作,但 104 不能。字体大小从 8pt Times New Roman 开始,但我有一个调整大小按钮,至少在加载后它似乎适用于所有大小。
    【解决方案3】:

    由于我的 ListBox 正在浏览页面,因此我不得不锚定该位置:

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

    【讨论】:

      【解决方案4】:

      With lstbox

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

      End With

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

      【讨论】:

      • 仅当您已将 IntegralHeight 设置为 True 时才有效。
      【解决方案5】:

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

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

      享受吧。

      【讨论】:

        【解决方案6】:

        找到了解决此问题的非常简单的方法。稍微向上或向下调整高度,使列表框的底线位于复选框之间,然后即使 IntegralHeight 设置为 false,您也可以向下滚动到最后一项

        【讨论】:

        • 在接受的答案中写道,调整高度没有帮助。你能提供更多细节吗?
        【解决方案7】:

        谢谢阿兰。你的修复对我来说效果很好。

        我发现了一个与调整大小时 ListBox 高度相关的后续问题,它根据初始高度以不可预测的方式变化。当以 125% 的文本缩放显示在另一台机器上时,调整后的高度再次不同。例如,如果我将高度设置在 358 和 370 之间,则在我的机器上调整大小的高度是 370.65 或 371.4,但在具有 125% 文本缩放的机器上,它是 360.1、370.25 或 380.45。由于可变性如此之大,结果是 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
        

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 我没有投反对票,但是当您的列表框被绑定到一个命名范围时,这是不可接受的一个例子,该范围不仅仅用于列表框。更改数据源并强制使用该数据源的其他代码必须考虑最后一行的空白是不合理的。这也意味着我必须执行对列表框中的选定项目执行操作的任何例程,以检查是否选择了有效项目。
          【解决方案9】:

          只需将 Integral Height 属性设置为 True

          【讨论】:

          • 问题和去年发布的解决方案中明确说明这还不够。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-16
          • 1970-01-01
          • 2019-09-24
          • 1970-01-01
          • 2019-03-25
          • 2018-08-09
          • 2021-05-19
          相关资源
          最近更新 更多