excel - VBA (Excel) ActiveX 列表框更改事件递归行为

标签 excel vba listbox

我不是 VBA 程序员,所以如果我在这个问题中的一些术语不正确,我提前道歉。我的一位同事希望在选择列表框后立即清除该选择。经过一番谷歌搜索后,我们发现一种方法是通过 Change 事件。最初我们尝试过:

Private Sub ListBox1_Change()
    For i = 0 To ListBox1.ListCount - 1
        ListBox1.Selected(i) = False
    Next i
End Sub

但是,将 Selected 属性设置为 False 似乎会触发列表框上的 Change 事件,这实际上会变成无限循环并导致 Excel (2007)碰撞。鉴于我们知道我们还尝试了两个条目:

Private Sub ListBox1_Change()
    ListBox1.Selected(0) = False
    ListBox1.Selected(1) = False
End Sub

这有效!尽管我们期望相同的行为 - Selected 属性的设置会导致 Change 事件再次触发并获得无限循环。

然而,似乎一旦例如ListBox1.Selected(0) = False 更改事件被重新触发,但在该迭代中它不会在这一行重新触发 - 我猜是因为它知道这个 Selected该项目的属性已设置为 False,因此没有任何变化。

但如果是这种情况,那么我们也会期望 first 解决方案中的行为..所以说 ListBox1.Selected(i) = False 似乎有一些区别 与直接指定实际项目索引(而不是通过变量 i)。

有谁知道这种行为的原因吗?希望这个问题有意义,我已尽力解释它。

谢谢 阿米特

最佳答案

我迟到了一年,但我希望这对其他人有帮助。我遇到了 Listbox1_Click() 无限循环问题,而不是 change() 问题。然而,我认为这对双方来说都是一个可行的解决方案。

每当我调用 Listbox1.Selected(i) = True 时,它都会将其触发为 Click()Change() 。在我的 click() 例程中,有某些索引会导致整个列表用新列表重新填充并重新选择本身。这会在重新选择自身时导致无限循环。我花了一天时间排查,最终解决办法是不使用click()事件;相反,我使用了 MouseDown() 事件并进行了一些计算。这消除了 click() 的使用。请注意,我在单选列表框中使用它,而不是在多选列表框中使用它。您可以使用带有 bool 值的 If 语句将其应用于多选。祝你好运!

Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As 

Integer, ByVal x As Single, ByVal Y As Single)

    On Error Resume Next  'You can comment this out for trouble shooting
    If Button = 1 And UBound(ListBox1.List) <> -1 Then
        ListBox1.Selected(((Y / 9.75) - 0.5) + ListBox1.TopIndex) = True
        MsgBox "left Click"
        'You can use Button = 2 for right click
        'Do some other stuff including listbox1.select(1234)

    End If
End Sub

关于excel - VBA (Excel) ActiveX 列表框更改事件递归行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27128088/

相关文章:

python - xlsx writer 在打开时导致 Excel 错误

sql - VB6 ADODB.Recordset Record.Count 不起作用/EOF 和 BOF 不可用

Excel vba 将值分配给数组,然后粘贴到工作表

c# - 在 C# 中使用什么控件来获取自定义选中的列表框?

windows-phone-7 - WP7 列表框滚动不起作用

c# - 填充 ListBox 时从每个列表项中删除前 12 个字符

excel - 如何加速 VBA for Mac 中的 shell 函数

vba - Excel 中 Len(cell.Value) = 0 和 cell.Value = ""是否等效?

excel - 复制列中的单元格范围直到空白单元格,然后粘贴到新工作簿中

vba - 查找 Excel 电子表格和 VBA 数组之间的匹配项