我有一个包含多个行的列表框,还有一个命令按钮,用于在单独的窗口(弹出窗口)中显示该行的一些列。问题是它从中获取信息的行(即被认为是被选中的行)不是当前标记的行,而是在此之前标记的行。
因此,如果我选择第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
答案 0 :(得分:1)
在帖子末尾编辑,可能的解决方案
我将您的代码清单破解为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
似乎对于最简单的情况,您列出的代码似乎正在工作,因此至少可以消除一个错误,并且似乎表明您列出的内容正在按预期工作。我不确定你已经解决了这个问题但是......
我意识到上面是标准调试,但希望它有用。我将创建第二个表单并在两者之间传递数据,看看它是否有所作为。如果我发现任何有用的东西,我会编辑帖子。
------ ------编辑 我认为你的问题可能在于如何填充第二种形式。当您点击userForm.Show例程时,Excel可能会暂停第一个线程中的代码执行。这样可以防止填充文本框。然后,当您关闭第二个框时,将使用第一组数据填充字段。再次尝试时,代码执行会在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
希望这有帮助!