我正在创建一个用户窗体(riskcodefiter
),用户可以在其中将值从一个列表框移到另一个列表框。第一个列表框allriskcodes
包含许多值(从另一个工作表上的范围填充),第二个列表框chosenriskcodes
包含用户想要用作过滤器的allriskcodes
中的值。用户表单包括Btn_addallcodes
,Btn_removeallcodes
,Btn_addcodes
,Btn_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
该按钮对于列表框中的所有其他值(最后一个值除外)均适用。有什么想法吗?
答案 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