I don't believe that this is not possible.
Doesn't matter what you believe. Does Access think it is possible?
I'm running a canned query
And the answer is ... not unless the query is running on a back-end server (and I do NOT mean as a file-server-resident back-end. I'm talking MySQL or SQL Server or ORACLE or something similar.)
But why is this so? Because ...
A canned Access query does not include "events" within itself. It is a single-threaded object that, when you run it (say, with ExecuteSQL or RunQuery or another similar method), runs as a black box.
To drive a progress bar, you need to get enough information out of the process to update the progress bar. To get information out of a black box, you have to have a way inside - a way to crack the box - which Access does not give you.
So if this is a query on a shared but otherwise pure Access application, you cannot do what you want. You have nothing to see. No events will break execution for you. A timer won't help because the query has the table or tables locked. If you try to run a second query from the timer, you will run into some sort of lock problem. Worse, you might give the main query the problem if your "evaluate progress" query gets there first for the next record to be processed within the query. Can you say "query failure?" I knew you could.
On the other hand, if you are running queries on a DB-server back-end, that kind of setup
can be multi-threaded and sometimes you
can do a "progress-check" query. In which case, your timer would work reasonably well.
See, here's the thing to remember about Access. It is a SMALL-business database tool. Which includes that the base product is not inherently built to be multi-threaded even though Windows supports that ability. Without an intervening event to provide you the "window" into the query's progress, you have nothing on which to base your progress meter.
Just for clarification, when you have a back-end or shared Access DB that many users can open at once, that IS multi-threaded. One thread per
desktop, 'cause that's where the threads run. The file server code is ALSO multi-threaded - but it ain't Access. It's just a file-sharing program.
Now... having burst your bubble, how can you possibly do this anyway? Why, bless you, I thought you'd never ask.
If this is a canned query but you have control over how it is run from VBA code, perhaps as a button-click event, break it up into a convenient number of phases. Like, subdivide the range of the query based on letters of the alphabet that start the prime key if it is alpha, or based on subsets of the range of the record keys if numeric. Change it to a parameter query and make the starting/ending keys (i.e. the range) your parameters. Then update your progress meter in the loop that drives the subset queries based on the range subset passed in as parameters. Run the loop to step through all possible range elements.
If you have no control over the query because of policy, permissions, or other impedimentia, you're stuck. Then, you REALLY can't do what you want.