Excel 从列表框中删除除i以外的项目

Excel 从列表框中删除除i以外的项目,excel,vba,listbox,Excel,Vba,Listbox,所以基本上我有两个组合框。1过滤数据,以便在单元格中显示具有特定值的列表。第二个组合框基本上从列表框的列表中删除数据。但是,我希望删除列表框中显示的值以外的值。因此,如果我选择XYZ,我希望我的代码删除列表框中没有XYZ的所有行,而不是删除带有XYZ的行。请看下面我的代码,如果您认为我还应该做任何其他更改,请告诉我。多谢各位 Private Sub ComboBox2_Change() On Error Resume Next For i = 0 To ListBox1.ListC

所以基本上我有两个组合框。1过滤数据,以便在单元格中显示具有特定值的列表。第二个组合框基本上从列表框的列表中删除数据。但是,我希望删除列表框中显示的值以外的值。因此,如果我选择XYZ,我希望我的代码删除列表框中没有XYZ的所有行,而不是删除带有XYZ的行。请看下面我的代码,如果您认为我还应该做任何其他更改,请告诉我。多谢各位

Private Sub ComboBox2_Change()

   On Error Resume Next
   For i = 0 To ListBox1.ListCount
       If ComboBox2.Value = ListBox1.List(i, 6) Then
          ListBox1.RemoveItem (i)
       End If
   Next i

End Sub

listbox1
如下所示:

Sub FillListBox()
    Dim data() As Variant
    data = Array("AAA", "CCC", "CCC", "Vityata", "was", "here")
    ListBox1.List = data
End Sub
看起来是这样的:

Sub FillListBox()
    Dim data() As Variant
    data = Array("AAA", "CCC", "CCC", "Vityata", "was", "here")
    ListBox1.List = data
End Sub

任务是删除所有与“CCC”不同的项目,而不会出现错误。在VBA中,从列表中删除最好是颠倒进行。否则,列表的计数将导致错误,只要列表小于删除项目之前的值:

Private Sub ComboBox1_Change()

    Dim i As Long
    For i = ListBox1.ListCount - 1 To 0 Step -1
        Debug.Print ListBox1.List(i)
        If ListBox1.List(i) <> "CCC" Then
            Debug.Print "Removing "; ListBox1.List(i); " from "; i
            ListBox1.RemoveItem (i)
        End If
    Next i

End Sub
Private子组合框1_Change()
我想我会坚持多久
对于i=ListBox1.ListCount-1到0步骤-1
Debug.Print ListBox1.List(一)
如果列表框1.列出(i)“CCC”,则
调试。打印“删除”;列表框1.列表(i);“来自”;我
ListBox1.RemoveItem(一)
如果结束
接下来我
端接头

最后但并非最不重要的一点是,如果您需要代码中的
On Error Resume Next
,以使其正常工作,那么很可能会出现一些问题,并且不会引起注意。尽量避免它。

列表框1
如下所示:

Sub FillListBox()
    Dim data() As Variant
    data = Array("AAA", "CCC", "CCC", "Vityata", "was", "here")
    ListBox1.List = data
End Sub
看起来是这样的:

Sub FillListBox()
    Dim data() As Variant
    data = Array("AAA", "CCC", "CCC", "Vityata", "was", "here")
    ListBox1.List = data
End Sub

任务是删除所有与“CCC”不同的项目,而不会出现错误。在VBA中,从列表中删除最好是颠倒进行。否则,列表的计数将导致错误,只要列表小于删除项目之前的值:

Private Sub ComboBox1_Change()

    Dim i As Long
    For i = ListBox1.ListCount - 1 To 0 Step -1
        Debug.Print ListBox1.List(i)
        If ListBox1.List(i) <> "CCC" Then
            Debug.Print "Removing "; ListBox1.List(i); " from "; i
            ListBox1.RemoveItem (i)
        End If
    Next i

End Sub
Private子组合框1_Change()
我想我会坚持多久
对于i=ListBox1.ListCount-1到0步骤-1
Debug.Print ListBox1.List(一)
如果列表框1.列出(i)“CCC”,则
调试。打印“删除”;列表框1.列表(i);“来自”;我
ListBox1.RemoveItem(一)
如果结束
接下来我
端接头

最后但并非最不重要的一点是,如果您需要代码中的
On Error Resume Next
,以使其正常工作,那么很可能会出现一些问题,并且不会引起注意。尽量避免它。

1。删除项时,最好在循环中反向执行,因为索引可能会更改。2.您必须测试差异,而不是相等性(使用而不是=)。像这样在错误恢复时使用
是一种非常糟糕的做法。它隐藏了所有错误消息,但错误仍然会发生(您只是看不到它们的消息)。这意味着您无法修复错误,您的代码可能无法正确运行,您甚至没有注意到它,因为根本没有消息。删除该行,如果出现错误,请修复它们如果没有完整且良好的错误处理,请不要使用该行(请参阅)。非常感谢您共享该链接。我刚开始编写一个月的新代码,所以所有信息都很有用。删除项时,最好在循环中反向执行,因为索引可能会更改。2.您必须测试差异,而不是相等性(使用而不是=)。像这样在错误恢复时使用
是一种非常糟糕的做法。它隐藏了所有错误消息,但错误仍然会发生(您只是看不到它们的消息)。这意味着您无法修复错误,您的代码可能无法正确运行,您甚至没有注意到它,因为根本没有消息。删除该行,如果出现错误,请修复它们如果没有完整且良好的错误处理,请不要使用该行(请参阅)。非常感谢您共享该链接。我刚开始编写一个月的新代码,所以所有信息都很有帮助。您好Vityata,非常感谢您提供了如此详细的答案,并注意避免使用错误恢复下一个命令。也就是说,我已经分享了我的全部代码,正如你现在所看到的,我真正想要实现的是在选择combobox2值时,我希望从列表框1中删除所有没有combobox2中所述值的内容,而不是删除combobox2中所选值的行。因此,如果我们谈论你的答案,任务将是删除除“CCC”之外的所有内容。哦,等等,更改=工作!!!!它提出了另一个问题,但至少解决了这个问题。非常感谢你,维迪亚塔-不客气。:)我已经将您的问题退回到上一个状态,因为它更为一致。您好Vityta,非常感谢您提供如此详细的答案,并注意避免使用错误恢复下一个命令。也就是说,我已经分享了我的全部代码,正如你现在所看到的,我真正想要实现的是在选择combobox2值时,我希望从列表框1中删除所有没有combobox2中所述值的内容,而不是删除combobox2中所选值的行。因此,如果我们谈论你的答案,任务将是删除除“CCC”之外的所有内容。哦,等等,更改=工作!!!!它提出了另一个问题,但至少解决了这个问题。非常感谢你,维迪亚塔-不客气。:)我已经把你的问题退回到先前的状态,因为它更为一致。