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一个项目后,列表将填充项目。 请注意,右侧列表的滚动条看起来稍微伸展一些,而且很奇怪。 用户从组合框中选择一个项目后

用户点击右侧列表中的项目后,大小突然变化! 用户单击右侧ListBox中的项目后

让大小恢复正常的唯一方法是将项目移到左侧列表中,然后移回。 一旦你这样做,他们稳定,并没有问题,直到你再次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