How to Convert .xls to .xlsx at Scale Without Losing a Single Macro

April 16, 2026 · 10 min read

Converting a single .xls file to .xlsx is straightforward. Converting 500 of them — while preserving every VBA macro, every external reference, every ActiveX control — is a different problem entirely.

This is the migration that trips up IT teams. They start with a script, discover it strips macros on file 47, and have to backtrack. Or they use a cloud converter, upload the first batch, and realize midway through that nothing with code came through intact.

What follows is the complete scale migration workflow: five phases, covering everything from initial inventory to production cutover. If you follow this process, you won't lose macros. You'll also have an audit trail, a validated output set, and a clean rollback path if anything goes wrong.

Why Scale Migration Is Different

Single-file migration is forgiving. You can open the result, flip through the sheets, run a couple macros manually. You'll catch problems immediately.

At scale, you can't manually inspect 500 files. Problems hide. A macro that silently fails only surfaces when someone tries to run it three weeks after the migration. By then, the original .xls may have been deleted, or the migration log may not identify which files had VBA.

Scale migration requires upfront classification, automated validation, and explicit verification before you consider the job done.

The Five-Phase Migration Workflow

Phase 1

Inventory: Know What You're Working With

Before any conversion, enumerate every .xls and .xlsm file in scope. You need to know:

The fastest way to get this data: run LegacyLeaps's free scan on your file set. It produces a structured report showing every macro, ActiveX object, and external dependency across your entire file inventory — in minutes, not days.

Phase 2

Triage: Three Migration Tiers

Sort your files into three groups. Each needs a different migration path:

In most organizations, Tier 1 makes up 60-70% of files. Tier 2 is 25-35%. Tier 3 is typically 5% or fewer. The triage report from your scan tells you exactly where each file lands.

Phase 3

Batch Migration: One Pass, Right the First Time

Run migration on each tier separately:

Tier 1 (PowerShell, no macros):

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false

Get-ChildItem "C:\migration\tier1\" -Filter "*.xls" | ForEach-Object {
    $wb = $excel.Workbooks.Open($_.FullName)
    $outPath = "C:\migration\output\" + $_.BaseName + ".xlsx"
    $wb.SaveAs($outPath, 51)  # 51 = xlOpenXMLWorkbook (no macros)
    $wb.Close($false)
    Write-Host "Converted: $($_.Name)"
}
$excel.Quit()

Tier 2 (LegacyLeaps batch mode, with macros):

Point LegacyLeaps at your Tier 2 folder. It will:

Important: Run Tier 2 on a copy of your files, not originals. Keep originals archived in read-only storage throughout the migration project.

Start with a free scan of your file inventory

LegacyLeaps's scanner classifies every .xls and .xlsm file in your inventory — macros, ActiveX, external links — so you can triage before you migrate.

Try the Free Scan
Phase 4

Validation: Before You Ship Anything

Validation is where most migrations skip a step and pay for it later. Run all of these before calling the migration complete:

4a. Macro module count verification

For every Tier 2 file, compare the VBA module count in the source .xls against the output .xlsm. A mismatch means code was lost.

# Quick module count check via COM
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false

$source = $excel.Workbooks.Open("C:\migration\tier2\report.xls")
$srcModules = $source.VBProject.VBComponents.Count
$source.Close($false)

$output = $excel.Workbooks.Open("C:\migration\output\report.xlsm")
$outModules = $output.VBProject.VBComponents.Count
$output.Close($false)

$excel.Quit()

if ($srcModules -ne $outModules) {
    Write-Warning "Module count mismatch: $srcModules source vs $outModules output"
}

4b. Spot-test macro execution

Pick 10-15 representative files from Tier 2 — the most complex ones, and a random sample. Open each in Excel 365 (64-bit) and run the primary macro. This catches runtime errors that static analysis misses.

4c. Cell value integrity check

For files with formulas, compare key cell values between source and output. Changes in calculated values indicate formula references broke during conversion.

4d. External reference resolution

Files with external workbook links will show #REF! errors if the linked files weren't migrated first or the paths changed. Run Excel's Edit Links audit on each file that had external references in your triage report.

Phase 5

Cutover and Rollback

Once validation passes, move validated output files to production locations. Follow this sequence:

  1. Copy originals to a read-only archive folder (not delete — copy)
  2. Move validated .xlsx/.xlsm files to the production paths
  3. Update any shortcuts, mapped drives, or application config that references the old paths
  4. Notify users of the completed migration and new file locations
  5. Keep the archive available for 30 days before final cleanup

Rollback plan: If a production issue surfaces post-cutover, the archive is your safety net. Document where it lives, who has access, and how long it will be retained. Don't rely on backups alone — backups can lag, archives are immediate.

Common Mistakes That Cause Macro Loss

Mistake What Happens How to Avoid
Saving as .xlsx instead of .xlsm All VBA modules silently stripped Let LegacyLeaps choose format based on content, or use format 52 in PowerShell
Running PowerShell on Tier 2 files Macros survive format, but 64-bit incompatibilities remain Use LegacyLeaps for any file with VBA code
Skipping Phase 4 validation Broken macros surface in production weeks later Never skip module count verification and spot testing
Deleting originals at cutover No rollback path if issues surface Archive originals for 30 days minimum before cleanup
Migrating all files in one batch before validating A systemic issue affects every file before you detect it Validate a pilot batch of 20-30 files before running the full set

Timing: What to Expect

Processing speed depends heavily on file complexity and your hardware. Rough benchmarks:

A 500-file migration with mixed content typically runs in 4-8 hours of processing plus 2 hours of validation. A 2,000-file migration is a weekend project — run batch processing overnight and validate the next morning. We've seen manufacturing teams complete 2,000+ file migrations in a single weekend using this workflow.

The Free Scan as Your Phase 1 Foundation

The entire workflow depends on accurate inventory data. If you don't know which files have macros, you can't triage. If you can't triage, you can't choose the right migration path for each file.

LegacyLeaps's free scan was built specifically to solve Phase 1. Point it at a folder, and it produces a structured report showing macro presence, VBA module count, ActiveX objects, and external links for every file — in minutes. That report drives every decision in the workflow that follows.

Ready to start your scale migration?

Download LegacyLeaps and run the free scan on your file inventory. You'll have your triage report in minutes — and you'll know exactly what Tier 2 looks like before you start converting anything.

Download Free Scanner

Related Reading

Get tips like this in your inbox

Practical fixes for legacy Excel and Access problems. No spam.

← Back to all posts