我使用这个公式将列A中的唯一记录复制到列B中。
Range("A1", Range("A100").End(xlUp)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1"), Unique:=True
在Excel VBA中,如何将筛选后的结果放入数组而不是复制到B列中?
我使用这个公式将列A中的唯一记录复制到列B中。
Range("A1", Range("A100").End(xlUp)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1"), Unique:=True
在Excel VBA中,如何将筛选后的结果放入数组而不是复制到B列中?
距离这个问题被问出已经一年了,但我今天遇到了同样的问题,这是我的解决方案:
Function copyFilteredData() As Variant
Dim selectedData() As Variant
Dim aCnt As Long
Dim rCnt As Long
Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Select
On Error GoTo MakeArray:
For aCnt = 1 To Selection.Areas.Count
For rCnt = 1 To Selection.Areas(aCnt).Rows.Count
ReDim Preserve SelectedData(UBound(selectedData) + 1)
selectedData(UBound(selectedData)) = Selection.Areas(aCnt).Rows(rCnt)
Next
Next
copyFilteredData = selectedData
Exit Function
MakeArray:
ReDim selectedData(1)
Resume Next
End Function
Select
,并声明一些范围来代替 Selection
。除此之外,方法不错。 - Wolfie以防有人再看这个… 我创建了这个函数来处理一维范围,但它也将更高维度的范围写入一维数组;修改为将多维范围写入“相同形状”的数组也不应该太难。您需要引用scrrun.dll来创建字典对象。缩放可能是一个问题,因为使用了“for each”循环,但如果您正在使用EXCEL,则这可能不是您担心的事情:
Function RangeToArrUnique(rng As Range)
Dim d As Object, cl As Range
Set d = CreateObject("Scripting.Dictionary")
For Each cl In rng
d(cl.Value) = 1
Next cl
RangeToArrUnique = d.keys
End Function
Dim dat as worksheet
set dat = sheets("Data")
roomArr = Array("OR01","OR02","OR03")
dat.UsedRange.AutoFilter field:=2, criteria1:=roomArr, operator:=xlFilterValues
fltArr = RangeToArrUnique(dat.UsedRange.SpecialCells(CellTypeVisible))
Sub tester()
Dim arr
arr = UniquesFromRange(ActiveSheet.Range("A1:A5"))
If UBound(arr) = -1 Then
Debug.Print "no values found"
Else
Debug.Print "got array of unique values"
End If
End Sub
Function UniquesFromRange(rng As Range)
Dim d As Object, c As Range, tmp
Set d = CreateObject("scripting.dictionary")
For Each c In rng.Cells
tmp = Trim(c.Value)
If Len(tmp) > 0 Then
If Not d.Exists(tmp) Then d.Add tmp, 1
End If
Next c
UniquesFromRange = d.keys
End Function
Public Sub filteredRangeToArray(rg As Range, arr As Variant)
Dim i As Long
Dim j As Long
Dim row As Range
'If 0 results in Filter just exit
If Not rg.SpecialCells(xlCellTypeVisible).Count > 0 Then Exit Sub
i = 1
Erase arr
ReDim arr(1 To rg.Columns.Count, 1 To _
rg.Columns(1).SpecialCells(xlCellTypeVisible).Count)
For Each row In rg.Rows
If Not row.Hidden Then
For j = LBound(arr, 1) To UBound(arr, 1)
arr(j, i) = row.Cells(j)
Next j
i = i + 1
End If
Next row
arr = WorksheetFunction.Transpose(arr)
End Sub
您会想要阅读此文,它将指引您朝正确的方向前进。
它说:
Function GetArrayFromFilteredRange(rng As Range) As Variant
Dim arr As Variant
sht_calc.Cells.Clear
rng.Copy sht_calc.Range("A1")
arr = sht_calc.UsedRange.Value
GetArrayFromFilteredRange = arr
End Function
sht1
的工作表中获取名为Table1
的表中已筛选行的数组,只需执行以下操作:dim rng as range
arr = GetArrayFromFilteredRange(sht1.ListObjects("Table1").DataBodyRange.SpecialCells(xlCellTypeVisible))
arr=GetArrayFromFilteredRange(rng)
Sub test()
Dim targetRng As Range
Dim i As Integer
Set targetRng = Sheets(3).Range("a1")
Range("A1", Range("A999").End(xlUp)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=targetRng, Unique:=True
Dim numbElements As Integer
numbElements = targetRng.End(xlDown).Row
Dim arr() As String
ReDim arr(1 To numbElements) As String
For i = 1 To numbElements
arr(i) = targetRng.Offset(i - 1, 0).Value
Next i
End Sub