I'll throw in my approach, along with some reasoning.
First, I tend to find input masks somewhat confusing & annoying. Just my personal preference/experience. As an end-user, it's VERY easy to accidentally get the cursor in the 'wrong' spot, or even tell which spot it's inside, IMHO. (in Access). Once it gets in the wrong spot, instead of the characters properly back-filling into position, the whole thing gets messed up. (Maybe things have gotten better since I last tested them).
Second, I've noticed the technique I'm recommending a lot on websites, apps, etc., and IMO it's the easiest one from an end user perspective.
What it is: Code your control's
Change event. In this code, refer to the
.Text property. In this code, simply strip out disallowed characters.
Alternately, if you find it difficult to write this code (might involve some SelStart type of stuff), or if it comes across too weird to the end user, simply code the control's
AfterUpdate event (this time refer to the control's
.Value property), which will strip out disallowed characters
after they exit the control.
I always like to evaluate my Access approaches against what end-users are most used to in other apps (particularly web ones) globally.
I see sites and apps with all sorts of approaches to contain phone numbers - including some with input masks and some with the technique I mentioned--But I think the very best ones are the ones where I type whatever the heck I want, and after I tab out of it, OR while I'm typing, it resolves to the precise format they want. Without me worrying where my cursor is "inside" that ugly mask. TurboTax.com's way of handling what I type into SSN, Phone, and Currency fields comes to mind--I can do them any one of about 5 different ways--they auto-magically resolve with no further ado.
PS - If you just want a really good laugh to lighten your day,
check out this brief article about programmers and phone numbers and forms. Very funny! I was laughing out loud after the 2nd GIF.