VBA Run Time Error 1004 AutoFilter method of Range class Failed

20,026

Please check if Set wks = ThisWorkbook.Sheets(1) gives you the sheet you want, from the workbook you want. ThisWorkbook. statement refers to workbook, where macro (VBA project) is placed. Maybe you need change it to

Set wks = ActiveWorkbook.Sheets(1)

or pass my_Workbook to TestThis() macro.

Share:
20,026

Related videos on Youtube

Philip Connell
Author by

Philip Connell

Did this for the Badge cant believe I am getting addicted to this site :-)

Updated on July 09, 2022

Comments

  • Philip Connell
    Philip Connell almost 2 years

    I hope you can help. I am getting the error Run Time Error 1004 AutoFilter method of Range class Failed

    When I run my code Public Sub TestThis(), the funny thing is It works perfectly by itself, but when I put it into the other code and call it, it gives the error Run Time Error 1004 AutoFilter method of Range class Failed

    The error is happening on this line

    .Range("A:K").AutoFilter Field:=11, Criteria1:="<>", Operator:=xlFilterValues
    

    Like I said when not called and run by itself no problem when called it bugs. Any help would be greatly appreciated.

    My code is below.

    Sub Open_Workbook_Dialog()
    
    Dim my_FileName As Variant
    Dim my_Workbook As Workbook
    
      MsgBox "Pick your CRO file" '<--| txt box for prompt to pick a file
    
      my_FileName = Application.GetOpenFilename(FileFilter:="Excel Files,*.xl*;*.xm*") '<--| Opens the file window to allow selection
    
      If my_FileName <> False Then
        Set my_Workbook = Workbooks.Open(Filename:=my_FileName)
    
        Call TestThis
    
        Call Filter(my_Workbook) '<--|Calls the Filter Code and executes
    
      End If
    End Sub
    
    Public Sub Filter(my_Workbook As Workbook)
      Dim rCountry As Range, helpCol As Range
      Dim wb As Workbook
      With my_Workbook.Sheets(1) '<--| refer to data worksheet
        With .UsedRange
          Set helpCol = .Resize(1, 1).Offset(, .Columns.Count) '<--| get a "helper" column just at the right of used range, it'll be used to store unique country names in
        End With
    
       With .Range("A1:Y" & .Cells(.Rows.Count, 1).End(xlUp).Row) '<--| refer to its columns "A:Y" from row 1 to last non empty row of column "A"
                .Columns(11).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=helpCol, Unique:=True '<-- call AdvancedFilter on 11th column of the referenced range and store its unique values in "helper" column
                Set helpCol = Range(helpCol.Offset(1), helpCol.End(xlDown)) '<--| set range with unique names in (skip header row)
                For Each rCountry In helpCol '<--| iterate over unique country names range (skip header row)
                    .AutoFilter 11, rCountry.Value2 '<--| filter data on country field (11th column) with current unique country name
                    If Application.WorksheetFunction.Subtotal(103, .Cells.Resize(, 1)) > 1 Then '<--| if any cell other than header ones has been filtered...
                        Set wb = Application.Workbooks.Add '<--... add new Workbook
                            wb.SaveAs Filename:=rCountry.Value2 '<--... saves the workbook after the country
                                .SpecialCells(xlCellTypeVisible).Copy wb.Sheets(1).Range("A1")
                                   ActiveSheet.Name = rCountry.Value2  '<--... rename it
                               .SpecialCells(xlCellTypeVisible).Copy ActiveSheet.Range("A1") 'copy data for country under header
                               Sheets(1).Range("A1:Y1").WrapText = False 'Takes the wrap text off
                               ActiveWindow.Zoom = 55
                             Sheets(1).UsedRange.Columns.AutoFit 'Autofits the column
                        wb.Close SaveChanges:=True '<--... saves and closes workbook
                    End If
                Next
            End With
            .AutoFilterMode = False '<--| remove autofilter and show all rows back
        End With
        helpCol.Offset(-1).End(xlDown).Clear '<--| clear helper column (header included)
    End Sub
    
    Public Sub TestThis()
    Dim wks As Worksheet
    
    Set wks = ThisWorkbook.Sheets(1)
    
    With wks
    .AutoFilterMode = False
    .Range("A:K").AutoFilter Field:=11, Criteria1:="<>", Operator:=xlFilterValues
    .Range("A:C").SpecialCells(xlCellTypeBlanks).Interior.Color = 65535
    .AutoFilterMode = False
    End With
    End Sub
    
  • Philip Connell
    Philip Connell over 7 years
    Limak: Awesome stuff my friend I don't how I missed that. A fresh set of eyes can do wonders. Thank you so much for this much respect from Dublin :-)