Our Professional Solutions Group was recently asked to diagnose a Microsoft Access database experiencing recurring compile errors with code behind a form that looks like this:
If IsNull(Me.Comments) Then
where Comments is not a control on the form, but a field in the form’s RecordSource.
In general, this compiles and runs fine, but on seemingly random occasions while the program is running, it generates a compile error saying that that field was not found. But the field always existed on the form’s RecordSource, so why was this happening?
Solutions
There are a few ways to avoid this problem:
- Change all the Me. to Me! which is the proper way to reference a field in VBA code, if there is no control bound to this field.
- Create an invisible text box that assigns its ControlSource to that field, give the text box a different name (e.g. txtComments), and reference the text box in code.
- Deploy the database so its compiled state cannot be changed (ACCDE or MDE)
We prefer the use of the invisible text box so that we can reference the control name via the “Me.” syntax rather than “Me!”. The “Me.” syntax is verified when the code is compiled so that a typo with the control name is caught. This is preferable to a runtime error that gets triggered when the user encounters that line of code.
But Why?
Though we knew how to fix this, we were curious to understand why the compilation wasn’t consistent across users. It also didn’t fail when a specific event occurred. It seemed almost random when the compile error arose. And the form triggering the error seemed perfectly fine with a reference to a field that exists in its RecordSource.
The Real Cause for the Compile Error
Through our own research and help from our Microsoft Access MVP colleagues, we discovered that the compile error was tied to programmatically changing the RecordSource of a form. The change is not necessarily on the form where the compile error is triggered.
Microsoft Access seems to reset its internal list of field references some time after the RecordSource is modified, which triggers the compile error. This explains why some users experienced it and others did not since it depended on whether the user opened a form that changed its RecordSource. It also explained why the error didn’t occur immediately after a RecordSource was modified.
Special thanks to Dirk Goldgar for pointing this out. Hope you never encounter this!
Additional Resources for Database Compile and Field Reference Issues
- Decompile Your Microsoft Access Database to Improve Performance, Fix Corruption, and Avoid Strange VBA Errors
- Decompile Your Microsoft Access Database to Fix the Bad DLL Calling Convention Error
- Error in Microsoft Access 2007 When Saving an ACCDB Database to MDB Format
- Microsoft Access Subforms Should Reference the Control Rather than Field for
Master Link Fields
For additional tips on Microsoft Access application development, visit our:
Microsoft Access Developer and VBA Programming Help Center
Leave a Reply