The principle of putting all validation at table level is certainly the one I was taught. The principle behind this is as follows:
The table level design should handle the all aspects of the the table design and integrity such as relationship constraints and other constraints. In other words the table schema should stand on its own as a schema that represents logical model of the physical world. It should not be possible to create data in the tables such that the integrity of the data is in question.
The user level design should handle how the user interfaces with the database e.g. screen design, layout, feedback. This level is entirely independent of the table level.
If you don't subscribe to this principle then you might as well forego any constraints in the table design. That includes relationships and indexes! But then you rely wholly on the interface designer to pick this up consistently.
The reason for such a framework is more evident in large enterprise solutions where a table level schema may be the "back end" to multiple interfaces e.g. Access front end, Web, mobile devices, other 3rd party apps. These interfaces may have been developed by independent developers and even developers independent of those who designed the table schema. Of course any developer could be expected to follow some documentation and therefore should implement the given constraints. But the owner of the data simply can't risk this. Instead, they make their data integrity as secure as possible.
The solution that Buttonmoon gave is exactly how I would implement the constraint if this were a server based solution. The only caveat here is that we are in Access. The solution of course works fine. However, once implemented it is very difficult to see. You can change it - but you have to know it is there. Of course you will soon know it is there when you try to break the constraint (albeit a non-user friendly message). Compare this with a server CHECK constraint which is easily visible and easily changed.
Personally I still always go for table level constraints for the reasons above. I have a bad memory and my documentation isn't great so knowing the constraint is embedded works for me.
As regards the message, the since messages are the responsibility of the user interface then I would implement appropriate code to check and provide an appropriate message when necessary. You have the same problem for foreign keys etc. It would be nice if CHECK threw an error of custom message but it doesn't afaik.
Chris