Microsoft Access Migration & Modernization

ModernLift · ·8 min read

Microsoft Access isn't end of life — it still ships with Microsoft 365. The problem with a business-critical Access application is fit, not support: it was built for one power user or a small team and grew into something a department now depends on, hitting Access's real ceilings on file size, concurrency, security, and maintainability. Migrating means moving the data onto a supported database like SQL Server and re-expressing the application as a real multi-user app, ideally slice by slice with each part proven equivalent before cutover.

An Access application that runs a real business process is a success story that outgrew its tool. Someone built it — a scheduling system, a quoting tool, a compliance register, an inventory tracker — because they needed it and IT didn’t have the bandwidth. It worked. So it grew. Now a department depends on it, the person who wrote it has moved on or is about to, and the whole thing lives in a single file on a network share that nobody is allowed to look at wrong. That isn’t a failure of Access. It’s Access being asked to be something it was never meant to be.

Where Microsoft Access fits — and where it stops

First, the thing most migration pitches get wrong: Microsoft Access is not end of life. It still ships with Microsoft 365, it’s still supported on Windows, and for its intended job — a single power user or a handful of people building a small data tool — it’s genuinely good at it. This isn’t a Visual FoxPro situation where the platform is dead and there’s nowhere to go.

The problem is fit, not support. Access was designed for the small end, and a business-critical app has crossed to the large end. The ceilings it runs into are architectural, and no version upgrade removes them:

CeilingWhat Access allowsWhat a real app needs
Database file sizeHard 2 GB limit per fileGrows with the business
ConcurrencyFile-share model; corrupts under real multi-user loadDozens to thousands of concurrent users
SecurityNo true authentication or row-level access controlReal identity, roles, and permissions
Web / mobileAccess web apps retired by Microsoft in 2018Browser and mobile access as standard
MaintainabilityVBA, usually understood by one personA codebase a team can safely change

None of these are bugs. They’re the boundary of what Access was built for. An application that has crossed that boundary is running on borrowed time — not because the software is unsupported, but because the business now depends on it doing things it was never designed to do safely.

What outgrowing Access actually means

The risk of a load-bearing Access app is concrete, and it shows up in a few predictable ways.

  • Corruption is a when, not an if. A shared .accdb file accessed by several people over a network is the classic Access failure mode — a dropped connection mid-write, and the file is damaged. There’s a repair tool, but when the file that corrupts is the one running the business, “usually recoverable” isn’t a risk profile a company should accept.
  • The 2 GB wall is fixed. Once the data crosses 2 GB, Access simply stops — and there’s no setting that raises it. Teams that hit this end up archiving live data just to keep the app running, which is its own kind of risk.
  • There’s no real security. Access has no genuine authentication or row-level access control. Anyone who can open the file can, in practice, see and change everything in it. In a regulated data path, an unencrypted Access file with no audit trail is a finding waiting to be written.
  • It’s a key-person dependency. The forms, the macros, and especially the VBA were usually written by one person, undocumented, over years. When they leave, the app becomes a black box the business is afraid to touch — and afraid to lose.

The migration options

There’s no single right move; there’s a right move for your application, and it turns on how much real business logic lives in the VBA and how many people depend on it.

  • Split to SQL Server first, keep the Access front end for now. Move the tables into SQL Server and point the existing Access forms at them over linked tables. This removes the 2 GB and corruption risk immediately and is genuinely low-risk. It’s a stabilizing step, not the destination — the interface is still Access and still VBA — but it buys time and safety while you plan the real rebuild.
  • Rebuild as a proper application — a web app for most cases — moving the data into a supported database and re-expressing the forms, reports, and VBA logic as maintainable code. The most common honest answer when the app is genuinely business-critical, because the value is in the behavior and the data, not the Access implementation.
  • Replace with off-the-shelf software where the Access app does something a packaged product now does well, and migrate the historical data into it. The cleanest exit when the logic isn’t actually a differentiator.

The decision rarely turns on the data alone — moving tables to SQL Server is the well-understood part. It turns on the business logic bound up in the VBA and queries: the rules, the calculations, the workflows that took years to get right and that no one wrote down. That undocumented logic is what makes an Access migration a modernization project rather than a copy job.

Modernizing an Access app slice by slice

We treat the application the same way we treat any legacy system: not a single risky rewrite, but a sequence of small, reversible steps.

A strangler facade lets the legacy Access application and the modern path run side by side. We break the app into slices — a form, a report, a table and the logic bound to it — and before any slice carries live work, we prove it behaves identically to the legacy: same results, same state, reconciled record by record against the original Access data. AI-accelerated discovery reads the forms, the queries, and the VBA end to end and captures what the application actually does — including the undocumented logic the original author never wrote down, which on a mature Access app is most of the risk — under senior-engineer review. Work shifts only on green, rollback stays a flag away, and the Access file is retired only once nothing depends on it.

When the app doesn’t need a full rebuild

We won’t pretend every Access database is an urgent crisis, and we’ll say so. A small tool used by one or two people, with no compliance exposure and a file that isn’t near 2 GB, can reasonably keep running — and the split-to-SQL-Server step alone may be all it ever needs. Where a packaged product already does what the app does, buying beats rebuilding, and we’ll point you there rather than quote a build. The full rebuild earns its place when the Access app has become genuinely multi-user, when its data sits in a regulated path, when corruption would stop the business, or when the only person who understands it is leaving. Matching the effort to the actual value is part of the assessment, not an afterthought.

Where to start

The first step is small and bounded: understand what the application is really worth before committing to a path. A discovery call scopes how much business logic lives in the VBA, how the data is structured, how many people and systems depend on it, where the compliance exposure sits, and whether the right move is to split, rebuild, or replace — on evidence, not a sales pitch. Reach the team at sales@modernlift.ai.

Frequently asked questions

Is Microsoft Access being discontinued?
No. Microsoft Access still ships as part of Microsoft 365 and remains supported on Windows — this is not an end-of-life situation like Visual FoxPro. The case to migrate off it isn't a discontinuation date; it's that a business-critical application has outgrown what Access was designed to do. What did get retired was Access web apps in SharePoint (shut down by Microsoft in 2018), which is why "put the Access app on the web" no longer has a Microsoft-native answer.
Why migrate off Access if it still works?
Because "works" and "safe to depend on" are different things once an app becomes load-bearing. Access enforces a hard 2 GB limit per database file, its file-share concurrency model corrupts under real multi-user load, it has no genuine authentication or row-level security, and the logic lives in VBA that usually only one person still understands. None of that matters for a personal tool. All of it matters when the app runs a process the business can't afford to lose.
What do you migrate an Access database to?
Typically to a supported database — most often SQL Server or PostgreSQL — for the data, and a real application (web or desktop) for the forms, reports, and VBA logic. The data move is well-trodden: Microsoft's own SQL Server Migration Assistant (SSMA) for Access handles the schema and rows. The harder, higher-value half is re-expressing the business logic buried in the VBA and queries, which is where a migration becomes a modernization rather than a copy.
Can you just move the Access backend to SQL Server and keep the front end?
Yes, and it's often the right first step. Splitting the app so the tables live in SQL Server while the Access forms talk to them over linked tables (ODBC) removes the 2 GB and corruption risk immediately and buys breathing room. We're honest that it's a stage, not the destination — the front end is still Access and still VBA. It's a low-risk way to stabilize a failing app before rebuilding the interface as a proper multi-user application.
Who provides Microsoft Access migration services?
ModernLift modernizes business-critical Access applications as a service — discovery of what the app actually does, an incremental rebuild on a supported database and application stack, and parity validation under senior-engineer review. We're not a staffing shop or a code-conversion tool; we move both the trapped data and the undocumented VBA logic onto a modern stack, slice by slice, each one proven before it goes live. It starts with a discovery call to scope what the application is really worth.
How much does a Microsoft Access migration cost?
It depends on the application, not a list price. The main drivers are how much real business logic lives in the VBA and queries, how the data is structured and how much of it there is, how many people and integrations depend on it, and how much parity scope each slice has to carry. Model the cost of moving against the risk of a corruption or a lost maintainer with our [legacy cost calculator](/legacy-cost-calculator), and a [discovery call](/meet) turns it into a scoped plan.