Option Explicit
Sub CallExcelDiet()
Call ExcelDiet
End Sub
Sub SelectUsedRange()
ActiveSheet.UsedRange.Select
End Sub
Sub ExcelDiet()
Dim j As Long
Dim k As Long
Dim LastRow As Long
Dim LastCol As Long
Dim ColFormula As Range
Dim RowFormula As Range
Dim ColValue As Range
Dim RowValue As Range
Dim Shp As Shape
Dim ws As Worksheet
Dim wksFilter As AutoFilter
Dim aryFilters() As Variant
Dim strFilterRngAddress As String
Dim i As Long
Dim bFilteringOn As Boolean
Dim FiltCol As Long
' Application.ScreenUpdating = False
' Application.DisplayAlerts = False
' On Error Resume Next
'For Each ws In Worksheets
'//Added for test//
Set ws = ActiveSheet
With ws
On Error Resume Next
Set wksFilter = ws.AutoFilter
On Error GoTo 0
If Not wksFilter Is Nothing Then
With wksFilter
strFilterRngAddress = .Range.Address
With .Filters
ReDim aryFilters(1 To .Count, 1 To 3)
For i = 1 To .Count
With .Item(i)
If .On Then
bFilteringOn = True
aryFilters(i, 1) = .Criteria1
If .Operator Then
aryFilters(i, 2) = .Operator
aryFilters(i, 3) = .Criteria2
End If
End If
End With
Next
End With
End With
If bFilteringOn Then ws.AutoFilterMode = False
End If
'Find the last used cell with a formula and value
'Search by Columns and Rows
On Error Resume Next
Set ColFormula = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
Set ColValue = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
Set RowFormula = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
Set RowValue = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
On Error GoTo 0
'Determine the last column
If ColFormula Is Nothing Then
LastCol = 0
Else
LastCol = ColFormula.Column
End If
If Not ColValue Is Nothing Then
LastCol = Application.WorksheetFunction.Max(LastCol, ColValue.Column)
End If
'Determine the last row
If RowFormula Is Nothing Then
LastRow = 0
Else
LastRow = RowFormula.Row
End If
If Not RowValue Is Nothing Then
LastRow = Application.WorksheetFunction.Max(LastRow, RowValue.Row)
End If
'Determine if any shapes are beyond the last row and last column
For Each Shp In .Shapes
j = 0
k = 0
On Error Resume Next
j = Shp.TopLeftCell.Row
k = Shp.TopLeftCell.Column
On Error GoTo 0
If j > 0 And k > 0 Then
Do Until .Cells(j, k).Top > Shp.Top + Shp.Height
j = j + 1
Loop
If j > LastRow Then
LastRow = j
End If
Do Until .Cells(j, k).Left > Shp.Left + Shp.Width
k = k + 1
Loop
If k > LastCol Then
LastCol = k
End If
End If
Next
.Range(Cells(1, LastCol + 1).Address & ":IV65536").Delete
.Range(Cells(LastRow + 1, 1).Address & ":IV65536").Delete
If bFilteringOn Then
.AutoFilterMode = False
For FiltCol = 1 To UBound(aryFilters, 1)
If Not IsEmpty(aryFilters(FiltCol, 1)) Then
If aryFilters(FiltCol, 2) Then
.Range(strFilterRngAddress).AutoFilter Field:=FiltCol, _
Criteria1:=aryFilters(FiltCol, 1), _
Operator:=aryFilters(FiltCol, 2), _
Criteria2:=aryFilters(FiltCol, 3)
Else
.Range(strFilterRngAddress).AutoFilter Field:=FiltCol, _
Criteria1:=aryFilters(FiltCol, 1)
End If
End If
Next
End If
End With
'Next
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
DRJ's original work may be seen at: