2

ここに最初の投稿があるので、私は十分に明確であることを願っています。

作業しているワークシートにテーブルがあります。listObjectをクラスに渡しました。クラスは、そこからさまざまなデータを返すことができます。指定された列見出しに対してフィルタリングして、一意のリストを取得したいと思います。

私の質問はこれです:

フィルタリングされていない範囲全体を手動でループせずに、フィルタリングされたすべての行を含む範囲を返すことはできますか?

私の現在のコードは(フィルタリングされていない)範囲をループし、以下のように一意のエントリを探します。私のテストワークシートではかなりの時間がかかっているので、操作例では実行可能ではないと思います。

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
4

1 に答える 1

1

そのため、さまざまな組み込みのExcel / VBA機能をいじった後、高度なフィルターに落ち着きました。私が抱えていた問題の1つは、1つの列でフィルター処理しているときに、フィルター処理されたテーブルを呼び出し元のコードに戻したいということでした。上記の関数は次のようになります。

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
于 2012-12-06T13:33:48.813 に答える