Ever sit down in front of your Microsoft Access database after a long weekend (or maybe a vacation) and draw a complete blank about what you were working on last time? Or maybe you managed to restore an old backup but now have no clue which tables, forms, or queries you modified since then. Trust me, you are not alone. Keeping track of design changes in Access can feel like hunting for your keys: you know you left them somewhere, you just have no idea where.
There are plenty of situations where knowing which objects have been changed recently comes in handy. Maybe you are troubleshooting a sudden issue, recovering after a backup, or need to convince your boss that yes, you did make progress last week. Wouldn't it be nice if Access just had a big bright button that said: "Show me everything I changed?" Well, not quite... but it turns out Access does track some details that can help, if you know where to look.
So here's the scoop: Access secretly stores created and last updated dates for every object in your database. That includes tables, forms, queries, reports, and so on. These little details sit in a special, hidden system table called MSysObjects. You just have to know how to ask for them. Before you go poking around, be warned: do not modify anything in those system tables unless you want some exciting new error messages in your life.
To get to these details, you first need to make sure Access is showing system objects. Quick tip: right-click in your Navigation Pane, go into Navigation Options, and check the boxes for showing hidden and system objects. Once you do that, you will see a bunch of tables named MSys... popping up. The one you want is MSysObjects. If you open it up (just to peek, not to touch!), you will see columns like Name, Type, DateCreate, and DateUpdate. That's your motherlode of object details.
Now, you could scroll through all that technical noise by hand, but we are smarter than that. Time for a little query magic. Use the Access Query Designer to create a new SQL query that selects Name, Type, DateCreate, and DateUpdate from MSysObjects. You will want to filter out any system objects (all those that start with "MSys") and probably want it to show most recent updates first by sorting on DateUpdate descending. If you are comfortable with SQL, it looks something like this:
SELECT Name, Type, DateCreate, DateUpdate FROM MSysObjects WHERE Left(Name,4) <> "MSys" ORDER BY DateUpdate DESC;
If you are not familiar with SQL, the design grid view in Access will work just fine too. Tweak your criteria to exclude temporary objects (those that start with a tilde), and you will have a tidy list of what you have changed and when.
Now, a quick word about the Type column. Access uses numbers to represent different object types. For example, queries are 5, tables are 1, forms are -32768 (I'm not kidding), and so on. Microsoft does not officially document all of them, but most are easy to pick out based on your own naming conventions. You do not need to memorize the codes, but it does help to know what you are looking at.
This technique is awesome for tracking design edits to tables, queries, forms, and reports. Make a change, save your object, and bam - the DateUpdate field updates. So if your goal is just to figure out what objects you have been tinkering with recently, this query is your best friend. Add a new column, nudge a button a pixel, or update a query, and you will see it right at the top of the results.
But, and there is always a "but," there is a little catch with VBA code changes. When you change the code behind a form (the form's module) and save, the DateUpdate usually refreshes - most of the time. But if you edit a standard module (like a global module), for reasons known only to the Access gods, sometimes this does not update. I have seen it skip the update entirely, especially with standalone modules.
So if you do a lot of VBA work, be aware: this trick gives you a quick and dirty answer, not a full accounting. It is great for tracking forms, reports, tables, and query design changes, but don't rely on it for every line of VBA code you tweak. If you need to track VBA module changes specifically, you will want to step things up with a little more advanced VBA scripting to build your own audit table. That takes a bit more work - and I cover the full process in the extended cut for members, where you can see how to use the Access object model to get a more accurate, complete inventory of changes.
Bottom line: if you ever find yourself wondering, "What have I actually changed lately in this database?" a simple query against MSysObjects is a fast and surprisingly effective way to get the answer, at least for most Access users. Next time you come back from your break, or need to check your design history after restoring from backup, give it a try. For hardcore developers who live and breathe VBA, check out the members-only video for that next-level technique.
Got your own Access mystery or story about lost work and heroic recoveries? Drop a comment below and let me know. The video up above has the step-by-step demonstration if you want to see this technique in action.
Live long and prosper,
RR



