A family of Microsoft relational database management systems designed for ease of use.
You are unnecessarily duplicating code in the function. I would recommend that you move the For…Next loop into a separate function, declared as Boolean, into which a reference to each form object is passed as an argument .
In the calling function, also declared as Boolean, the new function would then be called three times, passing references to the parent form, the first subform, and the second subform respectively. The return value of the outer function would be set to the value returned by the new function.
The Enabled property of the cmdSubmit button would then be set to the return value of the calling function, not within it, as you are currently doing.
Note that in the event of a control being empty, the code in the new function should immediately be terminated and the return value of the function set to False. Similarly in the event of the new function returning False in the calling function, the calling function's code should immediately be terminated and its return value set to False.
The default return value of the each function should of course be set to True, as at present.
If the reference to the second subform is incorrect, then an error would still be expected of course. The calling function should include an error handler. As well as trapping any error in the calling function, any error in the new function would be passed back to the calling function's error handler. As Karl has pointed out, this could include ignoring the error if it is not affecting the functionality.