Excel VBA Userform ListBox宽度自动更改
我有一个Excel VBA项目中的UserForm。 这种forms的特点,除了其他项目,并列两个ListBox对象与之间的两个button之间移动项目之间的项目。
在表单devise器中,我已经将列表完全绘制在我想要的位置,并且两个都具有相同的尺寸。
由于两个列表框必须是多列的,在从数据库中检索数据之后,我使用JKP的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中进行select。 直到他们这样做,一切都看起来很好,完全按照预期。 当用户进行select时,情况就会改变。
我的垃圾编辑道歉,但这包含潜在的商业敏感信息,更不用说这是不相关的这个问题的目的。
当它加载initiallly时,窗体看起来像这样:
用户从combobox中select一个项目后,列表将填充项目。 请注意,右侧列表的滚动条看起来稍微伸展一些,而且很奇怪。
用户点击右侧列表中的项目后,大小突然变化!
让大小恢复正常的唯一方法是将项目移到左侧列表中,然后移回。 一旦你这样做,他们稳定,并没有问题,直到你再次closures并打开表单。
值得一提的是,我们使用Excel 2010 32位。
我做了一些testing,看来改变ColumnWidths属性会影响Width属性,但是将Width设置回原来的样子应该在理论上解决问题,但是直到你真的点击列表框。
现在,对于我的问题……是否有人知道这里发生了什么? 我有两个人看着这个,每个人都在挠头! 这不是一个炫目的东西或任何东西,但它绝对是古怪的。 我已经search了很高的和甚至与此有关的任何东西,找不到任何东西,所以我想我会在这里发布。
为了解决这个问题,我将MouseDown事件添加到每个列表框,并在那里强制改变宽度。 它不会阻止它重绘更窄,但它确实重设宽度。
谢谢!
我也有同样的问题 – 更改列表框的大小没有任何可见的原因。 这是我发现这个职位。
我所做的是重写在子结尾的列表框的大小。 喜欢这个:
With ThisWorkbook.Worksheets(tbl_input.Name) .lbTabsA.Width = 131 .lbTabsA.Height = 350 end with
可能这个自动更改是Excel中的一个错误。
一个反直觉的解决scheme已经为我工作:
- 将build立列宽的行放在最后(加载数据之后)
下面是一个例子:
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