列表框间项转移:最后一行选中项功能异常问题
解决Listbox单选模式下最后一项转移异常的问题
嘿,我一眼就瞅出问题出在哪了——你的循环范围写错啦!
问题根源
Listbox的索引是从0开始计数的,而Unsorted.ListCount返回的是列表里的总项数。比如你有5个项,索引就是0到4,但你的代码里写了For x = 0 To count(这里count等于ListCount=5),最后一次循环x会等于5,这时候访问Me.Unsorted.Selected(5)其实是在访问一个根本不存在的索引!这种越界访问会触发隐性错误,直接导致代码逻辑混乱,也就是你看到的“选中最后一项时清除上方所有值”的异常表现。
修正后的代码
把你的Add_Click事件代码改成下面这样,就能解决问题:
Option Explicit Option Base 1 Private Sub Add_Click() Dim x As Integer, count As Integer count = Me.Unsorted.ListCount ' 先判断列表是否为空,避免空列表报错 If count = 0 Then Exit Sub ' 遍历有效索引:从0到总项数-1 For x = 0 To count - 1 If Me.Unsorted.Selected(x) = True Then ' 将选中的项添加到Sorted列表 Me.Sorted.AddItem Me.Unsorted.List(x) ' 单选模式下,找到选中项就直接退出循环,不用白跑 Exit For End If Next x End Sub
关键改动说明
- 修正循环范围:把
For x = 0 To count改成For x = 0 To count - 1,确保只遍历Listbox的有效索引,不会触发越界错误 - 单选模式优化:因为是单选,找到选中项后直接
Exit For,既提升效率,也避免后续循环可能带来的意外问题 - 空列表判断:先检查Unsorted是否为空,防止空列表时执行循环导致的错误
这样修改后,最后一项的选中转移逻辑就会和其他项完全一致啦!
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

