excel 使用该表中某列的条件将表数据过滤到Array中

beq87vna  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(111)

我正尝试使用该表中单独列的条件将表数据过滤到数组中。
我可以在工作表上用一个简单的公式创建一个溢出数组来实现这一点。

=FILTER(tblMain[Name],tblMain[At Work]=1)

我得到这个代码的错误:

Sub myArraySub()
Dim myTable As ListObject
Dim myArray1 As Variant
Dim myArray2 As Variant
Dim myArray3 As Variant

'Set path for Table variable
    Set myTable = ActiveWorkbook.Worksheets("Main").ListObjects("tblMain")
'Create Array
    myArray1 = Application.Transpose(myTable.ListColumns("Name").DataBodyRange.Value)
    myArray2 = Application.Transpose(myTable.ListColumns("At Work").DataBodyRange.Value)
    myArray3 = Application.Filter(myArray1, myArray2 = 1)
End Sub

如果Name出现在数组中,我最终将使用该数组来测试其他表。

uhry853o

uhry853o1#

使用这种方法无法实现这一点,主要是因为在VBA中不能将数组直接与单个值进行比较并返回数组。
你可以做的是使用Evaluate与你已经有了公式。

Sub myArraySub()
Dim myArray1 As Variant

    myArray1 = Evaluate("=FILTER(tblMain[Name],tblMain[At Work]=1)")

End Sub
vcirk6k6

vcirk6k62#

如果你不能在这个帖子中使用@Norie提供的非常有创意的答案,你的问题也是answered here。但是阅读了所有的解决方案,我想知道它们是否值得努力。所以,这里有一个更缓慢的方法来达到同样的结果。如果你的表中的行数不是很大,这可能是你最好的选择。

Function MyArray() As Variant
    
    Dim Fun         As Variant          ' function return array
    Dim Arr         As Variant          ' working copy of entire table
    Dim Rs          As Long             ' loop counter: Arr (Source) rows
    Dim Rt          As Long             ' loop counter: Fun (Target) rows
    Dim C           As Long             ' loop counter: columns
    
    Arr = ActiveWorkbook.Worksheets("Main").ListObjects("tblMain").DataBodyRange.Value
    ReDim Fun(1 To UBound(Arr, 2), 1 To UBound(Arr))
    For Rs = 1 To UBound(Arr)
        If Arr(Rs, 2) = 1 Then
            Rt = Rt + 1
            For C = 1 To UBound(Arr, 2)
                Fun(C, Rt) = Arr(Rs, C)
            Next C
        End If
    Next Rs
    
    ReDim Preserve Fun(1 To UBound(Fun), 1 To Rt)
    MyArray = Application.Transpose(Fun)
End Function

使用下面的小程序进行测试。

Sub Test_MyArray()

    Dim Arr     As Variant
    Dim R       As Long
    Dim C       As Long
    
    Arr = MyArray
    For R = 1 To UBound(Arr)
        For C = 1 To UBound(Arr, 2)
            Debug.Print Arr(R, C),
        Next C
        Debug.Print
    Next R
End Sub

相关问题