2016-04-14 105 views
1

我想让这个在excel用户表单中工作。在列表框中选择一个值时,它的更改事件被调用两次。即使放置了标志,也无法绕过它。不知道为什么更改事件被调用两次。谷歌搜索后,像控制获得焦点时的接缝,调用变化事件。以下是代码。vba listbox事件触发两次

Public eventsOFF As Boolean 
Public ctr As Integer 

Private Sub ListBox1_Change() 
Dim tmp As String, sel As Variant, s As Variant 

If eventsOFF Then Exit Sub 

eventsOFF = True 
For i = 0 To ListBox1.ListCount - 1 
If ListBox1.Selected(i) Then tmp = tmp & ListBox1.List(i) & "," 
Next 

ListBox1.Clear 
sel = Split(tmp, ",") 

ListBox1.AddItem "Entry 1" 
ListBox1.AddItem "Entry 2" 
ListBox1.AddItem "Entry 3" 
ListBox1.AddItem "Entry 4" 
ListBox1.AddItem "Entry 5" 

For i = 0 To ListBox1.ListCount - 1 
For Each s In sel 
If s = ListBox1.List(i) Then ListBox1.Selected(i) = True 
Next 
Next 
eventsOFF = False 
ctr = ctr + 1 
Debug.Print ctr 
End Sub 

Private Sub UserForm_Initialize() 
ListBox1.AddItem "Entry 1" 
ListBox1.AddItem "Entry 2" 
ListBox1.AddItem "Entry 3" 
ListBox1.AddItem "Entry 4" 
ListBox1.AddItem "Entry 5" 
End Sub 
+0

编程选择一个值将触发更改事件(然后ListBox1.Selected(I)= TRUE)。我不确定如何避开它。 – Crowcoder

+0

eventsOFF标志照顾这一点。有趣的是,当我在调试模式下通过代码时,它工作正常!我在哪里可以找到列表框的事件层次结构? – illoosions

+0

我不认为有很多来自VBA的事件挂钩。这不是一个典型的事情,你正在试图做一个列表框。 – Crowcoder

回答

0

在ListBox1_MouseMove事件插入下面的行会解决你的问题

ListBox1.SetFocus

+0

像这样的一个非常小的回答可以简单地作为原始问题下的评论陈述 – Dbz