当 adding/removing 最后一个值从一个列表框到另一个列表框时,整个列表框会清除吗?

When adding/removing last value from one listbox to another, whole listbox clears?

我正在创建一个用户表单 (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

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

如果您插入断点并观察发生的情况,您可以看到问题的发生..

如果 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