将动态更改单元格值添加到VBA中的自动筛选器数组

时间:2018-05-06 13:29:16

标签: arrays excel vba autofilter

在我在Range中的Excel表格中的Sheet1(" B6")我有一个代码,所以它可能是本月的一个代码,但它也可以在下面添加3个以下代码在下个月可能是两个新的,所以价值将继续变化,数字可以介于1到任何动态的范围内。根据下一个Sheet2上的这些值,需要过滤日期。所以在Sheet2中我有三列,一个是Sl_No。一个ME_Code(这是需要根据Sheet 1数据进行过滤的)和价格

所以我是VBA的新手并尝试下面的代码,当我有多个代码试图添加到VBA中的自动过滤器数组时,这个代码无效。

这是我的代码在我尝试使用else选项时无效,有人可以帮助我,我尝试了StackOverflow本身的一些选项,但没有工作

这是我的代码,

Sub ToCheckArray()

Dim N As Long

Worksheets("Sheet1").Select
If IsEmpty(Range("B6").Offset(1, 0).Value) Then
    Worksheets("Sheet1").Select
    arr1 = Array(Range("B6"))
    Worksheets("Sheet2").Select
    Range("A1:C1").AutoFilter field:=2, Criteria1:=arr1, Operator:=xlFilterValues
Else
    Worksheets("Sheet1").Select
    'With Sheets("Sheet1")
        'N = .Cells(Rows.Count, "B").End(xlDown).Row
        'ReDim ary(6 To N)
        'For i = 6 To N
            'ary(i) = .Cells(i, 1)
        'Next i
    'End With

    arr1 = Array(Range("B6", Range("B6").End(xlDown)))
    Worksheets("Sheet2").Select
    Range("A1:C1").AutoFilter field:=2, Criteria1:=ary, operator:=xlFilterValues
End If

End Sub

1 个答案:

答案 0 :(得分:1)

使用

Else
    Dim ary As Variant
    With Worksheets("Sheet1")
        ary = Application.Transpose(.Range("B6", .Cells(Rows.Count, "B").End(xlDown)).Value)
    End With
    Worksheets("Sheet2").Range("A1:C1").AutoFilter field:=2, Criteria1:=ary, operator:=xlFilterValues
End If

如您所见,我避免使用Select语句代替完全限定范围参考,直到工作表参考

所以你的整个代码可以按如下方式重写:

Sub ToCheckArray()
    Dim ary As Variant

    With Worksheets("Sheet1")
        If IsEmpty(.Range("B6").Offset(1, 0).Value) Then
            ary = Array(.Range("B6").Value)
        Else
            ary = Application.Transpose(.Range("B6", .Cells(Rows.Count, "B").End(xlDown)).Value
        End If
    End With
    Worksheets("Sheet2").Range("A1:C1").AutoFilter field:=2, Criteria1:=ary, Operator:=xlFilterValues
End Sub

如果您确定Sheet1始终具有B6中的值,并且可能的其他值将其跟随到B列中的最后一个非空单元格,则它可以折叠为:

Sub ToCheckArray()
    Dim ary As Variant

    With Worksheets("Sheet1")
        ary = Application.Transpose(.Range("B6", .Cells(Rows.Count, "B").End(xlUp)).Value
    End With
    Worksheets("Sheet2").Range("A1:C1").AutoFilter field:=2, Criteria1:=ary, Operator:=xlFilterValues
End Sub