MS Access Form Not Working — Complete Fix Guide for Corruption, Events, Locking & Blank Forms
By the team at Hire Access Developer — 15+ years fixing production Microsoft Access systems for US businesses. Last updated: .
When an MS Access form stops working, you are dealing with one of three distinct failure modes — and the fix for each is completely different. This guide covers all of them with step-by-step instructions: forms opening blank, form object corruption, VBA event handlers that won't fire, forms not saving to the table, recordset locking, subform errors, and UI freezing. Read the diagnostic section first to identify which category you're in before attempting a fix.
What causes MS Access form failures?
Access form failures fall into three buckets. Identify the bucket before you start fixing — applying the wrong remedy wastes hours and can worsen corruption.
- ①Front-end / object corruption — the form document inside the .accdb is damaged. Symptoms: form won't open, opens to a blank white screen, controls disappear, properties reset on save, or the form throws "there is no field in the recordset" on fields that exist. The underlying tables are healthy; only the form object is damaged.
- ②Data-link / recordset failure — the bound query, linked table, or ODBC connection has a problem. Symptoms: form opens but shows no data, throws an error on navigation, won't save edits back to the table, or freezes while loading records. The same failure appears in a datasheet of the same table — the form is just where you see it.
- ③VBA / event code failure — the form renders correctly but buttons do nothing, combo boxes don't cascade, or validation doesn't run. Event handlers have been broken by a compile error, control rename, or a prior runtime error that left the VBA project in break mode.
3-step quick diagnostic
Run these three checks in order. Stop when you've identified the bucket — then jump to that fix section below.
- 1Open the same data in a plain datasheet. In the Navigation Pane, double-click the table or query that the form is bound to. If the data loads fine there but the form still fails — you're in bucket ① (form object corruption). If the datasheet also shows errors or no data — you're in bucket ② (data-link failure).
- 2Run Debug → Compile VBAProject (Alt+F11 → Debug → Compile). If compilation stops on a red-highlighted line, you have a VBA compile error. A compile error silences all event handlers in the entire project — not just the broken module. Fix the compile error first before diagnosing anything else.
- 3Check for an active break mode in the VBA IDE. Open the VBA IDE (Alt+F11). If the title bar says "Microsoft Visual Basic for Applications — [Break]" or a line is highlighted in yellow, the project is paused. Click Run → Reset to clear it. A VBA project stuck in break mode silently refuses to fire any event handlers.
Fix: MS Access form opens blank
A blank Access form is one of the most searched problems — and it has five distinct causes that each require a different fix. Work through them in order.
Cause 1 — Data Entry property set to Yes
When Data Entry = Yes, the form opens to a new blank record only and shows no existing data. This is intentional for data entry forms but is often set accidentally.
Fix: Open the form in Design View → Property Sheet → Data tab → set Data Entry to No. Save and reopen.
Cause 2 — A filter is hiding all records
A saved filter or a filter applied in the form's Open event can exclude all records, producing a blank form with no error message.
Fix: While the form is open, go to Home → Advanced → Clear All Filters. Also check the form's Filter property in Design View (Property Sheet → Data → Filter) and clear any hardcoded filter expression.
Cause 3 — RecordSource query returns no records
The query or table bound to the form exists, but it returns zero rows — so the form correctly shows nothing.
Fix: Open the RecordSource query directly (Design View → Property Sheet → Data → RecordSource → click the "..." button → Run). If it returns no records, the WHERE clause is the problem, not the form.
Cause 4 — Trusted location / macro security blocking On Open
If Access blocked macro content when you opened the database, the form's On Open or On Load event may not have run — and if that event populates the RecordSource dynamically, the form stays blank.
Fix: File → Options → Trust Center → Trust Center Settings → Trusted Locations. Add your database folder. Reopen the database and click "Enable Content" if the security bar appears.
Cause 5 — Corrupt form object
If all the above check out and the form still opens blank, the form object itself may be corrupt. See the Form Corruption section below for the recovery sequence.
Fix: Access form corruption (won't open, crashes, missing controls)
Access form corruption means the form document object stored inside the .accdb has been damaged. Symptoms include: the form won't open at all (clicking does nothing), Access crashes when opening it, controls disappear or revert to defaults, event procedure names get rewritten, or you see "there isn't enough memory to perform this operation" when the file isn't actually low on memory.
Compact & Repair rarely fixes form corruption — it addresses file-level bloat, not object-level damage. The correct approach is to rebuild the form in a clean database.
Step-by-step recovery for corrupt Access forms
- 1Back up immediately. Copy the .accdb file before touching anything. Name it with today's date. Every recovery step below should be done on this copy, not the live file.
- 2Disable Name AutoCorrect before anything else. File → Options → Current Database → uncheck Track name AutoCorrect info and Perform name AutoCorrect. This feature silently renames event procedures when you rename controls, and it actively worsens recovery if left on. Apply and close options.
- 3Try exporting the form as text. In the VBA IDE (Alt+F11), open the Immediate Window (Ctrl+G) and run:
Application.SaveAsText acForm, "YourFormName", "C:\temp\form_export.txt". If this succeeds, you have a readable backup of the form definition that you can use to reference property settings during rebuild. - 4Create a new blank database. File → New → Blank Database. Give it a new name. This becomes your clean recovery shell.
- 5Import all objects except the corrupt form. External Data → New Data Source → From Database → Access. Select your damaged .accdb. Import: all tables, all queries, all forms except the corrupt one, all reports, all modules, all macros. Click OK.
- 6Recreate or re-import the corrupt form. For simpler forms: try importing the corrupt form into the new database — sometimes the import process strips the corruption. For complex forms: rebuild from scratch using the exported text file as your property reference. This takes longer but produces a cleaner result.
- 7Run Debug → Compile VBAProject and Compact & Repair. Verify clean compile, test all key workflows, then compact the new database before deploying.
Fix: VBA event handlers not firing
When you click a button or change a combo box and nothing happens — no error, no response — the VBA event handler is not running. This is almost never a mystery; it's always one of five traceable causes.
Cause 1 — VBA project in break mode
If a previous error was thrown and not handled, VBA enters break mode and stops responding to all events until you reset it.
Fix: Open the VBA IDE (Alt+F11). If the title bar shows "[Break]" or a line is highlighted in yellow, click Run → Reset (or press the square Stop button). Close and reopen the form.
Cause 2 — Control name doesn't match the Sub name
The event procedure naming convention is rigid: a control named cboCustomer must have a procedure named exactly Sub cboCustomer_AfterUpdate(). If you renamed the control (or Name AutoCorrect renamed it incorrectly), the wiring breaks silently.
Fix: In Design View, click the control → Property Sheet → Other tab → check the Name. Then in the VBA IDE, verify the Sub name matches exactly. Also check the Event tab in Property Sheet — the event should show [Event Procedure], not be blank.
Cause 3 — Compile error silencing all events
A single compile error anywhere in the project silences all event handlers everywhere — not just the module with the error. The form looks normal but no events fire.
Fix: Alt+F11 → Debug → Compile VBAProject. Fix every compile error before testing events. This is the most commonly overlooked cause.
Cause 4 — Form fails during Open/Load before events register
If the Form_Open or Form_Load event throws an error that's swallowed by On Error Resume Next, the form may open in a partial state where later events (AfterUpdate, Click, etc.) are never registered.
Fix: Temporarily change On Error Resume Next to On Error GoTo 0 in Form_Open and Form_Load. Reopen the form — the real error will surface.
Cause 5 — Break on All Errors is set
VBA IDE → Tools → Options → General → Error Trapping. If set to "Break on All Errors," VBA stops on handled errors too — which can stop event chains mid-execution without a visible message.
Fix: Set to "Break on Unhandled Errors" for production; use "Break on All Errors" only during active debugging sessions.
Fix: MS Access form not updating the table (not saving data)
You enter data, navigate away, and the changes disappear — the table is unchanged. This is a distinct failure from form corruption and has its own set of causes.
Step-by-step diagnosis
- 1Check Allow Edits and Allow Additions. Design View → Property Sheet → Data tab. Confirm Allow Edits = Yes and (if adding new records) Allow Additions = Yes. These are sometimes set to No intentionally for read-only views but are accidentally left that way.
- 2Check if the RecordSource is an updatable query. Queries that contain DISTINCT, GROUP BY, aggregate functions (Sum, Count), TOP, or are based on non-primary-key subqueries are not updatable. Access shows the data but silently refuses to write edits back. Fix: base the form on the underlying table directly, or add a primary key to the recordset that Access can use to write back.
- 3Check for a BeforeUpdate event that cancels the save. In the VBA IDE, search for
Cancel = Truein BeforeUpdate procedures. If validation logic sets Cancel = True, the save is silently aborted. Add a MsgBox before the Cancel line to confirm this is firing. - 4Verify the database is not open read-only. Title bar shows "(Read-Only)" if Access opened the .accdb in read-only mode. Causes: another user has the database open exclusively, the file is on a read-only network share, or NTFS permissions deny Write to the current user. Check the .laccdb file to see who holds the lock.
- 5For linked SQL Server tables — verify the ODBC link is active. If the linked table points to SQL Server via ODBC and the connection dropped, edits appear to succeed in the form but fail to write to SQL Server. Check by opening the linked table directly — if it errors, relink via Linked Table Manager.
Fix: Access form recordset locking errors
Lock errors on forms show up as "This record has been changed by another user since you started editing it," "You don't have exclusive access to the database," or the form freezing while trying to save. These are data-tier problems that the form surface makes visible.
Common recordset locking causes and fixes
| Symptom | Cause | Fix |
|---|---|---|
| Write conflict dialog on every save | Two users editing same record; optimistic lock expired | Set Record Locks = Edited Record for hot rows; refresh interval tuning |
| Form hangs after clicking Save | Wide dynaset + slow network = long page lock hold | Narrow the RecordSource; add index on join columns; test on Ethernet |
| .laccdb grows and never shrinks | Unclosed DAO Recordsets leaking session entries | Audit OpenRecordset calls — every open needs a Close in error path |
| Subform requery locks parent | Subform requeries on every navigation triggering parent lock | Requery subform only on meaningful parent change, not Form_Current |
Fix: MS Access form freezing and UI flickering
Access UI freezing and flickering are caused by the UI thread waiting on engine I/O or by too many repaint operations being triggered in sequence. Before you restructure the form design, identify which operation causes the freeze.
Most common causes of Access form freezing
- Cascading combo box requeries — one combo's AfterUpdate event requeries two or three others, each hitting the database synchronously on the UI thread. Add
DoCmd.Echo Falseat the top andDoCmd.Echo Trueat the bottom of the chain, but more importantly, reorder requeries to fire only what changed. - Form_Current or Form_Resize calling Repaint — these events fire on every record navigation. A Repaint or Requery call inside them means every arrow key press hits the database.
- Timer interval too short — a form timer set to 1000ms (1 second) that requeries a linked SQL Server table will generate 60 ODBC roundtrips per minute per open form. Set timers to the minimum refresh interval that makes business sense (often 30–60 seconds).
- Wide RecordSource loading unnecessary columns — a bound form on SELECT * FROM tblOrders (50 columns, 200,000 rows) will page slowly over a network share. Narrow the RecordSource to only the columns the form actually displays.
- Network latency (Wi-Fi / VPN) — see Environmental Causes section below. Test on Ethernet first.
Diagnosing which event causes the freeze
Add a temporary Debug.Print Now() & " — EventName" line to each suspected event (Form_Current, Form_Resize, combo AfterUpdate). Open the Immediate Window (Ctrl+G) while using the form. The timestamps show you which event fires most and how long gaps exist — long gaps indicate that event is blocking the UI thread.
Fix: Access subform errors and not displaying data
Subforms have their own property layer on top of the parent form. When a subform stops showing data or throws errors, the problem is almost always in the link fields — the join between parent and child form.
- 1Check Link Master Fields and Link Child Fields. Click the subform control in Design View → Property Sheet → Data tab. Verify Link Master Fields (field on the parent form) and Link Child Fields (field on the subform's recordsource) are both set correctly and the field names match exactly, including capitalization. A blank Link Child Fields causes the subform to show all records regardless of the parent.
- 2Verify the child field exists in the subform's RecordSource. Open the subform's RecordSource query in Design View. Confirm the Link Child Field is included in the query output — it must be a column in the result set, not just used in a WHERE clause.
- 3Check for a RecordSource error in the subform. Open the subform directly from the Navigation Pane (not through the parent). If it throws an error or shows no data when opened standalone, the subform's own RecordSource is the problem — fix the query before debugging the link.
- 4Check the subform control's Enabled and Visible properties. If a VBA event on the parent form sets
Me.sfrmOrders.Visible = FalseorMe.sfrmOrders.Enabled = Falseconditionally, the subform may be hidden in some states. Search VBA code for the subform control name.
Form error code quick lookup
| Code | Message | Likely cause on a form |
|---|---|---|
| 2450 | Can't find the referenced form | VBA code references Forms!FormName but that form isn't open; check open state before referencing |
| 2101 | Setting not valid for this control | Setting a property that doesn't apply to this control type; check control type before setting |
| 2105 | Can't go to specified record | DoCmd.GoToRecord with a record number that doesn't exist; form RecordSource is empty |
| 2115 | Macro or function set to Before Update / property can't be carried out | BeforeUpdate Cancel=True or a validation rule blocking the save while code tries to move focus |
| 2501 | Action was cancelled | A macro or event set Cancel=True on Open/Load; check On Open event for error handling with Resume Next that swallows a cancellation |
| 3075 | Expression not valid in query | Broken ControlSource or RowSource expression after a field was renamed in the table; rebuild the query |
| 3151 | ODBC connection to [server] failed | Linked SQL Server table lost its connection mid-requery; validate DSN and network path |
Environmental causes of Access form problems
Many Access form problems that look like code bugs are actually caused by the environment the database runs in. Fixing VBA without fixing the environment means the problem returns after the next user change, Office update, or network event.
Wi-Fi and VPN
Office build channel mismatch
Users on different Office 365 update channels (Current Channel vs Monthly Enterprise) run different versions of the ACE engine. A form that works on Current Channel may fail on Semi-Annual Channel if a bug was introduced and patched in one channel but not yet deployed to another. Standardize all users on the same channel via Group Policy or the Office Deployment Tool.
Antivirus scanning the .accdb
Endpoint protection products that scan .accdb files on open or write can cause forms to freeze during saves, introduce file locking conflicts, or trigger error 2501 (action cancelled) when the AV intercepts a write. Add the Access backend directory to your AV exclusion list and test whether form freeze frequency drops.
NTFS permissions
The user account needs Read, Write, and Create permissions on the folder containing the backend .accdb. Create is required for ACE to write the .laccdb lock file. If Create is missing, ACE throws before your event handlers run — making it look like a form problem when it's a permissions gap.
Professional stabilization
Self-service fixes work for isolated incidents. When the same form failures recur after every Office update, or when form corruption is spreading to multiple objects, you need a structural assessment — not another Compact & Repair cycle.
We stabilize production Access form systems for US businesses: payroll entry forms, inventory management, client billing, and custom workflow systems. Our approach: reproduce the failure on your exact topology, identify the root cause category, and deliver a written fix sequence with regression criteria before your next business cycle.
- ✓ Same-day triage for production form failures
- ✓ Corruption recovery without data loss
- ✓ VBA event audit and clean rewrite
- ✓ Ground-up form rebuilds when patch mode isn't enough
Frequently asked questions
Why is my MS Access form not working?▾
Why does my Access form open blank with no data?▾
How do I fix a corrupted Access form?▾
Why are my Access form buttons not working?▾
Why is my Access form slow or freezing?▾
Tell us the failure mode — not the mood
Send the error code (or symptom), the form name, and whether the fault follows the query when you open it in a datasheet. We respond with what we'd prove first.