Excel VBA UserForm中ListBox的.Width与.Height属性无效问题求助
解决VBA UserForm动态添加ListBox时宽高不生效及移除滚动条的问题
我之前也碰到过一模一样的问题!你的代码逻辑没问题,但几个默认的控件属性在搞鬼,咱们一步步来搞定:
1. 为什么Width/Height设置没效果?
你遇到的宽高不生效,主要是两个容易被忽略的属性在起作用:
- 列宽度未明确指定:当你设置了
ColumnCount=2但没定义ColumnWidths时,ListBox会自动给列分配宽度,整体控件宽度被列的总宽度锁死,你手动设的.Width自然就被覆盖了。 - IntegralHeight自动调整高度:ListBox的
IntegralHeight默认是True,它会自动调整控件高度,保证能完整显示每一行内容,所以你设置的.Height会被这个属性强制修改。
2. 修复代码+移除滚动条
把这些属性补上,就能解决问题了,修改后的代码如下:
Option Explicit Private Sub UserForm_Initialize() Dim y() ReDim y(1 To 3, 1 To 2) y(1, 1) = "Fuselage" y(1, 2) = "Painting" y(2, 1) = "Engines" y(2, 2) = "Fuel Efficiency" y(3, 1) = "Landing Gear" y(3, 2) = "Brake Stress Test" With Me.Controls.Add("Forms.ListBox.1", "Aviation", True) .ColumnCount = 2 ' 明确设置两列的宽度,总和尽量接近你要的控件宽度(预留一点边框空间) .ColumnWidths = "240;240" .List = y .Width = 500 .Height = 600 ' 关闭自动调整高度,让手动设置的高度生效 .IntegralHeight = False ' 完全移除滚动条 .ScrollBars = fmScrollBarsNone ' 顺便设置一下控件在窗体上的位置,避免跑到左上角边缘 .Top = 10 .Left = 10 End With ' 确保窗体不会自动缩放,影响控件显示 Me.AutoSize = False Me.ScrollBars = fmScrollBarsNone End Sub
额外小贴士
- 如果你的UserForm本身设置了滚动条,记得把它也关掉(
Me.ScrollBars = fmScrollBarsNone),不然窗体滚动条可能会干扰控件的显示。 fmScrollBarsNone是VBA内置的枚举值,你也可以直接写0来代替,效果是一样的。
这样修改后,你的ListBox就会严格按照你设置的500宽、600高显示,滚动条也会消失啦!
内容的提问来源于stack exchange,提问作者Andreas Hanisch




