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

我得到了一个有许多行的列表框,还有一个命令button,用来在单独的窗口(popup窗口)中显示该行的一些列。 问题是它从中获取信息的行(即被视为选中的行)不是当前标记的行,而是之前标记的行。

所以,如果我select第5行并单击命令button,它将显示一个空白popup窗口(没有选中的行)。 如果我然后select第10行并单击命令button,它将显示第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 

编辑,可能的解决scheme在post结束

我把你的代码清单砍成了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 

看起来,对于最简单的情况,你列出的代码似乎正在工作,所以至less消除了一个错误,似乎表明你所列出的是按预期工作。 我不知道你已经进入了多远,但..

  • 添加断点,并validation索引值是你所期望的(或不)
  • validation循环不会计算两个单独的时间,覆盖原始值
  • validation例程只使用断点触发一次

我意识到以上是标准的debugging,但希望它是有帮助的。 我将创build第二个表单,并在两者之间传递数据,以查看是否有所作为。 将编辑post,如果我发现有用的东西。

——编辑——我认为你的问题可能在于你如何填充第二个表单。 看起来,Excel可能会暂停在第一个线程中的代码执行,当您点击userForm.Show例程。 这将防止文本框被填充。 然后,当你closures你的第二个盒子时,这些字段会填入第一组数据。 当您再次尝试时,代码执行暂停在显示,您会看到以前的结果。 至于正确的工作,仍然工作..

—–用答案编辑——

两种可能的解决scheme,首先,简单地移动你的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 

第二个解决scheme是实例化表单的本地版本,填充它,然后显示它。 基本上它是相同的解决scheme,只是稍微不同的实施方法。

 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 

希望这可以帮助!