userform多列列表框不显示记录,除非窗体关闭并重新打开



我有4个用户输入表单,其中用户通过表单上的字段输入/编辑记录,记录显示在下面的多列列表框中。(表单上也有保存和删除按钮。)经过几周的单元测试,它们都工作得很好。现在我已经对项目的计算部分进行了编码和调试,我已经开始了最后一轮系统测试,我从空白数据表开始。列表框显示出一种奇怪的(新)行为。

当我打开一个没有记录的表单,输入第一条记录并保存它时,记录不显示。数据表上的记录得到了妥善保存。列表框的第一列显示记录号,其余列为空白。但是,我没有在表格上包括(显示)记录号(A栏)。我只显示数据表第2列到第7列(B到H)的值。它只会显示我此后输入的每条记录的记录号,只要我在同一个"会话"中。当我输入第一个记录时,打开表格

但是,如果我关闭表单并重新打开它,记录将按原样显示。在我重新打开表单后输入的任何后续记录,新记录也会正确显示。即使我删除了表单上的所有记录并添加了新的记录,只要我没有关闭表单,它们就会显示良好。此行为对于所有4个表单都是相同的。当我创建表单时,所有表单都可以正常工作,并且在之后的几个月的单元测试中都可以正常工作。诚然,我已经做了很多代码修改,以纠正我在项目的计算部分发现的错误。但是我无法想象有任何方法可以全局地影响所有表单上的列表框。

窗体的示例代码Initialize事件:

If Not iAcctLastRow = 1 Then 'there are no records to load into listbox
Set rAcctDB = wsAcctInput.Range("A2:J" & iAcctLastRow)
With Me.lstAcct 'Populate listbox
.Font.Name = "Tahoma"
.Font.Size = 10
.ColumnCount = 10
.ColumnWidths = "0,120,80,90,60,60,80,60,0,0"
.List = rAcctDB.Cells.Value
End With
End If

在Save过程中刷新列表框,如下所示:

iAcctLastRow = wsAcctInput.Range("B22").End(xlUp).row
DelayThis 50 'added this delay but no change
Set rAcctDB = wsAcctInput.Range("A2:J" & iAcctLastRow)
Me.lstAcct.List = rAcctDB.Cells.Value 'Refresh listbox

以上代码在所有4个表单上是相同的,不同的数据表和列被使用。我可以随意重复上述行为。有人见过这个吗,或者有什么想法吗?

即使没有要显示的记录,也可以在初始化时格式化列表框。

Private Sub UserForm_Initialize()
Dim wsAcctInput As Worksheet, iAcctLastRow As Long
Set wsAcctInput = Sheet1
iAcctLastRow = wsAcctInput.Range("B22").End(xlUp).Row
With Me.lstAcct 'Populate listbox
.Font.Name = "Tahoma"
.Font.Size = 10
.ColumnCount = 10
.ColumnWidths = "0,120,80,90,60,60,80,60,0,0"
If iAcctLastRow > 1 Then
.List = wsAcctInput.Range("A2:J" & iAcctLastRow).Value
End If
End With

End Sub

我花了一整天的时间。我不能回答为什么这个变化,但我可以解释我是如何解决它的。我注意到列表框不仅只显示行号,而且只加载那一列,就好像只有1列一样。listbox对象的ColumnCount和columnwidth可以在对象浏览器中设置。我的ColumnCount一直设置为1,columnwidth为空白,因为我在代码中设置了它们。所以我改变了对象浏览器的ColumnCount为10,并粘贴我的宽度到columnwidth。这招奏效了。我将它们分别设置为默认值1和空白。我看到了先前加载列表框列失败的情况。

修复方法是通过代码在每次保存时再次强制列数和宽度,就像我在userform初始化中所做的那样,而不是简单的范围刷新。

With Me.lstAcct 'Populate listbox
.Font.Name = "Tahoma"
.Font.Size = 10
.ColumnCount = 10
.ColumnWidths = "0,120,80,90,60,60,80,60,0,0"
.List = rAcctDB.Cells.Value
End With

我有这个文件的备份,从3个月前的代码工作,因为它显示在原来的帖子,列计数和宽度设置为默认值-这就是为什么我没有尝试这个修复早些时候。我无法解释代码执行中发生了什么变化。我也无法解释为什么只有在列表框中至少有一条记录时它才能正常工作。

最新更新