gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:42:03 30 4
gpt4 key购买 nike

我不是 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com