从 VBA 中的筛选器中提取唯一值的集合
Extracting the collection of unique values from a filter in VBA
我有一个文件,其中的行在 8 列中扩展到数万行。一个特定的列包含周末日期。我必须计算此文件中存在的周末数。
有没有办法提取如下图所示的数据?
如果我们能提取并得到这个集合的计数,那么问题就解决了。
请帮忙。
提前致谢!
以下将从 A 列(25K 个值)中取出一系列三个随机大写字母,将它们作为唯一键(13,382 个值)放入字典中,然后将它们转储回同一工作表上的 C 列中对它们进行排序。往返大约需要 0.072 秒。
The following code requires that you go into the VBE's Tools ► References and add Microsoft Scripting Runtime. This holds the library definitions for a Scripting.Dictionary. However, if you use CreateObject("Scripting.Dictionary"), you do not require the library reference.
Sub buildFilterList()
Dim dMUSKMELONs As Object 'New Scripting.Dictionary
Dim v As Long, w As Long, vTMPs As Variant
Debug.Print Timer
Set dMUSKMELONs = CreateObject("Scripting.Dictionary")
With Worksheets("Sheet2") '<-set this worksheet reference properly!
vTMPs = .Range(.Cells(2, "A"), .Cells(Rows.Count, "A").End(xlUp)).Value2
For v = LBound(vTMPs, 1) To UBound(vTMPs, 1)
If Not dMUSKMELONs.Exists(vTMPs(v, 1)) Then _
dMUSKMELONs.Add key:=vTMPs(v, 1), Item:=vbNullString
Next v
With .Cells(2, "C").Resize(dMUSKMELONs.Count, 1)
.Value = Application.Transpose(dMUSKMELONs.Keys)
.Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlNo
End With
.Cells(2, "D") = dMUSKMELONs.Count
End With
dMUSKMELONs.RemoveAll
Set dMUSKMELONs = Nothing
Debug.Print Timer
End Sub
结果应该与此类似:
Select 单元格范围,或确保活动单元格位于 table.
在“数据”选项卡上的“排序和筛选”组中,单击“高级”。
数据选项卡上的排序和筛选组
在“高级筛选器”对话框中,执行下列操作之一:
要过滤单元格范围或 table 就地,请单击就地过滤列表。
要将过滤器的结果复制到另一个位置,请执行以下操作:
单击复制到另一个位置。
在“复制到”框中,输入单元格引用。
或者,单击折叠对话框按钮图像暂时隐藏对话框,select 工作表上的一个单元格,然后按展开对话框按钮图像。
Select“仅唯一记录”复选框,然后单击“确定”。
selected 范围内的唯一值被复制到新位置。
要像在过滤器对话框中那样从列中获取唯一值,您可以使用 Range.RemoveDuplicates
方法。
示例:
' Index of Column which contains the weekend date
Const weekendDateColumn As Integer = 2
Sub GetUniques()
' Create copy of active sheet with data so original data remains unchanged
ActiveSheet.Copy After:=ActiveSheet
' Call Range.RemoveDuplicates method which removes duplicates in
' data besed on values in column 'weekendDateColumn'
Dim data As Range
Set data = ActiveSheet.Range("A1").CurrentRegion
data.RemoveDuplicates Columns:=Array(weekendDateColumn), Header:=xlYes
' Get unique values into array
Dim uniques As Variant
uniques = data.CurrentRegion.Columns(weekendDateColumn).Value
' Clear data resize it to size of uniques and paste the uniques there
data.Clear
data.Resize(UBound(uniques, 1), 1).Value = uniques
End Sub
您可以使用 ADODB 连接到适当的工作表,并对工作表发出 SQL 语句:
Dim datasourcePath As String
datasourcePath = "C:\path\to\excel\file.xlsx"
Dim connectionString As String
connectionString = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=""" & datasourcePath & """;" & _
"Extended Properties=""Excel 12.0;HDR=No""
Dim sql As String
sql = "SELECT DISTINCT F1 FROM [Sheet1$]" 'F1 is an autogenerated field name
Dim rs As New ADODB.Recordset
rs.Open sql, connectionString
Do Until rs.EOF
Debug.Print rs("F1")
Loop
是,数据选项卡 >> 删除重复项
我有一个文件,其中的行在 8 列中扩展到数万行。一个特定的列包含周末日期。我必须计算此文件中存在的周末数。
有没有办法提取如下图所示的数据?
如果我们能提取并得到这个集合的计数,那么问题就解决了。
请帮忙。
提前致谢!
以下将从 A 列(25K 个值)中取出一系列三个随机大写字母,将它们作为唯一键(13,382 个值)放入字典中,然后将它们转储回同一工作表上的 C 列中对它们进行排序。往返大约需要 0.072 秒。
The following code requires that you go into the VBE's Tools ► References and add Microsoft Scripting Runtime. This holds the library definitions for a Scripting.Dictionary. However, if you use CreateObject("Scripting.Dictionary"), you do not require the library reference.
Sub buildFilterList()
Dim dMUSKMELONs As Object 'New Scripting.Dictionary
Dim v As Long, w As Long, vTMPs As Variant
Debug.Print Timer
Set dMUSKMELONs = CreateObject("Scripting.Dictionary")
With Worksheets("Sheet2") '<-set this worksheet reference properly!
vTMPs = .Range(.Cells(2, "A"), .Cells(Rows.Count, "A").End(xlUp)).Value2
For v = LBound(vTMPs, 1) To UBound(vTMPs, 1)
If Not dMUSKMELONs.Exists(vTMPs(v, 1)) Then _
dMUSKMELONs.Add key:=vTMPs(v, 1), Item:=vbNullString
Next v
With .Cells(2, "C").Resize(dMUSKMELONs.Count, 1)
.Value = Application.Transpose(dMUSKMELONs.Keys)
.Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlNo
End With
.Cells(2, "D") = dMUSKMELONs.Count
End With
dMUSKMELONs.RemoveAll
Set dMUSKMELONs = Nothing
Debug.Print Timer
End Sub
结果应该与此类似:
Select 单元格范围,或确保活动单元格位于 table.
在“数据”选项卡上的“排序和筛选”组中,单击“高级”。
数据选项卡上的排序和筛选组
在“高级筛选器”对话框中,执行下列操作之一:
要过滤单元格范围或 table 就地,请单击就地过滤列表。
要将过滤器的结果复制到另一个位置,请执行以下操作:
单击复制到另一个位置。
在“复制到”框中,输入单元格引用。
或者,单击折叠对话框按钮图像暂时隐藏对话框,select 工作表上的一个单元格,然后按展开对话框按钮图像。
Select“仅唯一记录”复选框,然后单击“确定”。
selected 范围内的唯一值被复制到新位置。
要像在过滤器对话框中那样从列中获取唯一值,您可以使用 Range.RemoveDuplicates
方法。
示例:
' Index of Column which contains the weekend date
Const weekendDateColumn As Integer = 2
Sub GetUniques()
' Create copy of active sheet with data so original data remains unchanged
ActiveSheet.Copy After:=ActiveSheet
' Call Range.RemoveDuplicates method which removes duplicates in
' data besed on values in column 'weekendDateColumn'
Dim data As Range
Set data = ActiveSheet.Range("A1").CurrentRegion
data.RemoveDuplicates Columns:=Array(weekendDateColumn), Header:=xlYes
' Get unique values into array
Dim uniques As Variant
uniques = data.CurrentRegion.Columns(weekendDateColumn).Value
' Clear data resize it to size of uniques and paste the uniques there
data.Clear
data.Resize(UBound(uniques, 1), 1).Value = uniques
End Sub
您可以使用 ADODB 连接到适当的工作表,并对工作表发出 SQL 语句:
Dim datasourcePath As String
datasourcePath = "C:\path\to\excel\file.xlsx"
Dim connectionString As String
connectionString = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=""" & datasourcePath & """;" & _
"Extended Properties=""Excel 12.0;HDR=No""
Dim sql As String
sql = "SELECT DISTINCT F1 FROM [Sheet1$]" 'F1 is an autogenerated field name
Dim rs As New ADODB.Recordset
rs.Open sql, connectionString
Do Until rs.EOF
Debug.Print rs("F1")
Loop
是,数据选项卡 >> 删除重复项