Not tested, but some ideas:
Biggest ones are to turn off events in the handle to avoid re-triggering it, and to test what cell(s) were changed to see if you even need to run it
The other changes probably won't have as much impact
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ws As Worksheet
'--------------------- Dim to avoid having to reference the WS and Range objects
Dim dTotalSale As Double, dTotalCost As Double, dGrossProfit As Double, dGrossProfitPercent As Double
'--------------------- no need to hard code ws name
Set ws = Target.Parent
'---------------- not sure which cells have changes that affect the calculations
'-----------------but if a cell changes (e.g. A1) that does not affect the calc, faster to just get out
'----------------- so the the Target cell(s) is NOT col col 8 and not in col 10, there's no need to go through the rest
If (Intersect(Target, ws.Columns(8)) Is Nothing And Intersect(Target, ws.Columns(10)) Is Nothing) Then Exit Sub
'------------------ you really need this to avoid re-triggering by the event
'------------------- by the changes you make in the sub
Application.EnableEvents = False
Application.ScreenUpdating = False
ws.Unprotect
With ws
'----------------k$4 ????????????????
Range("k4").Value = 0 'Gross profit %
Range("j5") = WorksheetFunction.Sum(Range("j8", Range("j8").End(xlDown))) 'Total sale
Range("j3") = WorksheetFunction.Sum(Range("H8", Range("H8").End(xlDown))) 'Total cost
Range("j4") = Range("j5") - Range("j3") 'Gross profit $
dTotalSale = Range("j5").Value
dTotalCost = Range("j3").Value
dGrossProfit = Range("j4").Value
'------------------ possible to be negative???????????
If Range("j4") <> 0 Then
Range("k4") = Range("j4") / Range("j5") 'Gross profit %
Range("g3") = Range("h3") / Range("j4")
Else
Range("g3") = 0
End If
dGrossProfitPercent = Range("k4").Value
'Gross margin tier paid on gross margin
'------------------------ Select Case is faster than the IF/Thens you had
'------------------------- BTW, you should have used If/Then/ElseIf's since
'------------------------- since when you found a match, you still tested the other IF's unnecessarily
Select Case dGrossProfitPercent
Case Is >= -0.99 <= 0.3574
Range("h3") = dGrossProfit * 0.02
Case Is <= 0.3824
Range("h3") = dGrossProfit * 0.045
Case Is <= 0.4074
Range("h3") = dGrossProfit * 0.07
Case Is <= 0.4324
Range("h3") = dGrossProfit * 0.09
Case Is <= 0.4574
Range("h3") = dGrossProfit * 0.1075
Case Is <= 0.4822
Range("h3") = dGrossProfit * 0.1175
Case Is <= 0.5024
Range("h3") = dGrossProfit * 0.125
Case Is <= 0.5299
Range("h3") = dGrossProfit * 0.1325
Case Is <= 0.5574
Range("h3") = dGrossProfit * 0.14
Case Is <= 0.5824
Range("h3") = dGrossProfit * 0.145
Case Is <= 0.6074
Range("h3") = dGrossProfit * 0.15
Case Is <= 0.6299
Range("h3") = dGrossProfit * 0.1525
Case Else
Range("h3") = dGrossProfit * 0.15
End Select
End With
'------------------------ and this
Application.EnableEvents = True
Application.ScreenUpdating = True
ws.Protect
End Sub
Paul