包含来自 excel 2007 vba 中经过过滤和排序的列表对象的数据的数组
Array with data from filtered and ordered listobject in excel 2007 vba
大家早上好,
我有一个包含 17 个字段和一些行(10-20 行)的列表对象,我需要过滤列表对象以获得我在列中找到的任何不同值。
这个过滤后的列表对象必须按另一个整数列按升序排序,然后我必须找到不按顺序的数据并获取连续数字的最小值和最大值。
为了获得唯一值,我编写了这个运行良好的函数:
Public Function GetUnique(Inputrange As Range)
Dim d As Object, c As Range, k, tmp As String
Set d = CreateObject("scripting.dictionary")
For Each c In Inputrange
tmp = Trim(c.Value)
If Len(tmp) > 0 Then d(tmp) = d(tmp) + 1
Next c
GetUnique = d.Keys
End Function
要过滤数据并对过滤后的数据进行排序,我正在尝试使用此代码
Dim tblaux as listobject
Dim RdS as variant
Dim r as variant
With tblaux
Z = GetUnique(.ListColumns(7).DataBodyRange)
For Each RdS In Z
.Range.AutoFilter Field:=7, Criteria1:="=" & RdS
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range.Columns(1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With .Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
Set r = .rng.Offset(1, 0).Resize(.rng.Rows.Count - 1, .rng.Columns.Count).SpecialCells(xlCellTypeVisible)
End With
Next RdS
End with
我从这段代码中得到的应该是一个包含过滤和排序数据的数组,但我得到的是与 table.
中的非连续行相对应的许多区域
我有点生气,但我无法解决这个问题。
感谢支持
已编辑 在 OP 澄清后他想要一个 连续 范围过滤
Option Explicit
Sub main()
Dim tblaux As ListObject
Dim RdS As Variant, Z As Variant
Dim r As Variant
With Worksheets("tblaux").ListObjects("tblaux")
Z = GetUnique(.ListColumns(7).DataBodyRange)
With .Range
For Each RdS In Z
.Sort key1:=.Range("G1"), order1:=xlAscending, key2:=.Range("A1"), order2:=xlAscending, Header:=xlYes, Orientation:=xlTopToBottom, MatchCase:=False
.AutoFilter Field:=7, Criteria1:="=" & RdS
MsgBox .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).SpecialCells(xlCellTypeVisible).Address
r = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).SpecialCells(xlCellTypeVisible).Value
Next RdS
End With
End With
End Sub
大家早上好, 我有一个包含 17 个字段和一些行(10-20 行)的列表对象,我需要过滤列表对象以获得我在列中找到的任何不同值。 这个过滤后的列表对象必须按另一个整数列按升序排序,然后我必须找到不按顺序的数据并获取连续数字的最小值和最大值。
为了获得唯一值,我编写了这个运行良好的函数:
Public Function GetUnique(Inputrange As Range)
Dim d As Object, c As Range, k, tmp As String
Set d = CreateObject("scripting.dictionary")
For Each c In Inputrange
tmp = Trim(c.Value)
If Len(tmp) > 0 Then d(tmp) = d(tmp) + 1
Next c
GetUnique = d.Keys
End Function
要过滤数据并对过滤后的数据进行排序,我正在尝试使用此代码
Dim tblaux as listobject
Dim RdS as variant
Dim r as variant
With tblaux
Z = GetUnique(.ListColumns(7).DataBodyRange)
For Each RdS In Z
.Range.AutoFilter Field:=7, Criteria1:="=" & RdS
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range.Columns(1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With .Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
Set r = .rng.Offset(1, 0).Resize(.rng.Rows.Count - 1, .rng.Columns.Count).SpecialCells(xlCellTypeVisible)
End With
Next RdS
End with
我从这段代码中得到的应该是一个包含过滤和排序数据的数组,但我得到的是与 table.
中的非连续行相对应的许多区域我有点生气,但我无法解决这个问题。
感谢支持
已编辑 在 OP 澄清后他想要一个 连续 范围过滤
Option Explicit
Sub main()
Dim tblaux As ListObject
Dim RdS As Variant, Z As Variant
Dim r As Variant
With Worksheets("tblaux").ListObjects("tblaux")
Z = GetUnique(.ListColumns(7).DataBodyRange)
With .Range
For Each RdS In Z
.Sort key1:=.Range("G1"), order1:=xlAscending, key2:=.Range("A1"), order2:=xlAscending, Header:=xlYes, Orientation:=xlTopToBottom, MatchCase:=False
.AutoFilter Field:=7, Criteria1:="=" & RdS
MsgBox .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).SpecialCells(xlCellTypeVisible).Address
r = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).SpecialCells(xlCellTypeVisible).Value
Next RdS
End With
End With
End Sub