显示错误项目 (VBA) 的列表框



我得到了一个包含许多行的列表框,以及一个命令按钮,用于在单独的窗口(弹出窗口(中显示该行中的一些列。问题是它从中获取信息的行(即被视为已选择的行(不是当前标记的行,而是在此之前标记的行。

因此,如果我选择第 5 行并单击命令按钮,它只会显示一个空白弹出窗口(未选择任何行(。如果我然后选择第 10 行并单击命令按钮,它将显示第 5 行的信息,依此类推。这是一个已知问题还是我完全做错了?

Private Sub cmdDetails_Click()
    'If the ListIndex is -1, no selection is made
    If lstItems.ListIndex = -1 Then
        MsgBox "No row selected", vbInformation, "No row selected"
    'If a selection is made, open the details form and fill in the details
    Else
        frmDetails.Show ' <-- Move this to the end of the sub
        With lstItems
            For i = 0 To .ListCount - 1
                If .Selected(i) Then
                    frmDetails.txtBox1.Text = .List(i, 0)
                    frmDetails.txtBox2.Text = .List(i, 2)
                End If
            Next i
        End With
    End If
End Sub

已编辑,帖子末尾的可能解决方案

我将您的代码列表破解为Excel中的快速比较,并且没有遇到同样的问题。 有一些差异可以帮助您缩小问题的根源? 我使用了一个单维列表框,并将该数据传输到同一窗体上的另一个列表框中。

Private Sub CommandButton1_Click()
If ListBox1.ListIndex = -1 Then
    MsgBox "No Row Selected", vbInformation, "No Row Selected"
Else
    With ListBox1
        For i = 0 To .ListCount - 1
            If .Selected(i) Then
                ListBox2.AddItem .List(i, 0)
            End If
        Next i
        End With
End If
End Sub
Public Sub FillMe()
    With ListBox1
        .AddItem "Yes"
        .AddItem "No"
    End With
End Sub
似乎对于最简单的情况,您列出的

代码似乎正在工作,因此至少消除了一个错误,并且似乎表明您列出的内容正在按预期工作。 我不确定你对这个问题走了多远,但是..

  • 添加断点并验证索引值是否为预期值
  • 验证循环两次未计算 true,覆盖原始值
  • 验证例程是否仅使用断点触发一次

我意识到以上是标准调试,但希望它有所帮助。 我将创建第二个表单并在两者之间传递数据,看看它是否有区别。 如果我发现任何有用的东西,将编辑帖子。

------编辑------我认为您的问题可能在于您如何填充第二种形式。 看起来 Excel 可能会在您点击 userForm.Show 例程时停止第一个线程中的代码执行。 这将阻止填充文本框。 然后,当您关闭第二个框时,将使用第一组数据填充字段。 重试时,代码执行在 Show 处停止,并且您会看到前面的结果。 至于适当的解决方法,仍然有效..

-----使用答案------编辑

两种可能的解决方案,首先,只需将 lstDetails.Show 移动到 For 语句之后

If ListBox1.ListIndex = -1 Then
    MsgBox "No Row Selected", vbInformation, "No Row Selected"
Else
    With ListBox1
        For i = 0 To .ListCount - 1
            If .Selected(i) Then
                UserForm2.newListBox.AddItem .List(i, 0)
            End If
        Next i
        End With
UserForm2.Show
End If

第二种解决方案是实例化表单的本地版本,填充它,然后显示它。 基本上它是相同的解决方案,只是实现方法略有不同。

Dim newForm As New UserForm2
If ListBox1.ListIndex = -1 Then
    MsgBox "No Row Selected", vbInformation, "No Row Selected"
Else
    With ListBox1
        For i = 0 To .ListCount - 1
            If .Selected(i) Then
                newForm.newListBox.AddItem .List(i, 0)
            End If
        Next i
        End With
newForm.Show
End If

希望这有帮助!

最新更新