Ok, this is the last thing I can think of to speed it up. We can get rid of the second loop completely and use AutoFill instead. Assuming Column Z on Class 2 is not used.
Option Explicit
Sub macro1()
Dim i As Long
Dim j As Long
Dim Texto As String
Dim LastRow As Long
Dim SearchRange As Range
Dim Cel As Range
Dim FirstAddress As String
Dim RngOK As Range
Dim RngAbove As Range
Dim RngUnder As Range
Dim RngTemp As Range
Dim n As Long
Application.ScreenUpdating = False
Application.EnableEvents = False
LastRow = Range("K65536").End(xlUp).Row
n = Sheets("Class 2").Range("A65536").End(xlUp).Row
Set SearchRange = Sheets("Class 2").Range("Z2:Z" & n)
Sheets("Class 2").Range("Z2").Value = Sheets("Class 2").Range("A2").Value & _
Sheets("Class 2").Range("B2").Value
Sheets("Class 2").Range("Z2").AutoFill Destination:= _
Sheets("Class 2").Range("Z2:Z" & n), Type:=xlDefault
'This needs to be an unused cell.
Set RngTemp = Range("Z1")
Set RngOK = RngTemp
Set RngAbove = RngTemp
Set RngUnder = RngTemp
For i = 1 To LastRow
Select Case Range("K" & i).Value
Case Is = 0
Set RngOK = Union(RngOK, Range("L" & i))
Case Is < 0
Set RngUnder = Union(RngUnder, Range("L" & i))
Case Else
Texto = Range("B" & i).Text & Range("D" & i).Text
With SearchRange
Set Cel = .Find(What:=Texto, LookIn:=xlValues, _
LookAt:=xlWhole, MatchCase:=True)
If Not Cel Is Nothing And Sheets("Class 2").Range("D" & Cel.Row) = 0 Then
Set RngAbove = Union(RngAbove, Range("L" & i))
End If
End With
End Select
Next i
RngOK.Value = "Ok"
RngUnder.Value = "Under"
RngAbove.Value = "Above"
RngTemp.ClearContents
SearchRange.ClearContents
Set RngOK = Nothing
Set RngUnder = Nothing
Set RngAbove = Nothing
Set RngTemp = Nothing
Set SearchRange = Nothing
Set Cel = Nothing
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub