返回独特的价值,并避免循环未过滤的范围

首先在这里发表,所以我希望我很清楚。

我正在使用的工作表上有一个表格。 我已经将listObject传递给一个类,它可以从中返回各种数据。 我想检索一个唯一的列表,通过筛选指定的列标题。

我的问题是这样的:

我是否可以返回一个包含所有行的范围,一旦过滤,无需手动循环遍历整个未过滤的范围?

我目前的代码遍历(未经过筛选的)范围,寻找下面的唯一条目。 我的testing工作表需要花费大量时间,所以不要认为这个操作示例是可行的。

Public Function returnUniqueList(col As String) As Collection ' get unqiue lists from the table. Useful for things like LCPs or ballast types ' returns as list of strings Dim i As Integer Dim r As Excel.Range Dim reqCol As Integer Dim tempString As String ' collection of strings with the unique values Dim retString As New Collection reqCol = returnColId(col) On Error GoTo errorCatch ' collect the unique values For Each r In pLO.Range.rows If Not InCollection(retString, r.Cells(1, reqCol)) Then ' add to the collection, including the key If r.Cells(1, reqCol) <> "" Then retString.Add r.Cells(1, reqCol), r.Cells(1, reqCol) End If End If Next r Set returnUniqueList = retString Exit Function errorCatch: MsgBox "Error returning unique list: " + Err.Description End Function 

所以经过一些杂乱的各种内置的Excel / VBAfunction,我已经决定了先进的filter。 我遇到的一个问题是,当我在一列上过滤时,我想把过滤后的表格返回到调用的一段代码。 上面的函数现在看起来像这样:

 Public Function returnUniqueList(col As String, searchTerm As String) As Excel.range ' get unique lists from the table. Useful for things like LCPs or ballast types ' returns as excel.range Dim reqCol As Integer On Error GoTo errorCatch reqCol = returnColId(col) Dim critRange As String Dim cr As Excel.range critRange = "=""=" + searchTerm + "*""" pWkSht.Cells(1, 1000) = col pWkSht.Cells(2, 1000) = critRange Set cr = pWkSht.range(pWkSht.Cells(1, 1000), pWkSht.Cells(2, 1000)) ' filter for unique entries on this column pLO.range.Columns(reqCol).Select pLO.range.Columns(reqCol).AdvancedFilter Action:=xlFilterInPlace, Unique:=True, CriteriaRange:=cr Set returnUniqueList = pLO.range.SpecialCells(xlCellTypeVisible).EntireRow pWkSht.Cells(1, 1000) = Empty pWkSht.Cells(2, 1000) = Empty Exit Function errorCatch: MsgBox "Error returning unique list: " + Err.Description End Function 

我发现的棘手的事情是在调用函数的范围内工作。 我发现excel范围可以包含“区域”。 这是因为excel与连续数据一起工作的原因。 所以在调用函数中,我不得不遍历返回范围中的区域。 这确实增加了我原本希望避免的原始调用函数的开销(我希望返回一个单独的区域,并且可以轻松地遍历一个区域)。

我发现通过从上面返回的范围/区域迭代的最可靠的方法是基于这个片段,我以某种方式使用大量的地方(从表中拉出不同的列,等等:

 Set devices = edh.returnUniqueList("DaliCct", lcp) ' filter by the requested LCP 'clear down the dali ccts box daliCctsListBox.Clear ' cycle through the returned areas, retrieving the relvant info For i = 1 To devices.Areas.Count For rowInd = 1 To devices.Areas(i).rows.Count Dim r As Excel.range For Each r In devices.Areas(i).rows(rowInd) If (r.Cells(daliCctColId) <> "") And (r.Cells(daliCctColId) <> "DaliCct") Then daliCctsListBox.AddItem r.Cells(daliCctColId) bAdded = True End If Next r Next rowInd Next i