Lo mio es diferente idea que la de niconico. Yo necesito que si se cambia una celda (G5) me copie ese valor en otras (D15,D28 y P22), pero si se cambia (D15,D28 o P22) también me actualice (G5) y esto para cualquier cambio en cualquiera de ellas. Se me ocurrió esto:
Dim Direccion As String
Private Sub Worksheet_Change(ByVal Target As Range)
        Select Case Direccion
            Case "$G$5"
                Range("D15").Value = Range("G5").Value
                Range("D28").Value = Range("G5").Value
                Range("P22").Value = Range("G5").Value
            Case "$D$15"
                Range("G5").Value = Range("D15").Value
                Range("D28").Value = Range("D15").Value
                Range("P22").Value = Range("D15").Value
            Case "$D$28"
                Range("G5").Value = Range("D28").Value
                Range("D15").Value = Range("D28").Value
                Range("P22").Value = Range("D28").Value
             Case "$P$22"
                Range("G5").Value = Range("P22").Value
                Range("D15").Value = Range("P22").Value
                Range("D28").Value = Range("P22").Value
         End Select
    End If
End Sub 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Direccion = ActiveCell.Address
End Sub 
Esto tiene la ventaja que si algún dia necesitas ampliarlo sólo necesitas meter unos "case"s más con las direcciones en cuestión. No sé si será la mejor opción, pero me funciona de madre. Tu código también creo que me pudiera servir y si tengo oportunidad lo probaré.
Creo que tu código podría ser más eficiente 

  que el mio, pero puede que desde el punto de vista visual, de comprensión y de proximas ampliaciones, el mio me parece más cómodo. Me gustaría saber tu opinión.