この式を使用して、一意のレコードを列 A から列 B にコピーします。
Range("A1", Range("A100").End(xlUp)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1"), Unique:=True
列 B にコピーする代わりに、フィルター処理された結果を Excel VBA の配列にどのように配置しますか?
この質問が出されてからちょうど 1 年が経ちましたが、今日同じ問題に遭遇しました。これが私の解決策です。
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
これにより、配列の要素 0 は空のままになりますが、UBound(SelectedData) は選択範囲内の行数を返します。
あなたはこれを読みたくなるでしょう、そしてそれはあなたを正しい方向に向けるでしょう
それは言います:
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
以下は、列Aから情報を取得し、リストを示しています。データ入力に使用できる「Sheet3」があることを前提としています(これを変更することをお勧めします)。
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