【问题标题】:Excel VBA AutoFilter on user selection run-time error 1004用户选择运行时错误 1004 上的 Excel VBA 自动筛选
【发布时间】:2016-10-11 18:36:32
【问题描述】:

我有一个 Excel 2010 工作簿,其中包含 2 张工作表(“内容”和“文件夹”)。

本工作簿的目的是按供应商或参考编号跟踪不同的工作,前端(内容页面)易于使用,仅包含按钮和搜索框(不是实际上是一个单独的框,只是用户键入的内容表的单元格 J8(以下称为 J8)的内容。

这些按钮将按供应商类型过滤(并且工作得很好),但我遇到问题的是用户选择。

这个宏的代码是:

    Sub Find_Click()
    Dim userSelect As String
    userSelect = "*" & Range("J8") & "*"
    Sheets("Folders").Select
    ActiveSheet.Range("$B$1:$B$5000").AutoFilter Field:=2, Criteria:=userSelect, Operator:=x1And
    End Sub

按下“查找”按钮时,应显示为 J8,然后选择文件夹表并过滤结果以显示 B 列中包含 J8 中文本的每个条目。

这工作正常。但是,现在当我尝试使用此宏时,我收到 1004 运行时错误,并显示“应用程序定义或对象定义错误”消息。

有人可以帮忙吗?

编辑:

包含分配了遵循此格式的宏的按钮:

Sub Button1_Click()
Sheets("Folders").Select
ActiveSheet.Range("$A$1:$A$5000").AutoFilter Field:=1, Criteria1:= _
    "Criteria"
    Set r = Range(Range("A3"), Range("A3").End(xlDown))
j = WorksheetFunction.CountA(r.Cells.SpecialCells(xlCellTypeVisible))
'MsgBox j
If j = 0 Then
    MsgBox "There is currently no work relating to Criteria"
    ActiveSheet.AutoFilterMode = False
    ActiveSheet.Range("A3").Select
    Sheets("Contents").Select
End If
End Sub

还有一个重置按钮,可以清除过滤器并返回到目录表:

Sub Reset_Click()
ActiveSheet.ShowAllData
Sheets("Contents").Select
End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    通常,您需要在要使用AutoFilter 的范围内激活一个单元格。

    此外,当您尝试将 AutoFilter 与通配符(*?)或数学测试一起使用时,您需要在条件字符串的开头添加 =,因此

    userSelect = "=*" & Range("J8") & "*"
    

    那么,不是Criteria,而是Criteria1Criteria2,如果你使用第二个!所以在这种情况下你不需要Operator

    最后是ActiveSheet.Range("$B$1:$B$5000").AutoFilter Field:=2,您要求代码过滤只有一列的范围的第二列!

    所以如果你想过滤 col B,只需将 Field:=2 更改为 Field:=1


    这是工作代码:

    Sub Find_Click()
    Dim userSelect As String
    Dim wS as Worksheet
    userSelect = "=*" & Range("J8") & "*"
    Set wS = Sheets("Folders")
    wS.Activate
    wS.Range("B1").Activate
    If Not wS.AutoFilterMode Then wS.AutoFilterMode = True
    wS.Range("$B$1:$B$5000").AutoFilter Field:=1, Criteria1:=userSelect
    End Sub
    

    你在xlAnd中也有一个错字,是x1And;)

    【讨论】:

    • 感谢您的回复。我不确定从 VBA 编辑器复制和粘贴的拼写错误是如何出现的,而且那里是正确的……奇怪!我添加了 ActiveSheet.Range("B1").Activate 行,现在我收到运行时错误 424 Object Required。我不明白的是为什么它运行了一段时间非常好,然后随机决定停止!
    • 实际上,那是我是个白痴(ActivateSheet 与 ActiveSheet 不同,奇怪的是......)但我仍然得到 1004。
    • @theamazingmrg : 你在哪一行得到哪个错误?
    • 嗨,它是 ActiveSheet.Range("$B$3:$B$5000").AutoFilter Field:=2, Criteria:=userSelect, Operator:=x1这就是问题所在。
    • @theamazingmrg :在您评论的内容中,您仍然得到 1 而不是 l/L,您已经纠正了吗?
    【解决方案2】:

    对于任何感兴趣的人,问题最终都在排队:

    ActiveSheet.Range("$B$1:$B$5000").AutoFilter Field:=2, Criteria1:=userSelect
    

    由于代码仅过滤 B 列,因此字段值需要设置为“1”而不是我原来的“2”

    感谢@R3uK 的宝贵帮助!

    【讨论】:

    • 谢谢伙计,我不敢相信我之前没有看到它! ;) 我将编辑我的答案以反映我们对您的初始代码所做的更改!你能接受吗?花点时间参观一下:stackoverflow.com/tour
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多