Первым делом в вашем коде не нужно ставить Exit Sub перед End Sub. Код заканчивается после этой строки, так что это избыточность.
Следующее, что вам нужно понять, это то, что событие изменения будет срабатывать, если вы не отключите его явно. Таким образом, это означает, что когда вы прячете строку на этом листе, событие изменения будет происходить, поскольку на листе будут происходить изменения. то есть (прячущиеся строки).
Для этого вам нужно отключить EventsListeners приложения, используя Application.EnableEvents = False. Таким образом, приложение может выполнить одну вещь, основываясь на этом первом событии.
Следующее, что вам нужно иметь в виду, - это отслеживать, где происходят Изменения, и запускать вашу программу. Target - это объект Range, который возвращает диапазон, в котором на листе происходит указанное изменение c.
Для этого вам нужно проверить, нужно ли запускать процедуру на основе цели с помощью функции Пересечение.
Весь код выглядит следующим образом:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Target, Range("G11")) Is Nothing Then
If Range("$G$11") = "UD Sheet" Then
Rows("20:25").EntireRow.Hidden = False
Else
Rows("21:25").EntireRow.Hidden = True
End If
End If
If Not Intersect(Target, Range("G12")) Is Nothing Then
If Range("G12").Value = "Flex Tape" Then
Range("B20").Value = "None"
Else
Range("B20").Value = ""
End If
End If
Application.EnableEvents = True
End Sub