为什么我的列表框会删除所有项目而不是选中的项目?

时间:2016-07-19 15:27:08

标签: vba excel-vba excel

我有一组ListBoxes,它从包含宏的其余部分生成的报告中提取数据。这些ListBoxes显示在彼此相邻的UserForm中,以将它们的数据进行比较,并允许用户在匹配时删除数据(参见图片)。不幸的是,当我按下右侧列表的删除按钮(BWListBox)时,整个列表将被删除,而不是仅删除一个项目。

我怀疑这是由于ListBox的动态特性(如果生成银行电汇报告,列表仍为单选和单列;如果生成信用卡报告,则会更改为多选和双列,以及将“总计”TextBox标记为可见,就像左侧一样)

当我运行信用卡报告,并使用标记列表(当它是多选)时,删除按钮工作正常。奇怪的是,在单选表单中,它会删除整个列表。

以下是删除按钮的代码块:

Private Sub RemoveButton2_Click()
    Dim bwTotal As Double
    'If CCReport Then              `Currently not functioning due to testing
        'bwTotal = BWTotalTextBox.Value 'Throwing error - Double to String ""
    'End If
    For lItem = BWListBox.ListCount - 1 To 0 Step -1
        If BWListBox.Selected(lItem) Then
            'GPListBox.RemoveItem GPListBox.ListIndex
            BWListBox.RemoveItem lItem
            If CCReport Then       'if CCReport since it will  be multi-select and multi-column 
                bwTotal = bwTotal - BWListBox.List(lItem, 1)
                BWTotalTextBox.Value = Format(bwTotal, "$#,##0.00")
            End If
        End If
    Next
End Sub

这是BWListBox_Change事件:

Private Sub BWListBox_Change()
    If CCReport Then   'This only exists for the sole purpose of the BWTotalTextbox, if it's not visible (Such as during a Bank Wire Report), there is no need
        Dim bwTotal As Double

        For lItem = 0 To BWListBox.ListCount - 1
            If BWListBox.Selected(lItem) = True Then
                bwTotal = bwTotal + BWListBox.List(lItem, 1)
                Debug.Print BWListBox.List(lItem, 1)
            End If
        Next

        BWTotalTextBox.Value = Format(bwTotal, "$#,##0.00")
    End If
End Sub

编辑:我最近发现如果在按下删除按钮之前选择了最后一项,它只会删除整个列表。

enter image description here

1 个答案:

答案 0 :(得分:2)

在单选的情况下,循环继续运行,因为当您删除底部的一个项目时,上面的直接项目将被选中并且循环得到验证。

因此,您需要做的就是在删除所选元素后跳出循环。

For lItem = Me.ListBox1.ListCount - 1 To 0 Step -1
        If ListBox1.Selected(lItem) Then
            ListBox1.RemoveItem lItem                
            If Me.ListBox1.MultiSelect = fmMultiSelectSingle Then
                Exit For
            End If
        End If
Next