我在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中进行选择。直到他们这样做,一切看起来都很好,完全符合预期。当用户做出选择时,事情会发生变化。
为我的垃圾编辑道歉,但这包含潜在的商业敏感信息,更不用说它与此问题的目的无关。
用户从ComboBox中选择一个项目后,列表中会填充项目。请注意,右侧列表的滚动条看起来略微拉伸和奇怪。
将尺寸恢复正常的唯一方法是将项目移动到左侧列表,然后返回。一旦你这样做,他们就会稳定并且很好,直到你再次关闭并打开表格。
对于它的价值,我们使用的是Excel 2010 32位。
我已经做了一些测试,似乎更改ColumnWidths属性会影响Width属性,但是将Width设置回原来之后应该理论上解决问题,但它似乎只有你实际上点击ListBox。
现在,对于我的问题......是否有人知道这里到底发生了什么?我有两个人看着这个,每个人都在摸不着头脑!这不是一个显示器或任何东西,但它绝对是奇怪的。我已经搜索了与此有关的任何东西,无法找到任何东西,所以我想我会在这里发布。
为了解决这个问题,我将MouseDown事件添加到每个ListBox并强制在那里进行宽度更改。它并没有阻止它重绘得更窄,但它确实正确地重新设置了宽度。
谢谢!
答案 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