VBA:范围类的自动过滤方法失败

时间:2014-07-23 21:45:11

标签: excel vba

我收到错误

  

范围类的自动过滤方法失败

就行了

RngToSearch.AutoFilter 1, Criteria1:=ProgramNoVal

我要做的是根据ProgramNoVal过滤程序主页的C栏中的数据,然后在RngDest的Mkting标签中复制相应列K的值。

Sub test()

Dim ProgramNoVal
Dim RngToSearch As Range, Rng As Range, RngDest As Range
ProgramNoVal = Sheets("Instructions").Range("G12").Value

With Sheets("Mkting")
        Set RngDest = .Range("D1")
End With

Sheets("ProgramMain").Select
Set RngToSearch = Range("C1:K30000")
Set Rng = RngToSearch.Offset(1, 8).Resize(RngToSearch.Rows.Count - 1, 1)

ActiveSheet.AutoFilterMode = False
RngToSearch.AutoFilter 1, Criteria1:=ProgramNoVal
Rng.SpecialCells(xlCellTypeVisible).Copy RngDest
RngToSearch.AutoFilter

End Sub

我使用vlookup尝试了另一种方法。我发现了FoundRow的类型不匹配。它找到的值是一个字符串。我尝试了字符串,长,范围等,但没有任何作用。对这些代码中的任何一个的解决方案表示赞赏。 vlookup的代码是:

Sub test()

Dim ProgramNoVal
Dim RngToSearch As Range, Rng As Range, RngDest As Range
Dim foundRow As long


With Sheets("Mkting")
   Set RngDest = .Range("D1")
End With

ProgramNoVal = Sheets("Instructions").Range("G12").Value

    Set RngToSearch = Sheets("ProgramMain").Range("C1:K30000")
    foundRow = Sheets("ProgramMain").Application.VLookup(ProgramNoVal, RngToSearch, 9, False)

    If Not IsError(foundRow) Then
        RngToSearch.Cells(foundRow, 1).Copy RngDest
    End If
End Sub

1 个答案:

答案 0 :(得分:0)

Dim foundRow as Variant

这是因为,如果找不到/不存在该值,则Application.Vlookup将返回错误类型,这将在分配给Long类型变量时引发不匹配。

但是由于vlookup返回而不是单元格的位置,我们无法按照我们尝试的方式使用(这是我没有测试我的代码所得到的)

而不是VLOOKUP使用MATCH

foundRow = Sheets("ProgramMain").Application.Match(ProgramNoVal, RngToSearch.Columns(1), False)

Match函数返回搜索值的相对行位置。由于我们正在搜索从第1行开始的范围,因此我们可以使用此值而不进行任何修改:

If Not IsError(foundRow) Then
    RngToSearch.Cells(foundRow, 1).Copy RngDest
End If