Added lines with comments beginning with 'debug line:
Sub blah(Letter)
Dim yy As Range
Stop 'debug line: You can now step through the macro one line at a time with F8 on the keyboard, watching what happens on the sheet.
With ActiveSheet.AutoFilter.Range 'everything within With…End With that starts with a dot refers to this range.
'all offsets and field numbers are relative to this block of cells. If you INSERT extra BLANK columns to the left (not included in the Autofilter) the below code will still work.
.Select 'debug line: to show you that range; it includes the headers of the autofilter. Better viewed with no filters active.
Intersect(.Cells, .Offset(1)).Select 'debug line: only the databody of the filter, used below (.Cells is the whole autofilter range)
On Error Resume Next 'to avaiod the 'no cells found' error message if there are no visible cells.
Set yy = Intersect(.Columns(118), .Cells, .Offset(1)).SpecialCells(xlCellTypeVisible) 'selects visible cells below Range("DN4"). Doesn't select, but yes, yy refers to them.
On Error GoTo 0 'reset normal error reporting/handling.
If Not yy Is Nothing Then yy.Select 'debug line: so you can see what yy refers to.
If Not yy Is Nothing Then yy.Value = Letter ' Sets visible cells below Range("DN4") = Either A or N, but only if there are any.
.AutoFilter Field:=121 'Clears filters from column "DQ". Yes, column 121 of the Autofilter range, it may not always be column DQ. Also re-applies the filters of other columns.
On Error Resume Next
Set yy = Intersect(.Columns(121), .Cells, .Offset(1)).SpecialCells(xlCellTypeVisible) 'Sets yy = range below the visible cells
On Error GoTo 0
If Not yy Is Nothing Then yy.Select 'debug line: so you can see what yy refers to.
If Not yy Is Nothing Then yy.Cells(1).Select 'debug line: so you can see what yy.cells(1) refers to.
If Not yy Is Nothing Then .AutoFilter Field:=121, Criteria1:=yy.Cells(1).Value 'Filters Column DQ to value of the first cell below the previously visible cells
End With
End Sub