I never mentioned or implied a transaction.

Solved it for now (the immediate problem, not the question).

We have code that stops this charmode program running multiple times, but before that code we have code to establish the machine's identity, and in between we have (or had) something that checks the machine is opened for the day. If the machine wasn't open it waited on the msgbox, but it didn't stop the user leaving that on screen, then going through the open process and starting the program again, this time successfully. The first iteration meanwhile had grabbed some system entries that the second iteration expected to be available so wouldn't let them in very far. The user moved to another till and started again.

Problem caused by unintelligent cut and paste in cranky old procedural code when refactoring. The PEBKAC being me in this case.

To resolve I created a PauseBox by making a msgbox display then sleep then quit. That replaced both those tests and we are now on the pig's back. Though I've an idea to apply the same logic to everything but yes/no boxes, even then we could default to yes or no after an interval.

I'm spending too much time on IT manager tasks right now and not enough on development, hence the series of dumb questions lately.