The only correct events for validation are events where you can cancel saving the record. If you do your validation in the LostFocus event, the user can simply blow by your error and the bad data will be saved. If you do your validation in the Change event, same problem except worse since the Change event runs for each character entered in the control. so if the user types in a date, the event is going to run 10 times and only the last time will the data be valid For a Date Picker, it probably runs only once but I don't know and I never would find out since I would never use the Change event for this validation.
If you want the user to know IMMEDIATELY before proceeding to the next control that he has made an error, then you need to put your validation code in the control's BeforeUpdate event. Keep in mind though you can't use the Control's BeforeUpdate event for validation if part of the validation is a check for presence. If a control never gets the focus, its events don't run. Therefore, there is no control level event that can ensure that a control has some data in it. The best place to put your validation where it is in one and only one place is the form's BeforeUpdate event. Think of this event as the flapper on a funnel. In order to save, the record has to pass through this funnel. You do the validation and if the record is invalid, you simply lock the flapper shut with:
Cancel = True
And that will prevent Access from saving the invalid data.
The only time I put validation code into the control's BeforeUpdate event is in the case where I am going to prevent the user from saving the record if the field in question is invalid. So, if you need an SS to save the record, then why let the user enter dozens of fields and get to the end only to find out that he can't save, period? In that case and only that case, do I put validation anywhere but the form's BeforeUpdate event.