是否有一个本地的Excel类,允许范围被复制和sorting/filter应用?
我有一个范围,我想任意sorting和过滤使用VBA。 但是,我不想让它影响工作表。 我想本质上复制范围到一些支持筛选和sorting的本地类(所以我不必重新发明轮子),并使用该类来返回结果调用代码。
有没有我可以用来达到这个目的的课程? ListObject看起来是最有希望的,但似乎需要绑定到工作表范围才能正常工作。
您可以使用logging集。 以下是一些注意事项:
'Reference: Microsost ActiveX nn Object Library ' Dim rs As ADODB.Recordset Dim cn As ADODB.Connection 'From: http://support.microsoft.com/kb/246335 ' strFile = Workbooks(1).FullName strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _ & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Open strCon 'Must have client-side cursor for sorting ' rs.CursorLocation = adUseClient 'Substitute a name range for [Sheet1$] ' 'or include a range of cells : [Sheet1&A1:C7] ' strSQL = "SELECT * FROM [Sheet1$] " _ & "WHERE TransID>2 ORDER BY MyTime" rs.Open strSQL, cn, 3, 3 rs.Filter = "TransID=3" rs.Sort = "Mytime" 'Write out to another sheet ' Worksheets(2).Cells(2, 1).CopyFromRecordset rs
您可能会发现这个线程有趣: 与VBA同步两个列表
如果您想阅读和分析复杂的数据集,可以使用Microsoft ActiveX Data Objects Recordset 2.8 Library
。 有了这个,你可以读取你的数据到一个logging集,然后过滤,sorting,追加,删除,并将其传递给其他function。
我经常使用这个,因为我经常需要操纵和显示大型数据集。 如果它在logging集中,我可以一次又一次地使用相同的操作和演示例程。
有关将数据引入logging集的示例,请参见合并Excel表格…. 在logging集中有数据后,使用r.filter =“ColumnA = 1”或r.sort =“ColumnC,ColumnA”。
原来我可以创build一个logging集来做到这一点。 不同的是,Remou的回答,虽然我们不必在我们的工作表上调用一个重量级的odbc进程。
以下function(根据Mark Nold的答案改编而来)将根据提供的范围创build一个logging集。 它假定列标题在提供的范围的第一行。 这可以做得更强大,但是它是一个很好的起点
Function CreateRecordSet(rSource As range) As Recordset ' Constants Const MAX_CHARS = 1200 ' Declarations Dim rs As Recordset Dim c As Long Dim r As Long Dim colCount As Long Dim rowCount As Long Dim fldName As String colCount = rSource.Columns.Count rowCount = rSource.rows.Count ' Setup record set Set rs = New Recordset r = 1 ' assume first row contains headers For c = 1 To colCount fldName = rSource.Cells(r, c).Value rs.Fields.Append fldName, adVarChar, MAX_CHARS Next c ' Fill record set rs.Open r = 2 ' skip header row For r = 2 To rowCount rs.AddNew Debug.Print "row "; r & " of " & rowCount & " created" For c = 1 To colCount rs.Fields(c - 1) = CStr(rSource.Cells(r, c).Value) Debug.Print "-- row(" & r; "): added col " & c & " of " & colCount Next c Next r Set CreateRecordSet = rs End Function Sub TestCreateRecordSet() Dim r As range Dim rs As Recordset Set r = range("A1:B4") Set rs = CreateRecordSet(r) End Sub
你想要使用一个Range类(就像CasperOne所说的)。 这是一些VBA代码的例子
Function SortAndFilter(rSource As Range) As Range
Dim rResult As Range Dim vaTemp As Variant Dim wsTemp As Worksheet Dim wbTemp As Workbook vaTemp = rSource.Value Set wbTemp = Workbooks.Add Set wsTemp = wbTemp.Sheets(1) Set rResult = wsTemp.Range("A1").Resize(UBound(vaTemp, 1), UBound(vaTemp, 2)) rResult.Value = vaTemp rResult.Sort rResult.Cells(1), xlDescending Set SortAndFilter = rResult
结束function
Sub Testit()
Dim rTest As Range Set rTest = SortAndFilter(Selection) 'Do stuff with your range object rTest.Parent.Parent.Close False 'close temp workbook
结束小组
为什么不将数据复制到一个新的隐藏工作表,在那里执行sorting/筛选,然后在完成时将数据复制回来?