2016-01-07 80 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