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

时间:2016-02-15 15:04:00

标签: excel vba listbox

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

因此,如果我选择第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

1 个答案:

答案 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

希望这有帮助!