Total Access Analyzer detects 300 types of errors, suggestions, and performance tips to help you create Microsoft Access applications that have fewer errors, are easier to maintain, run efficiently, and behave the way your users and you expect.
Many of these issues are problems we and our customers have experienced over the years. By incorporating such analysis into Total Access Analyzer, our automated tool helps us adopt the industry's Best Practices for building better Access applications.
The analysis is based on the examination of your entire database by looking at each object and its relationship to others. For instance, the only way to suggest a query isn't being used is to document all the places queries are used, and determine the ones left over. The thorough and automated way Total Access Analyzer examines all your objects, controls, properties, and lines of code is impossible to replicate manually.
A quick review of the types of issues detected by Total Access Analyzer should show you why so many Access users and developers rely on Total Access Analyzer to help them build and deploy better Access applications. After all, why embarrass yourself and give your users grief by shipping a database that Total Access Analyzer can tell will crash?
These are serious problems that will most likely cause your Microsoft Access application to crash. When Total Access Analyzer detects these errors, you should examine them carefully and fix them before deploying your database. In fact, many development teams require using Total Access Analyzer as a quality assurance check before deploying any Access application.
 Corrupt and Broken Objects
Corrupt and Broken ObjectsSometimes objects in Access get corrupted. This is cumbersome to detect in large databases, but Total Access Analyzer finds them easily:
 Broken Code References
Broken Code ReferencesEven when your modules compile, there may be broken references to your code. Functions called in queries, form and report property sheets, and macros all escape detection by the compiler.
Renaming functions, misspelling function names, or changing the number of parameters will cause a crash when the user invokes them. Total Access Analyzer detects:
 Broken Object References
Broken Object ReferencesReferences to objects that were deleted or renamed will fail when the user encounters them. These references are "hidden" within your application and very hard to detect. The database may compile fine, but if a form references a table that no longer exists, that's a time-bomb ready to explode. There are many places Access references objects, and Total Access Analyzer documents and verifies them:
 Form has Timer Event but No Timer Interval
Form has Timer Event but No Timer IntervalThe form has a Timer event but the form's timer interval property is set to zero. That means the Form_Timer procedure never runs.
This may be okay if you set the timer interval programmatically, but if not, you may want to delete it or comment it out.
 Form has Timer Interval but No Timer Event
Form has Timer Interval but No Timer EventThe form's timer interval property is set to a non-zero value, but there isn't a Timer event for the form. That means nothing occurs when the timer interval is reached.
You should have a Form_Timer procedure to perform a task when the timer interval is reached, or set the timer interval property to zero.
 Reports Set to a Specific Printer
Reports Set to a Specific PrinterA common and nasty problem. The report is hard-coded to your specific printer and works fine -- on your machine!
Move it to another machine and the report fails. Every report should be set to the default printer and respect the user's Windows printer preferences.
 Modules without Option Explicit
Modules without Option ExplicitModules without Option Explicit may have undefined variables, misspelled variables, and a variety of other consistency issues the compiler won't flag.
All modules should specify "Option Explicit" so VBA can catch such problems.
 Modules without Option Compare
Modules without Option CompareWhen the Option Compare statement is missing, Option Compare Binary is assumed, which is a case sensitive comparison.
By default, Access uses Option Compare Database which respects the sort order of your database and performs case insensitive text comparisons.
Since this is so common, it is best to use this, then use the VBA StrComp function with the vbBinaryCompare option when you want case sensitive comparisons.

 Undefined TempVar Reference
Undefined TempVar ReferenceA temporary variable is referenced but not defined in the documented objects.
 Macro Line has Action with Missing Arguments
Macro Line has Action with Missing ArgumentsA macro action is missing expected parameters and is unlikely to run properly.
 Macro RunMenuCommand Action is Missing Command
Macro RunMenuCommand Action is Missing CommandA macro line has a macro RunMenuCommand action is missing its command.
 Functions and Get Statements Don't Return a Value
Functions and Get Statements Don't Return a ValueFunctions and Get Statements should return a value. Functions that are not assigned a return value should generally be defined as Subs instead of Functions.
Property Get statements that are not assigned a return value will cause a runtime error when called.
 Modules Events Defined by Not Raised
Modules Events Defined by Not RaisedA class defines an event but doesn't raise one. The VBA compiler doesn't care, but you probably would.
Users defined without passwords are flagged.
Suggestions incorporate our knowledge of Best Practices for creating professional Access applications. Suggestions cover items that will not cause your application to crash or perform poorly, but may make it easier to maintain, support, and appear more polished. For instance, we may note that certain objects or code are unused, but that doesn't mean you have to delete them.
 Unused Objects
Unused ObjectsEver wonder want to delete an old query but were afraid because you weren't really sure if it was used? Over time, many databases get full of unused objects. By documenting all the places an object is used, Total Access Analyzer can flag the objects that aren't used:
Of course there are limitations to any detection of unused objects. Maybe you reference the object in code in a way that can't be detected, or you simply use a table that isn't referenced anywhere else. The analysis isn't a recommendation to delete the object, but rather information that the object isn't referenced by the other documented objects.
Combined with the Search feature, you can quickly find whether the object name is being used by your object properties, macro lines, and VBA code.
Of course there are some situations that Total Access Analyzer cannot detect. If the object is used interactively, part of a table driven system where the object name is stored in a table, referenced by variables in code, you'll need to be cautious as a static analysis program like Total Access Analyzer cannot detect those uses. Here is more information on how Total Access Analyzer detects unused objects in Microsoft Access.
 Unused Code
Unused CodeOver time, you may also accumulate unused code:
Simplify your modules and reduce bloat by getting rid of code you don't need.
For unused procedure parameters, the analysis is trickier. You can simply eliminate the variable you pass to the procedure, but maybe the problem is deeper. Maybe the procedure should be doing something with that value and behaving accordingly.
Here is more information on how Total Access Analyzer detects unused Microsoft Access VBA code.
 Field Data Type and Size Inconsistency
Field Data Type and Size InconsistencyOne of the fundamental Best Practices of database design is to use the same field name to represent the same data. Identically named fields should be defined the same way with the same data type and size. Failure to do this could cause data loss as information moves from one table to another.
For instance, a FirstName text field should be the same length anywhere it's defined. Similarly, a numeric CustomerID field should be consistent and not an Integer in one table, a Long Integer in another, and a Double in another.
Total Access Analyzer examines all the fields in your database, compares identically named fields in multiple tables, and flags the field names that are not identically defined. Here's a sample report from the Field Consistency Analysis:
 Identical SQL in Queries, Record 
				Sources, and Row Sources
Identical SQL in Queries, Record 
				Sources, and Row SourcesTotal Access Analyzer performs advanced analysis on your SQL strings to see if duplicates exist across your objects. Duplicates are detected even if you have slight differences with spacing, line breaks, etc.
Duplicate SQL strings are opportunities to eliminate queries or create a saved query to share across objects. The benefit is the ability to adjust the SQL in one place and have all its dependencies use it. The downside is that a future change for one purpose may trigger a problem elsewhere. Here's a sample report from the Identical SQL Suggestion:
 Form Design Issues
Form Design IssuesTotal Access Analyzer detects many things to improve your forms:
Navigation Controls were introduced in Access 2010:
There are also form settings which if not set properly give users more options than you may want them to have:
 Table Primary Key Issues
Table Primary Key Issues Table/Query Design Issues
Table/Query Design Issues Report Design Issues
Report Design IssuesTotal Access Analyzer detects many things to improve your reports:
 VBA Configuration Suggestions
VBA Configuration SuggestionsThese options simplify your code writing experience:
 **Relationship Field 
				Cross-Reference and Field Type Comparison
**Relationship Field 
				Cross-Reference and Field Type ComparisonTotal Access Analyzer generates field cross-reference for the relationship joins and makes sure they are defined with the same data type.
If not, a suggestion is offered to review the inconsistency.
 Access Options
Access Options Module: Code without Error Handling
Module: Code without Error HandlingError handling is critical to professional applications. If code without error handling crashes, your users see the default Access debug dialog. That's not good. Ideally, every procedure traps for errors and handles them gracefully either within itself or by passing it to a global error handler.
If you find your application is riddled with code missing error handling consider our Total Visual CodeTools program and its Code Cleanup feature that can automatically add custom error handling to the procedures and properties that lack it.
 Module: Avoid Name Conflicts
Module: Avoid Name ConflictsDon't use the same name for variables in the same scope. Variable naming conventions often solve this (e.g. global variables prefixed with a "g", module variables with an "m", etc.). However, if they aren't used, there may be conflicts. Total Access Analyzer flags:
 Module: Typecast to Specific Data Type
Module: Typecast to Specific Data TypeIf variables aren't explicitly defined as a particular type (e.g. As Integer), they are variants which are less efficient and prevents the compiler from catching certain problems.
 Module: Exit with the Body of a Procedure/Property
Module: Exit with the Body of a Procedure/PropertyIf an Exit statement (Exit Sub, Exit Function, or Exit Property) exists in the body of a procedure (rather than at the bottom), any code below it is skipped.
This can be a problem if the following code is necessary to cleanup things started by the procedure. It's also a problem if the procedure is very complex and the Exit statement is buried in the middle somewhere. Subsequent developers (or yourself) may forget this behavior and spend unnecessary time trying to debug the code.
A better way to exit a procedure is to set variables and use IF statements or other conditionals so that the process always exits at the bottom of the procedure. Consistently using this Best Practice makes your work easier to maintain and debug.
 Module: Scoping Procedures and Variables
Module: Scoping Procedures and VariablesGood programming scopes objects to just the level they're needed. If something is only used in a procedure, it should be defined there. If it's only used in a module, it shouldn't be global to the entire project. Total Access Analyzer flags scoping issues and asks you to explicitly scope your code to make it easier to manage and minimize conflicts:
 Unused Temporary 
				Variables (TempVars)
Unused Temporary 
				Variables (TempVars)Temporary variables that are defined but not referenced are detected.
 Unreferenced Variables
Unreferenced VariablesWhile unused variables are relatively easy to resolve by eliminating the variable, unreferenced variables can indicate deeper problems.
Total Access Analyzer flags variables that are assigned but not used. For instance, you assign a value to X, but never use X.
This could either be code you should eliminate, or code you need to fix because you should be using the value.
 Form Code Issues
Form Code IssuesTotal Access Analyzer also detects coding issues in forms:
 Module: Avoid Using Old Access Constants
Module: Avoid Using Old Access ConstantsConstants that are part of the OldConstants module in the Access library are from Access 95 or earlier. Examples include A_COPY, A_DIALOG, A_FORM, etc.
Total Access Analyzer detects these and recommends the "modern" equivalent such as acCopy, acDialog, acForm, etc.
 Other Module Suggestions
Other Module SuggestionsPerformance tips are ideas where you may be able to enhance the speed of your application. Certainly, many tips are not relevant because you've already implemented the most efficient solution. Nonetheless it's helpful to consider these ideas or objects that may be made more efficient.
 Tables
Tables Queries
Queries Forms
Forms Reports
Reports Macros
MacrosMacro uses slow Domain Functions
 Modules
Modules* Added in Total Access Analyzer 2013 (New 2013 Features)
** Added in Total Access Analyzer 2016 (New 2016 Features)
Version 16.7 for
		Microsoft Access 2016
	
Version 15.7 for
		Microsoft Access 2013
	
Version 14.7 for
		Microsoft Access 2010
	
Version 12.97 for
		Microsoft Access 2007
	
Version 11.95 for
		Microsoft Access 2003
	
Version 10.8 and 9.8 forr
		Access 2002 and 2000
	
"Total Access Analyzer is an amazing product that I've relied on and recommended for years. It's a huge time saver."
Sal Ricciardi, Programming Writer, Microsoft Corporation