当 adding/removing 最后一个值从一个列表框到另一个列表框时,整个列表框会清除吗?
When adding/removing last value from one listbox to another, whole listbox clears?
我正在创建一个用户表单 (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
该按钮适用于列表框中的所有其他值,但最后一个值除外。有什么想法吗?
如果您插入断点并观察发生的情况,您可以看到问题的发生..
如果 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
我正在创建一个用户表单 (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
该按钮适用于列表框中的所有其他值,但最后一个值除外。有什么想法吗?
如果您插入断点并观察发生的情况,您可以看到问题的发生..
如果 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