我得到了一个包含许多行的列表框,以及一个命令按钮,用于在单独的窗口(弹出窗口(中显示该行中的一些列。问题是它从中获取信息的行(即被视为已选择的行(不是当前标记的行,而是在此之前标记的行。
因此,如果我选择第 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
希望这有帮助!