簡體   English   中英

Excel VBA 過濾到帶有條件的數組

[英]Excel VBA filter to Array with criteria

我正在嘗試將表數據過濾到具有來自該表中單獨列的條件的數組中,我可以在工作表上使用創建溢出數組的簡單公式來實現這一點。

=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

我遇到錯誤並繞着圈子試圖解決應該是一個簡單的問題。 如果名稱出現在數組中,我最終將使用該數組來測試其他表。 TIA

使用這種方法是不可能做到這一點的,主要是因為在 VBA 中,您不能將數組直接與單個值進行比較並返回一個數組。

您可以做的是將 Evaluate 與您已有的公式一起使用。

Sub myArraySub()
Dim myArray1 As Variant

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

End Sub

如果您不能在此線程中使用從@Norie 獲得的非常有創意的答案,您的問題也在這里得到了廣泛的回答 但是通讀那里的所有解決方案,我想知道它們是否值得付出努力。 因此,這是實現相同結果的更繁瑣的方法。 如果表中的行數不是很大,這可能是您最好的選擇。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM