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

userform multicolumn listbox not showing records unless form is closed and re-opened

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

当我打开一个没有记录的表格时,输入第一条记录并保存,记录没有显示。记录确实正确保存在数据 sheets 上。列表框的第一列显示记录编号,其余列为空白。但是,我没有在表格中包括(显示)记录编号(A 列)。我只显示数据 sheet 的第 2 列和第 7 列(B 到 H)的值。它只会显示我此后输入的每条记录的记录号,只要我在输入第一条记录时处于打开表单的同一“会话”中。

但是,如果我关闭表单并重新打开它,记录会按应有的方式显示。以及我重新打开表格后输入的任何后续记录,新记录也会正确显示。即使我删除了表单上的所有记录和新的记录,只要我没有关闭表单,它们也能正常显示。此行为对于所有 4 个表单都是相同的。这些表单在我创建时都可以正常工作,之后进行了几个月的单元测试。诚然,我对代码进行了大量更改,以更正我在项目计算部分发现的错误。但我无法想象任何会全局影响所有表单上的列表框的东西。

其中一种形式的示例代码初始化事件:

        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

然后在保存过程中我按如下方式刷新列表框:

        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 个表单上都是相同的,不同之处在于使用的数据 sheet 和列。我可以随意重复以上行为。有没有人以前看过这个,或者有什么想法?

我为此花了一整天。我无法回答为什么会发生这种变化,但我可以解释我是如何修复它的。我注意到列表框不仅只显示行号,而且只加载那一列,就好像应该只有 1 列一样。列表框对象具有可在对象浏览器中设置的 ColumnCount 和 ColumnWidths。我的 ColumnCount 一直设置为 1,ColumnWidths 为空,因为我在代码中设置了它们。所以我将对象浏览器的 ColumnCount 更改为 10,并将我的宽度粘贴到 ColumnWidths 中。它奏效了。我分别将它们设置回默认值 1 和空白。我看到早些时候加载列表框列失败。

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

            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 个月前的这个文件的备份,其代码在原始 post 中显示,并且列数和宽度设置为默认值 - 这就是为什么我有之前没有尝试过此修复程序。我无法解释代码执行中发生了什么变化。我也无法解释为什么它只有在列表框中至少有一条记录时才能正常工作。

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

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