使用变量的多标准VBA自动过滤器

时间:2013-08-08 20:06:33

标签: vba excel-vba excel-2010 excel

编辑:要解决此问题,我将Dim Placed As Range更改为As Long。然后我改变了

Set Placed = Rows("3:3").Find("Placed", Range("A3"), searchdirection:=xlToRight)

Placed = Rows("3:3").Find("Placed", Range("A3"), searchdirection:=xlToRight).Column

现在代码工作得很好。 结束编辑

好的,我现在已经在这个问题上工作了近两个小时。

我正在尝试在工作表上编写几个选项按钮来根据需要过滤数据。

首先,我记录了自己过滤数据给我一个起点。这就是录音机吐出的内容:

ActiveSheet.Range("$A$3:$CS$212").AutoFilter Field:=53, Criteria1:=Array( _
    "Iteration 1", "Iteration 2", "Iteration 3", "Tradeshow", "="), Operator:= _
    xlFilterValues

为了使选项按钮更加健壮,我决定使用变量,以防万一添加了列或行,或者添加了标准。

我为Range()Field:=Criteria1:=添加了一个变量,但我的代码现在抛出此错误:Run-time error '1004': Autofilter Method of Range class failed

我想知道我是否正在使用Array不正确......?无论如何,这是我的声明:

Const Opt1 As String = "Iteration 1"
Const Opt2 As String = "Iteration 2"
Const Opt3 As String = "Iteration 3"
Const Opt4 As String = "Iteration 4"
Const Opt5 As String = "Tradeshow"
Const Opt6 As String = "Placed"

Dim Placed As Range             'This is the Field var.
Dim lastRow, lastColumn As Long 'Holds the last row and column numbers.
Dim Rng1, Rng2 As Range         'These hold the beginning and ending ranges for the filter

以下是我设置变量的方法:

lastRow = Range("A:A").Find("*", Range("A1"), searchdirection:=xlPrevious).Row
lastColumn = Cells(3, Columns.Count).End(xlToLeft).Column
Set Placed = Rows("3:3").Find("Placed", Range("A3"), searchdirection:=xlToRight)
Set Rng1 = Cells(3, 1)
Set Rng2 = Cells(lastRow, lastColumn)

最后,这是AutoFilter代码:

ActiveSheet.Range(Rng1, Rng2).AutoFilter Field:=Placed, Criteria1:=Array(Opt1, Opt2, Opt3, Opt4, Opt5, Opt6, "="), Operator:=xlFilterValues

有谁知道为什么会抛出这个错误?它与Array有关吗?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:11)

不,这是Field:=参数的问题。您已将其设置为“已放置”,并且已将“放置”变量分配给单元格。它必须是列号。例如,如果Placed列是D列而您的数据从A列开始,则Field应为4,因为它是第四列。如果放置的列是最后一列,则可以将Field设置为等于lastColumn变量:

ActiveSheet.Range(Rng1, Rng2).AutoFilter Field:=lastColumn, Criteria1:=Array(Opt1, Opt2, Opt3, Opt4, Opt5, Opt6, "="), Operator:=xlFilterValues