在将一个列表框中的最后一个值添加/删除到另一个列表框时,整个列表框会清除吗?

时间:2019-06-27 13:23:02

标签: excel vba listbox userform

我正在创建一个用户窗体(riskcodefiter),用户可以在其中将值从一个列表框移到另一个列表框。第一个列表框allriskcodes包含许多值(从另一个工作表上的范围填充),第二个列表框chosenriskcodes包含用户想要用作过滤器的allriskcodes中的值。用户表单包括Btn_addallcodesBtn_removeallcodesBtn_addcodesBtn_removecodes-这是不言自明的。

问题:如果chosenriskcodes列表框中有多个值,并且用户希望删除该框中的最后一个值,它将清除整个chosenriskcodes列表框。我的Btn_addcodes也是如此。有什么建议吗?

这是我的Btn_removecodes

的代码
Private Sub BTN_removecodes_Click()
     Dim iCtr As Long

    For iCtr = 0 To Me.chosenriskcodes.ListCount - 1
        If Me.chosenriskcodes.Selected(iCtr) = True Then
           Me.allriskcodes.AddItem Me.chosenriskcodes.List(iCtr)
        End If
    Next iCtr

    For iCtr = Me.chosenriskcodes.ListCount - 1 To 0 Step -1
        If Me.chosenriskcodes.Selected(iCtr) = True Then
           Me.chosenriskcodes.RemoveItem iCtr
        End If
    Next iCtr
End Sub

这是我的Btn_addcodes

的代码
    Private Sub BTN_addcodes_Click()
    Dim iCtr As Long

    For iCtr = 0 To Me.allriskcodes.ListCount - 1
        If Me.allriskcodes.Selected(iCtr) = True Then
            Me.chosenriskcodes.AddItem Me.allriskcodes.List(iCtr)
        End If
    Next iCtr

    For iCtr = Me.allriskcodes.ListCount - 1 To 0 Step -1
        If Me.allriskcodes.Selected(iCtr) = True Then
            Me.allriskcodes.RemoveItem iCtr
        End If
    Next iCtr

    End Sub

该按钮对于列表框中的所有其他值(最后一个值除外)均适用。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果您插入断点并观察会发生什么,您可以看到问题的发生。

如果有人说allriskcodes中有50个项目,并且选择了第50个项目,则删除它会导致第49个项目被选中(就像它是活动光标一样)。

简单的解决方法是在删除项目之前取消选择每个项目,如下所示:

Private Sub BTN_addcodes_Click()
    Dim iCtr As Long

    For iCtr = 0 To Me.allriskcodes.ListCount - 1
        If Me.allriskcodes.Selected(iCtr) = True Then
            Me.chosenriskcodes.AddItem Me.allriskcodes.List(iCtr)
        End If
    Next iCtr

    For iCtr = Me.allriskcodes.ListCount - 1 To 0 Step -1
        If Me.allriskcodes.Selected(iCtr) = True Then
            Me.allriskcodes.Selected(iCtr) = False
            Me.allriskcodes.RemoveItem iCtr
        End If
    Next iCtr

End Sub

此外,为使此内容更具可读性,您可以使用With语句:

Private Sub BTN_addcodes_Click()

    Dim iCtr As Long
    With Me.allriskcodes

        For iCtr = 0 To .ListCount - 1
            If .Selected(iCtr) = True Then
                Me.chosenriskcodes.AddItem .List(iCtr)
            End If
        Next iCtr

        For iCtr = .ListCount - 1 To 0 Step -1
            If .Selected(iCtr) = True Then
                .Selected(iCtr) = False
                .RemoveItem iCtr
            End If
        Next iCtr

    End With

End Sub