如何阻止ListBox - Multiselect Change Event在第一次选择时触发两次?

时间:2016-07-14 20:55:01

标签: vba excel-vba excel

我创建的UserForm有两个ListBoxes,其中一个来自dictionary,其中包含公司报告中的多余项目,另一个来自dictionary包含银行报告中的多余项目。第一个ListBoxfmMultiSelectMulti,允许用户选择多个项目以获取所选项目的总和(这会更改TextBox的值)。

我的问题是,当我选择ListBox中的第一项时,ListBox_Change()事件会触发两次。 sum变量是公共的,因为它在其他方法中被引用,但在双重激发时,它使实际值加倍。

以下是更改事件的代码:

Private Sub GPListBox_Change()

    For lItem = 0 To GPListBox.ListCount - 1
        If GPListBox.Selected(lItem) = True Then
            gpTotal = gpTotal + GPListBox.List(lItem, 1)
            Debug.Print GPListBox.List(lItem, 1)
        End If
    Next

    GPTotalTextBox.Value = Format(gpTotal, "$#,##0.00")

End Sub

删除(多个)所选变量的另一种方法,并引用sum变量:

Private Sub RemoveButton1_Click()

    For lItem = GPListBox.ListCount - 1 To 0 Step -1
        If GPListBox.Selected(lItem) Then
            gpTotal = gpTotal - GPListBox.List(lItem, 1)
            'GPListBox.RemoveItem GPListBox.ListIndex
            GPListBox.RemoveItem lItem
            GPTotalTextBox.Value = gpTotal
        End If
    Next

End Sub

这是我选择第一个项目后的UserForm,它自动取消选择并留下总和:

enter image description here

我的问题:每次第一次选择时,如何防止双击?

1 个答案:

答案 0 :(得分:2)

我过去曾经这样做过。这样的事情。

在代码顶部使用全局布尔值。首先是潜艇和功能。

Dim bFire as Boolean

默认情况下,布尔值为false,因此您必须将boolean设置为在您之外的某个位置,例如表单UserForm_Initialize事件或其他内容。如果您没有这样做的地方,请切换潜艇中的真/假用法(Benno Grimm在下面的评论中详细阐述)。

Private Sub UserForm_Initialize()
    bFire = True
End Sub

然后在sub。中使用boolean。

Private Sub GPListBox_Change()
    'Check the status and get out if you have set it to not fire.
    If bFire = false then
        Exit Sub
    End If

    For lItem = 0 To GPListBox.ListCount - 1
        If GPListBox.Selected(lItem) = True Then
            gpTotal = gpTotal + GPListBox.List(lItem, 1)
            Debug.Print GPListBox.List(lItem, 1)
        End If
    Next

    GPTotalTextBox.Value = Format(gpTotal, "$#,##0.00")

End Sub

在修改它的按钮中,在开始时设置布尔值false,在结束时设置为true。

Private Sub RemoveButton1_Click()

    'Set it false
    bFire = false

    For lItem = GPListBox.ListCount - 1 To 0 Step -1
        If GPListBox.Selected(lItem) Then
            gpTotal = gpTotal - GPListBox.List(lItem, 1)
            'GPListBox.RemoveItem GPListBox.ListIndex
            GPListBox.RemoveItem lItem
            GPTotalTextBox.Value = gpTotal
        End If
    Next

    'After you have modified the control set it to true
    bFire = True

End Sub