VBA UserForm多列ListBox首次录入记录不显示,重启窗体才正常
问题根因
触发异常的核心原因是空白表打开窗体时,ListBox的基础展示属性未完成初始化。你把ColumnCount、ColumnWidths这些核心配置都放在了If Not iAcctLastRow = 1的判断分支里,只有当窗体打开时数据表已有记录才会执行配置。首次打开空白表时,iAcctLastRow = 1,判断分支不执行,ListBox保持默认配置:ColumnCount = 1,只会展示赋值数组的第一列内容,其余列全部隐藏。
后续保存刷新逻辑只给ListBox的List属性赋值,没有重新校验/设置列配置,所以整个会话内都保持单列展示状态,和你看到的“仅显示第一列记录号、其余列空白”完全匹配。关闭窗体重开时数据表已有记录,初始化分支正常执行,列配置生效,后续所有操作就都正常了。
之前单元测试未复现是因为测试场景都默认带有初始记录,初始化分支始终执行,不会触发属性未配置的问题。
修复方案
1. 调整初始化事件逻辑
把ListBox的固定属性配置挪到判断分支外,无论是否有初始记录都先完成基础配置,修改后代码如下:
' 优先完成ListBox基础属性配置 With Me.lstAcct .Font.Name = "Tahoma" .Font.Size = 10 .ColumnCount = 10 .ColumnWidths = "0,120,80,90,60,60,80,60,0,0" End With If Not iAcctLastRow = 1 Then '存在记录时再加载数据 Set rAcctDB = wsAcctInput.Range("A2:J" & iAcctLastRow) Me.lstAcct.List = rAcctDB.Cells.Value End If
2. 可选:刷新逻辑补充兜底校验
如果担心后续其他操作修改ListBox属性,可以在刷新List的代码里补充属性校验,确保每次刷新都符合展示要求:
iAcctLastRow = wsAcctInput.Range("B22").End(xlUp).Row Set rAcctDB = wsAcctInput.Range("A2:J" & iAcctLastRow) ' 兜底补充列配置,避免属性被意外修改 With Me.lstAcct .ColumnCount = 10 .ColumnWidths = "0,120,80,90,60,60,80,60,0,0" .List = rAcctDB.Cells.Value End With
所有4个窗体的初始化逻辑都按这个规则调整即可完全解决该异常。
内容的提问来源于stack exchange,提问作者westinq
相关产品推荐
相关产品推荐

