You could have a VALIDATEDATA function like this:which depends on another function RequestCellsToCheck:Function VALIDATEDATA() As Boolean For Each cll In RequestCellsToCheck.Cells If IsEmpty(cll) Then VALIDATEDATA = True Exit For End If Next cll End FunctionYou 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).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
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).