You could have a VALIDATEDATA function like this:
Function VALIDATEDATA() As Boolean
For Each cll In RequestCellsToCheck.Cells
If IsEmpty(cll) Then
VALIDATEDATA = True
Exit For
End If
Next cll
End Function
which depends on another function RequestCellsToCheck:
Public Function RequestCellsToCheck() As Range
With Sheets("Quick Quote Form")
.Unprotect "OGSProc"
Set myRng = .Range("G7")
For Each cll In Intersect(.UsedRange, .Range("D:D,J:J").SpecialCells(xlCellTypeVisible)).Cells
If Not cll.Locked And (cll.MergeArea.Cells(1).Address = cll.Address) Then
Set myRng = Union(myRng, cll)
End If
Next cll
.Protect Password:="OGSProc", AllowFormattingColumns:=True, AllowFormattingRows:=True
End With
Set RequestCellsToCheck = myRng
End Function
You should be able to see that this second function returns a range of cells to check depending on them being visible and being not locked and in either column D or J (plus cell G7).
This may need some tweaking; you may not want to check for a secondary email and currently the requested timeframe cell is locked and perhaps shouldn't be.
If you wanted something similar for the proposal side you could addd a similar function and call it, say, ProposalCellsToCheck (or better, include arguments in the RequestCellsToCheck function).