The problem is your enter pressed routine returns back to your calling procedure (btnProcess_Click) as soon as the wait for is executed. Once the user clicks the message box the enter pressed routine then continues to execute. See @Erel's video on resumable subs:
Generally I have a separate validation routine that returns a CSBuilder that contains all of the detected errors so they can be displayed in one message box. There are many ways to solve your issue, search the forum for msgboxasync and I'm sure you'll get several ideas.