VBA复选框取消选中事件并将多个范围加载到列表框

时间:2018-10-22 18:11:45

标签: excel vba excel-vba

我正在做一个小项目,对以下代码有困难。在此之前获得了代码第二部分的帮助(有意包含仅用于加载前三个项目(adig,altay,ataysk)的代码以检查代码:

        Dim adig(), altay(), altaykr(), amur(), arh(), astr(), bashk(), belgor(), bryansk(), buryat(), vladim(), volgo(), vologod(), fulllist() As Variant

        adig = ActiveWorkbook.Worksheets("Cities").Range("adig").Value
        altay = ActiveWorkbook.Worksheets("Cities").Range("altay").Value
        altaykr = ActiveWorkbook.Worksheets("Cities").Range("altaykr").Value

        fulllist =ActiveWorkbook.Worksheets("Cities").Range("fulllist").Value

        If (Not ListofExcludelocations.Selected(0)) And Excludelocations.Value =True Then 
            For Each i In adig
                NegKeyList.AddItem i
            Next i
        End If

        If (Not ListofExcludelocations.Selected(1)) And Excludelocations.Value =true Then 
            For Each i In altay
                NegKeyList.AddItem i
            Next i
        End If

        If (Not ListofExcludelocations.Selected(3)) And Excludelocations.Value = True Then 
            For Each i In altaykr
                NegKeyList.AddItem i
            Next i          
        End If                        

        For i = NegKeyList.ListCount - 1 To 0 Step -1 
            If Not IsError(Application.Match(NegKeyList.List(i), fulllist, 0)) Then
                NegKeyList.RemoveItem i 
            End If
        Next i

        TextBox2.Value = NegKeyList.ListCount & " neg.keys"

    Next j          
End sub

当选中复选框时,代码会将数组中每个命名范围中的项目加载到listbox1中。这部分工作正常。我在以下方面遇到困难: 1.如果未选中该代码的第二部分,则实际上不会从该复选框中删除这些项目。有人可以检查出什么毛病,因为我听不懂吗? 2.每个范围(arh,astr等)包含不同数量的项目。我需要确保,如果未选择列表框项,则每个范围的值都将加载到列表框。显然,现在的工作方式是我必须为每个项目分别创建一个If语句。它使很少数量的项目成为现实,但是我希望这段代码适用于具有70多个范围的数组。有人可以帮我更改它,而不需要像现在这样对数组中的每个项目都执行If语句,而是使用FOr each ...语句吗?

预先感谢,希望有人能帮助我

角色

1 个答案:

答案 0 :(得分:0)

通过将值复制到隐藏列表框中找到解决方案。

            For counter1 = NegKeyList.ListCount - 1 To 0 Step -1
     For counter2 = 0 To Bcities.ListCount - 1
'InStr returns 0 when there's no match

        If (CStr(NegKeyList.List(counter1))) = (CStr(Bcities.List(counter2))) Then
            NegKeyList.RemoveItem (counter1)
            Exit For 'Skip any more compares for the deleted Item
    End If
    Next counter2
    Next counter1