You said value = 0 then you have to edit and check on blank value instead of 0
So I assume that you actually wnat to test on the value 0 and not on the fact if the cell is empty or not. Correct and thorough information is everything
Private Sub Worksheet_Calculate()
Dim rCell   As Range
Dim cCell   As Range
Dim rng     As Range
Set rCell = Range("D29:AP29")
Set cCell = Range("D21:AP21")
On Error Resume Next
rCell.Comment.Delete
Err.Clear
On Error GoTo 0
If WorksheetFunction.CountIfs(cCell, "") <> cCell.Columns.Count Then
    For Each rng In cCell
        If rng.Value <> "" And rng.Offset(8, 0).Value = "" Then rng.Offset(8, 0).AddComment Text:="error"
    Next rng
End If
End Sub
I don't know if the countifs works correct this way but this would be the main idea