使用多个变量

时间:2018-02-04 15:28:32

标签: excel vba autofilter

使用自动过滤器时遇到问题。我需要一次过滤服务器值。 我在第一张纸上有值列表(第I2列:I50),在第二张纸上,我需要从数据库中过滤所有这些值。

到目前为止我的代码是:

   Dim OZ As Variant

   OZ = Array("100001", "100015")

   Sheets("Sheet2").Select
   Range("A1:M1").AutoFilter Field:=3, Criteria1:=OZ, _
   Operator:=xlFilterValues

到目前为止这种方法非常有效。现在我想以某种方式设置宏,所以数组引用Sheet1和I2的范围:I50。此范围内的值是由函数计算的变量。

你能帮我解决一下吗?。

由于

4 个答案:

答案 0 :(得分:0)

For会将您的OZ变量设置为Sheet1

中的所有49个值
'You need 49 values I2:I50
Dim OZ(49) As Variant

For i = 0 To 48
  '1st data row starts at I2, hence + 2
  OZ(i) = "=" & Worksheets("Sheet1").Range("I" & i + 2).Value
Next i


Worksheets("Sheet2").Range("A1:M1").AutoFilter Field:=3, Criteria1:=OZ, Operator:=xlFilterValues

答案 1 :(得分:0)

您可以使用Join()和Split()函数返回与Criteria1

兼容的Variant数组
Dim OZ As Variant

OZ = Split(Join(Application.Transpose(Worksheets("Sheet1").Range("I2:I50").Value), "|"), "|")

Worksheets("Sheet2").Select
Range("A1:M1").AutoFilter Field:=3, _
                          Criteria1:=OZ, _
                          Operator:=xlFilterValues

但是你应该避免选择/选择/激活/ ActiveXXX 模式并使用明确的完全限定范围引用

Worksheets("Sheet2").Range("A1:M1").AutoFilter Field:=3, _
                                               Criteria1:=Split(Join(Application.Transpose(Worksheets("Sheet1").Range("I2:I50").Value), "|"), "|"), _
                                               Operator:=xlFilterValues

答案 2 :(得分:0)

我认为高级过滤器可以完成这项工作。

Sub ExampleCopy()
    Sheets("Table").Range("A1:B7").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Sheets("Cryteria").Range("A1:15"), _
        CopyToRange:=Sheets("Result").Range("A1"), _
        Unique:=False
    Sheets("Result").Select
End Sub

'OR

Sub ExampleInPlace()
    Sheets("Table").Range("A1:A11").AdvancedFilter Action:=xlFilterInPlace _
    , CriteriaRange:=Sheets("Cryteria").Range("A1:A6"), Unique:=False
End Sub

第一个将结果复制到自定义位置。在这种情况下,对于“结果”单元格A1。 第二个将过滤到位,因此在表“表”中

请记住,为了使其工作,您的cryteria列标题必须与数据表列相同。

您可以尝试使用功能区选项卡“数据”部分“排序和过滤”中的“高级”录制此宏。

祝你好运。

答案 3 :(得分:0)

范围可以是evaluated到数组:

[Sheet2!A1:M1].AutoFilter 3, [transpose(text(Sheet1!I2:I50, "@"))], xlFilterValues