【问题标题】:Excel VBA Run Time Error 1004 AutoFilter method of Range class failed - what is wrong?Excel VBA 运行时错误 1004 范围类的自动筛选方法失败 - 出了什么问题?
【发布时间】:2022-10-06 17:34:20
【问题描述】:

嗨 Stack Overflow VBA 社区

截至上周初,我对 VBA 完全陌生,只使用过录制的宏,只编辑过录制的代码,因此从未深入开发者模式。我曾提议为工作创建一个用户表单,但我想我可能咬得比我能咀嚼的更多,因为我不断收到这个错误,但我不确定为什么。

我正在尝试遵循 TheDataLabs 教程,因为通过他的 5 个视频,他将其带到了我想要达到的最后一点,但我正在尝试调整他的代码以使其拥有 21 列和数千行数据,并且似乎卡住了某处

就视频而言,我停留在他解释的区域是 32 分钟标记或单击此处-https://youtu.be/BdEMj4NNXAE?t=1921

请问有人可以用下面的代码sn-p帮助我吗? 我已经放置了特定的行和子

shData.Range(\"A1:U\" & iDataRow).AutoFilter Field:=iColumn, Criteria1:=\"*\" & sValue & \"*\"
Sub SearchData()

    Application.ScreenUpdating = False
    Dim shData  As Worksheet \' Data sheet
    Dim shSearchData As Worksheet \'SearchData sheet
    Dim iColumn As Integer \'To hold the selected column number in database sheet
    Dim iDataRow As Long \'To store the last non-blank row number available in Data sheet
    Dim iSearchRow As Long \'To hold the last non-blank row number availble in Search Data sheet
    
    Dim sColumn As String \'To store the column selection
    Dim sValue As String \'To store the search text value
    
    Set shData = ThisWorkbook.Sheets(\"Data\")
    Set shSearchData = ThisWorkbook.Sheets(\"SearchData\")
    
    iDataRow = ThisWorkbook.Sheets(\"Data\").Range(\"A\" & Application.Rows.count).End(xlUp).Row
    
    sColumn = frmForm.cmbSearchColumn.value
    sValue = frmForm.txtSearch.value
    
    iColumn = Application.WorksheetFunction.Match(sColumn, shData.Range(\"A1:U1\"), 0)
    
    \'Remove filter fom data worksheet
    If shData.FilterMode = True Then
        shData.AutoFilterMode = False
    End If
    
    \'apply filter on Data worksheet
    
    If frmForm.cmbSearchColumn.value = \"Case code\" Then
        shData.Range(\"A1:U\" & iDataRow).AutoFilter Field:=iColumn, Criteria1:=sValue
    Else
        shData.Range(\"A1:U\" & iDataRow).AutoFilter Field:=iColumn, Criteria1:=\"*\" & sValue & \"*\"
    End If
    If Application.WorksheetFunction.Subtotal(3, shData.Range(\"C:C\")) >= 2 Then
        
        \'Code to remove the previous data from SearchData worksheet
        
        shSearchData.Cells.Clear
        shData.AutoFilter.Range.Copy.shSearchData.Range (\"A1\")
        Application.CutCopyMode = False
        iSearchRow = shSearchData.Range(\"A\" & Application.Rows.count).End(xlUp).Row
        frmForm.lstDatabase.ColumnCount = 21
        frmForm.lstDatabase.ColumnWidths = \"30,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70\"
        If iSearchRow >= 1 Then
            frmForm.lstDatabase.RowSource = \"SearchData!A2:U\" & iSearchRow
        End If
    
    Else
    
        MsgBox \"No record found.\"
    
    End If

    shData.AutoFilterMode = False
    Application.ScreenUpdating = True

End Sub

我尝试过多次浏览视频,甚至下载他的文件并粘贴相关代码的某些 sn-ps 等。

我已经查看了一些关于相同错误的 Stack Overflow 问题,但无法发现任何类似的代码,所以根据我的经验,我不确定出了什么问题

非常感谢所有帮助和指导。

提前致谢。

  • 在尝试应用过滤器之前检查iColumn 的值。您可以通过插入行 MsgBox iColumn 来做到这一点。我的猜测是它要么是 0,要么根本不包含数字而是一个错误——这可能表明与 sColumn 的值完全匹配不存在于表的标题中。
  • 感谢 CLR 我已经完成了上述操作,并且 iColumn 是 \'2\' 的值,我认为这是对的吗?
  • 也许检查 iDataRowsValue 然后 - 并且工作表没有受到保护?
  • 嗨 CLR,感谢您的所有帮助

标签: excel vba userform


【解决方案1】:

解决了,感谢 CLR 的帮助,事实证明我的范围实际上是一个表 - 我没有意识到需要以不同的方式引用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2015-11-04
    相关资源
    最近更新 更多