Excel VBA Userform ListBox宽度自动更改

时间:2015-12-11 14:44:47

标签: excel vba excel-vba excel-2010

我在Excel VBA项目中有一个UserForm。除了其他项目之外,此表单还包含两个ListBox对象,其间有两个按钮,用于在列表之间移动项目。

在表单设计器中,我已经将列表精确地绘制在我想要的位置,并且两者具有相同的尺寸。

由于两个ListBox都必须是多列,在从数据库中检索数据后,我使用稍微修改后的JKP's ListBox AutoSize代码版本来获取列宽,计算列数,最后填充列表与数据。

执行此任务的VBA代码段是

' GetColumnWidths is my modified version of JKP's Autosize code
' vaData is a 2 dimensional variant array containing the data
' LISTBOX_WIDTH is a constant width value (my attempt to stop this behaviour)

With lbxList

    .ColumnWidths = GetColumnWidths(vaData)
    .ColumnCount = UBound(vaData, 2) + 1
    .List = vaData
    .Width = LISTBOX_WIDTH

End With

当表单最初加载时,列表为空,直到用户从ComboBox中进行选择。直到他们这样做,一切看起来都很好,完全符合预期。当用户做出选择时,事情会发生变化。

为我的垃圾编辑道歉,但这包含潜在的商业敏感信息,更不用说它与此问题的目的无关。

表单在初始加载时看起来像这样: Initial Load

用户从ComboBox中选择一个项目后,列表中会填充项目。请注意,右侧列表的滚动条看起来略微拉伸和奇怪。 After user selects an item from the ComboBox

用户点击右侧列表中的项目后,大小突然改变! After the user clicks an item in the right-hand ListBox

将尺寸恢复正常的唯一方法是将项目移动到左侧列表,然后返回。一旦你这样做,他们就会稳定并且很好,直到你再次关闭并打开表格。

对于它的价值,我们使用的是Excel 2010 32位。

我已经做了一些测试,似乎更改ColumnWidths属性会影响Width属性,但是将Width设置回原来之后应该理论上解决问题,但它似乎只有你实际上点击ListBox。

现在,对于我的问题......是否有人知道这里到底发生了什么?我有两个人看着这个,每个人都在摸不着头脑!这不是一个显示器或任何东西,但它绝对是奇怪的。我已经搜索了与此有关的任何东西,无法找到任何东西,所以我想我会在这里发布。

为了解决这个问题,我将MouseDown事件添加到每个ListBox并强制在那里进行宽度更改。它并没有阻止它重绘得更窄,但它确实正确地重新设置了宽度。

谢谢!

2 个答案:

答案 0 :(得分:1)

我也遇到了同样的问题 - 在没有任何明显原因的情况下改变列表框的大小。这就是我发现这篇文章的方式。

我所做的是在sub的末尾重写列表框的大小。像这样:

With ThisWorkbook.Worksheets(tbl_input.Name)
    .lbTabsA.Width = 131
    .lbTabsA.Height = 350
end with

这种自动更改可能是Excel中的一个错误。

答案 1 :(得分:0)

对我有用的反直觉解决方案:

  • 放置在末尾建立列宽的行(之后 加载数据)

以下示例:

With Me.ListBox2
  .ColumnCount = 13
  If Not rst.EOF Then
    .Column = rst.GetRows()
    rst.Close
  Else
    rst.Close
    GoTo CleanUp
  End If
  .ColumnWidths = "3 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;0 cm"
End With