2016-01-07 55 views
2
Dim libRng As Range, item As Long 
Dim refArrCheck As Variant, refArr As Variant 

Set libRng = Sheets("Sheet2").Range("B2:F1000") 
refArr = Sheets("Sheet1").Range("A1:BA1") 

For Each refArrCheck In refArr 
    For Each cell In libRng.Cells 
     For item = Me.ListBox1.ListCount - 1 To 0 Step -1 
      If Me.ListBox1.Column(0, item) = cell.Value And cell.Value = refArrCheck Then 
       Me.ListBox1.RemoveItem (item) 
      End If 
     Next 
    Next 
Next refArrCheck 

从本质上讲,我想告诉Excel中通过libRng看,如果有任何匹配它与阵列refArr比较,从列表框中删除项目refArr值是列表框中列出的项目。下面的代码似乎“工作”,但它不能正常工作,当我运行它时,它只会删除1个匹配项的匹配项。Excel的VBA:删除列表框项目,如果在阵列

我的第三个For循环或If语句是否错误?如果libRng中的某些单元格是空白的,它也会起作用吗?

回答

2

似乎有很多不必要的循环和检查。有原生的工作表函数可以一次搜索整个范围来确定值的存在。

Dim libRng As Range, refArr As Range, itm As Long 

Set libRng = Worksheets("Sheet2").Range("B2:F1000") 
Set refArr = Worksheets("Sheet1").Range("A1:BA1") 

For itm = Me.ListBox1.ListCount - 1 To 0 Step -1 
    If CBool(Application.CountIf(libRng, Me.ListBox1.Column(0, itm))) And _ 
     CBool(Application.CountIf(refArr, Me.ListBox1.Column(0, itm))) Then 
      Me.ListBox1.RemoveItem (itm) 
    End If 
Next 

WorksheetFunction object canot使用数组与COUNTIF function但它可以与一个MATCH function

+0

更清洁的版本,然后地雷。我的代码真正的问题是我的libRng设置错误,这就是为什么(我认为)它没有按预期工作的原因。总的来说,我更喜欢你的。谢谢! – NuWin