Você poderia, para essa tarefa específica, fazer algo nos moldes de:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Address = "$E$12" Then
ActiveSheet.Unprotect
Select Case Range("E12").Value
Case ""
Range("D12").Locked = True
Case Else
Range("D12").Locked = False
End Select
ActiveSheet.Protect
End If
End Sub
No código da planilha. Se você usar uma folha protegida, isso irá bloquear / desbloquear D12 com base na manipulação de E12.
Se você não gosta de como isso funciona, ou não quer proteger a folha, você pode tentar algo parecido, mas completamente diferente.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$12" Then
If Range("E12").Value = "" And Range("D12").Value <> "" Then
Range("D12") = ""
MsgBox "Please enter E12 before D12"
End If
End If
End Sub
Com isso, se você digitar algo em D12 enquanto E12 estiver vazio, ele será excluído e uma Caixa de Mensagens aparecerá e informará o motivo.
If Target.Address = "$D$12" Then
É opcional e pode ser removido completamente se você sempre quiser cheque, caso eles editem D12 e depois deletem o valor em E12. Ou você pode mudar isso para
If Target.Address = "$D$12" Or Target.Address = "$E$12" Then
Para esse caso.