[英]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.