You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:48:03