Вы создали подпроцедуру вокруг события Worksheet_SelectionChange.Фактически вам требуется Worksheet_Change, и вам необходимо
- отключить обработку событий, чтобы вы могли записывать новые значения / формулы на лист, не запуская Worksheet_Change поверх самого себя.
- циклчерез каждую соответствующую ячейку в Target, чтобы компенсировать обстоятельства, когда Target может быть больше, чем одна ячейка,
- добавить контроль ошибок.
Переписать:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B:B")) Is Nothing Then
On Error GoTo safe_exit
Application.EnableEvents = False
Dim t As Range
For Each t In Intersect(Target, Range("B:B"))
If LCase(t.Value) = "x" Then
'I've made these formulas relative to each target
'you may want to make some absolute references
t.Offset(0, 3) = t.Offset(-1, 2) * t.Offset(-1, 5)
t.Offset(0, 2) = t.Offset(-1, 2)
Else
t.Offset(0, 2).resize(1, 2) = vbnullstring
End If
Next t
End If
safe_exit:
Application.EnableEvents = True
End Sub