This is Pauls's Code. I refactored it to reflect my own preference for NOT overloading an Event sub.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Len(Target.Value) = 0 Then Exit Sub ' catch a Clear
If Target.Address = "$B$2" Then HideB2 Target
If Target.Address = "$D$38" Then HideD38 Target
End Sub
Private Sub HideB2(Target As Range)
Dim v, ACSA, CSA, ASA, ACA, SASA
ACSA = Array(24, 25, 35, 36, 57, 58, 60)
CSA = Array(57, 58, 60)
ASA = Array(24, 25, 30, 31, 35, 36, 50, 57, 58, 59, 60)
ACA = Array(24, 25, 30, 31, 35, 36, 50, 59, 60)
SASA = ASA
Rows.Hidden = False
Select Case UCase(Target.Value)
Case Is = "ACSA"
For Each v In ACSA
Me.Rows(v).Hidden = True
Next
Case Is = "CSA"
For Each v In CSA
Me.Rows(v).Hidden = True
Next
Case Is = "ASA"
For Each v In ASA
Me.Rows(v).Hidden = True
Next
Case Is = "ACA"
For Each v In ACA
Me.Rows(v).Hidden = True
Next
Case Is = "SASA"
For Each v In SASA
Me.Rows(v).Hidden = True
Next
Case Is = "PLEASE SELECT ROLE CODE"
' empty for completeness
Case Else
End Select
Application.ScreenUpdating = True
HideD38 Range("D38")
End Sub
Private Sub HideD38(Target As Range)
Application.ScreenUpdating = False
Select Case UCase(Target.Value)
Case Is = "SELECT ANSWER"
Me.Rows("39:47").Hidden = False
Case Is = "YES"
Me.Rows("39:47").Hidden = True
Case Is = "NO"
Me.Rows("39:47").Hidden = False
Case Is = "NA"
Me.Rows("39:47").Hidden = True
End Select
Application.ScreenUpdating = True
End Sub