'Autofilter error: the object invoked has disconnected from its clients
I've seen this error message on other posts but none matched my situation.
I have a few AutoFilter functions done one after the other checking if the target cell is empty and moving on if it is.
The code runs until the 6th iteration wherein I get the error
"the object invoked has disconnected from its clients"
Option Explicit
Private Sub CommandButton49_Click()
'
Dim Wsdnd As Worksheet
Set Wsdnd = Sheets("DO NOT DELETE")
Dim A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, ... (more variables) As Range
Set A3 = Wsdnd.Range("BD3")
Set A4 = Wsdnd.Range("BD4")
Set A5 = Wsdnd.Range("BD5")
Set A6 = Wsdnd.Range("BD6")
Set A7 = Wsdnd.Range("BD7")
Set A8 = Wsdnd.Range("BD8")
... (More variables)
'
Wsdnd.Range("BC3:BE50").Calculate 'Refreshing "Category", "Apply All Data", "Match Lookup Value" Lists on DO NOT DELETE sheet
Application.Calculation = xlManual 'Restarts manual calculations only for workbook speed
'
'Filter #4
If Not IsEmpty(A6.Value) Then
Sheets("Database").Range("B$24:BL$71499").AutoFilter Field:=WorksheetFunction.Match(Sheets("DO NOT DELETE").Range("BE6"), _
Worksheets("Database").Range("B23:BL23"), 0), Criteria1:=A6.Value, Operator:=xlFilterValues
Else
End If
'
'Filter #5
If Not IsEmpty(A7.Value) Then
Sheets("Database").Range("B$24:BL$71499").AutoFilter Field:=WorksheetFunction.Match(Sheets("DO NOT DELETE").Range("BE7"), _
Worksheets("Database").Range("B23:BL23"), 0), Criteria1:=A7.Value, Operator:=xlFilterValues
Else
End If
'
'Filter #6
If Not IsEmpty(A8.Value) Then
Sheets("Database").Range("B$24:BL$71499").AutoFilter Field:=WorksheetFunction.Match(Sheets("DO NOT DELETE").Range("BE8"), _
Worksheets("Database").Range("B23:BL23"), 0), Criteria1:=A8.Value, Operator:=xlFilterValues
Else
End If
'
'... Filters continue
The data being called in the variables is:
String ("F8442")
String ("Unspecified")
Integer ("345")
I wasn't sure if the data type above would be an issue since they were referring to a cell and many times the cell value can change from text to a number and vice versa.
I had left out Range.Calculate
and Application.Calculation = xlManual
as I didn't think they would have an affect on the code but added them here as I'm not sure. When taken out of the code it gives the error at the same location.
Solution 1:[1]
Filter a Worksheet
Option Explicit
Private Sub CommandButton49_Click()
FilterWorksheet
End Sub
Sub FilterWorksheet()
Const ProcName As String = "FilterWorksheet"
On Error GoTo ClearError
Const sName As String = "DO NOT DELETE"
Const srgAddress As String = "BC3:BE50" ' ?
Const srrgAddress As String = "BD4:BD10" ' resize
Const scOffset As Long = 1 ' ('BE4:BE10')
Const dName As String = "Database"
Const drgAddress As String = "B23:BL71499"
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
Dim sws As Worksheet: Set sws = wb.Worksheets(sName)
Dim srg As Range: Set srg = sws.Range(srgAddress)
Dim srrg As Range: Set srrg = sws.Range(srrgAddress)
Dim dws As Worksheet: Set dws = wb.Worksheets(dName)
If dws.AutoFilterMode Then dws.AutoFilterMode = False
Dim drg As Range: Set drg = dws.Range(drgAddress)
Dim dhrg As Range: Set dhrg = drg.Rows(1)
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
srg.Calculate 'Refreshing "Category", "Apply All Data", "Match Lookup Value"
Dim sCell As Range
Dim sValue As Variant
Dim dField As Variant
For Each sCell In srrg.Cells
sValue = sCell.Value
If Not IsError(sValue) Then
If Len(CStr(sValue)) > 0 Then
dField = Application _
.Match(sCell.Offset(, scOffset).Value, dhrg, 0)
If IsNumeric(dField) Then
drg.AutoFilter Field:=dField, Criteria1:=sValue
End If
End If
End If
Next sCell
SafeExit:
With Application
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
Exit Sub
ClearError:
Debug.Print "'" & ProcName & "' Run-time error '" _
& Err.Number & "':" & vbLf & " " & Err.Description
Resume SafeExit
End Sub
Solution 2:[2]
Well it seems that the problem was twofold, one that the Criteria needed to be a string and it was getting an integer back and secondly Operator:=xlFilterValues being placed after instructions with only a single variable was looked poorly upon by the excel gods.
In my case at least, this isn't a problem anymore. Hopefully this information helps someone else in the future!
Revised code:
Option Explicit
Private Sub CommandButton49_Click()
'
Dim Wsdnd As Worksheet
Set Wsdnd = Sheets("DO NOT DELETE")
Dim A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, ... (more variables) As Range
A4 = Wsdnd.Range("BD4").Value
A5 = Wsdnd.Range("BD5").Value
A6 = Wsdnd.Range("BD6").Value
A7 = Wsdnd.Range("BD7").Value
A8 = Wsdnd.Range("BD8").Value
... (More variables)
'
Wsdnd.Range("BC3:BE50").Calculate 'Refreshing "Category", "Apply All Data", "Match Lookup Value" Lists on DO NOT DELETE sheet
Application.Calculation = xlManual 'Restarts manual calculations only for workbook speed
'
'Filter #4
If Not IsEmpty(A6) Then
Sheets("Database").Range("B$24:BL$71499").AutoFilter Field:=WorksheetFunction.Match(Sheets("DO NOT DELETE").Range("BE6"), _
Worksheets("Database").Range("B23:BL23"), 0), Criteria1:=A6
Else
End If
'
'Filter #5
If Not IsEmpty(A7) Then
Sheets("Database").Range("B$24:BL$71499").AutoFilter Field:=WorksheetFunction.Match(Sheets("DO NOT DELETE").Range("BE7"), _
Worksheets("Database").Range("B23:BL23"), 0), Criteria1:=A7
Else
End If
'
'Filter #6
If Not IsEmpty(A8) Then
Sheets("Database").Range("B$24:BL$71499").AutoFilter Field:=WorksheetFunction.Match(Sheets("DO NOT DELETE").Range("BE8"), _
Worksheets("Database").Range("B23:BL23"), 0), Criteria1:=A8
Else
End If
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | VBasic2008 |
Solution 2 | AesusV |