How to convert macro-enabled .xlsm files to safe .xlsx for archive storage
- Step 1Open the stripper on a Developer-tier account — Go to /excel-tools/excel-vba-macro-stripper. Archiving runs are typically Developer or Enterprise, which also unlock the larger 500 MB / 2 GB size limits for big legacy workbooks.
- Step 2Drop one legacy .xlsm to convert — Drag in the macro-enabled workbook. The picker shows
.xlsx, .xls, .ods; choose your.xlsm. One file per run, so for a collection you process them one at a time. - Step 3Run the conversion — Click run. JSZip removes
vbaProject.bin,vbaData.xml, andxl/macrosheets/, then repacks the remaining parts unchanged — no macro code is executed. - Step 4Record what was removed — Note the
N macro file(s) removedcount and the findings path list for your retention log, so the archive has an audit trail of the sanitisation. - Step 5Download the archival .xlsx — Save
<file>-no-macros.xlsx. This is the macro-free record that goes into the archive. - Step 6Verify before retiring the source — Open the converted copy and spot-check key sheets and totals. Once verified, retire the original
.xlsmper your retention policy.
What the stripper removes vs preserves
The tool opens the workbook as an OOXML ZIP with JSZip and deletes only macro-bearing parts by path match. Every other part is repacked byte-for-byte. Path matching is case-insensitive substring matching.
| Container part | Action | Why |
|---|---|---|
xl/vbaProject.bin | Removed | The compiled VBA project — every Sub, Function, UserForm, and class module lives here. Deleting it removes all VBA code. |
xl/vbaProjectSignature.bin / *vbaData.xml | Removed | Digital-signature stub and the VBA data manifest. Any path containing vbadata.xml is dropped so no orphaned macro metadata remains. |
xl/macrosheets/… | Removed | Excel 4.0 / XLM macro sheets. The stripper deletes this folder, so legacy XLM auto-open macros are removed alongside VBA — not just VBA. |
xl/_rels/workbook.xml.rels | Edited | The <Relationship … vbaProject …> entry is stripped so the workbook does not reference the now-deleted binary. |
xl/printerSettings/printerSettings*.bin | Preserved | Binary print settings are explicitly kept — only macro binaries are targeted, not every .bin. |
Worksheet XML, sharedStrings.xml, styles, charts, pivots | Preserved | All data, formulas, formatting, charts, and pivot tables are repacked unchanged. The output is a faithful copy minus the code. |
docProps/core.xml / docProps/app.xml | Preserved | Author, company, and revision metadata are untouched. Use the Core/App metadata wipers if you also need those gone. |
Tier access and file-size limits
The VBA Macro Stripper is gated to Developer tier and above (it throws VBA Macro Stripper requires Developer tier. on lower tiers). One file per run — there is no batch queue. Row limits do not apply: this is a binary ZIP operation, so reported input/output rows are always 0.
| Tier | Can run this tool? | Max file size | Files per run |
|---|---|---|---|
| Free | No — blocked | 5 MB (family cap) | 1 |
| Pro | No — blocked | 50 MB (family cap) | 1 |
| Pro-media | No — blocked | 200 MB (family cap) | 1 |
| Developer | Yes | 500 MB | 1 |
| Enterprise | Yes | 2 GB (streaming) | 1 |
Input formats — what actually unzips
The tool registers xlsx as its accepted format, so the file picker offers .xlsx, .xls, .ods. Under the hood it requires a valid OOXML ZIP. Pick the matching row before you upload — a file that is not a ZIP cannot be processed.
| File you have | ZIP-based? | Result |
|---|---|---|
.xlsm (macro-enabled workbook) | Yes | Primary use case. vbaProject.bin and xl/macrosheets/ are removed; you get a clean .xlsx. |
.xlsx that secretly carries a VBA project | Yes | Rare but real — a workbook renamed to .xlsx can still contain vbaProject.bin. The stripper finds and removes it. |
.xlam (macro-enabled add-in) | Yes | Same OOXML+VBA layout, so the macro binary is removed. Output is repacked as .xlsx. |
.xltm (macro-enabled template) | Yes | Unzips and strips like .xlsm. The template's cell content survives; its VBA does not. |
.xls (legacy BIFF8 binary) | No | Not a ZIP — JSZip.loadAsync throws. Re-save as .xlsm/.xlsx in Excel first, then strip. |
.ods (OpenDocument) | Yes (ZIP) | Unzips, but ODF stores macros under Basic/, not vbaProject.bin — nothing matches, so no macros are removed. |
Cookbook
Conversion flows for records-management and archiving teams. Data is anonymised; the reported behaviour is exact.
Convert a single legacy .xlsm for the archive
A 2014 reporting workbook with an old refresh macro. Strip to .xlsx for the retention store.
Input: FY2014-Report.xlsm (xl/vbaProject.bin) Result panel: 1 macro file(s) removed. Archive copy: FY2014-Report-no-macros.xlsx -> formulas, charts, totals all intact
Large legacy workbook near the size limit
A 410 MB consolidated workbook. Developer tier (500 MB) handles it; lower tiers cannot even run the tool.
Input: Consolidated-2010-2020.xlsm (410 MB) Tier: Developer (limit 500 MB) -> OK Result panel: 1 macro file(s) removed. Output: Consolidated-2010-2020-no-macros.xlsx (On Free/Pro/Pro-media the run is blocked entirely.)
Workbook with VBA plus a leftover XLM macro sheet
Decade-old templates sometimes still carry an Excel 4.0 macro sheet. Both layers are removed for a fully clean archive.
Input: Template-2009.xltm xl/vbaProject.bin xl/macrosheets/sheet1.xml Result panel: 2 macro file(s) removed. Output: Template-2009-no-macros.xlsx
Audit log entry per converted file
Capture the findings for your retention record so each archived file has provenance.
Per-file log line you can record: source: FY2014-Report.xlsm removed: 1 parts: xl/vbaProject.bin output: FY2014-Report-no-macros.xlsx date: 2026-06-12
Strip macros, then strip identifying metadata
Archival copies often must also drop author/last-saved-by. Chain a metadata wiper after the macro strip.
Step 1 VBA Macro Stripper: case-file.xlsm -> case-file-no-macros.xlsx Step 2 Core Metadata Wiper (/security-tools/office-doc-property-wiper): clears Author / Last Saved By / Company Result: macro-free AND identity-free archive copy
Edge cases and what actually happens
Legacy `.xls` (BIFF8 binary) uploaded
Fails — not a ZIPA true legacy .xls is a compound binary file, not a ZIP, so JSZip.loadAsync throws and no output is produced. Open it in Excel and Save As .xlsm (or .xlsx) first to convert it to the OOXML ZIP format, then run the stripper.
Password-encrypted workbook uploaded
Fails — encryptedExcel encryption wraps the OOXML package in an OLE/CFB container, so JSZip cannot read it as a ZIP and loading fails. Decrypt in Excel (File, Info, Protect Workbook, remove the password) first, then strip the macros from the decrypted copy.
ODF (.ods) requested for maximum archival longevity
Out of scopeSome archive standards prefer OpenDocument. This tool outputs OOXML .xlsx, not .ods, and does not convert document formats. Strip macros here first, then convert the clean .xlsx to .ods in LibreOffice if your policy requires ODF.
`xl/macrosheets/` present (Excel 4.0 / XLM macros)
RemovedXLM macros are a classic malware vector that does not live in vbaProject.bin. Because the stripper deletes anything under xl/macrosheets/, these are removed too — the findings list will name each macrosheet part it dropped.
`printerSettings.bin` in the package
PreservedThe filter targets only macro binaries (vbaproject.bin, vbadata.xml, xl/macrosheets/). Other .bin parts such as printerSettings1.bin are left in place, so your page setup survives the strip.
File had no macros at all
ExpectedNothing matches the macro filter, so the result reports 0 macro file(s) removed and you still receive a repacked .xlsx. It is a clean no-op, not a failure — handy as a confidence check that a file is already macro-free.
`docProps/app.xml` still lists the original editing app
By designThe stripper only removes macro parts; document metadata is preserved. If the editing-app fingerprint or author also needs to go, chain the App Metadata Wiper or the Core Metadata Wiper after stripping.
Pivot tables and external data connections present
PreservedPivot caches and connection definitions are non-macro parts and are repacked unchanged. The archived copy keeps its pivots; only the VBA that may have refreshed them is gone. Refresh-on-open behaviour driven by a macro will no longer fire — acceptable for a static record.
Run attempted on Free, Pro, or Pro-media tier
403 tier blockedThe processor checks the tier first and throws VBA Macro Stripper requires Developer tier. before any unzip happens. Upgrade to Developer or Enterprise to run it.
`.ods` (OpenDocument) uploaded
No macros matchedAn .ods is a ZIP and will unzip, but ODF stores Basic macros under Basic/, not vbaProject.bin. Nothing matches the filter, so 0 is reported and no macro code is actually removed.
Frequently asked questions
Is .xlsx an accepted long-term archive format?
ISO/IEC 29500 (OOXML) .xlsx is widely accepted for retention. If your policy mandates OpenDocument, strip macros here, then convert the clean .xlsx to .ods in LibreOffice — this tool does not output .ods.
Will archiving lose any of the record?
No data is lost. Cells, formulas, formatting, charts, and pivot caches are all preserved. Only the executable VBA and XLM macro parts are removed, which is the point of converting for archive.
What happens to functionality the macros provided?
Any automation driven by VBA or XLM stops working — that is intentional for an archive. The static data record remains complete; you simply lose the buttons and refresh routines.
Does it remove Excel 4.0 (XLM) macros too?
Yes. XLM macro sheets live under xl/macrosheets/, not in vbaProject.bin, and the stripper deletes that folder. Many tools that only target VBA leave XLM behind — this one removes both.
Does it modify my original file?
No. The original on disk is never touched. The tool produces a separate downloaded copy, so you keep the macro-enabled source until you choose to delete it.
Can I keep an audit trail of what was stripped?
Yes. The result reports N macro file(s) removed and the findings object lists every removed path. Record those per file for your retention log.
What is the file-size limit?
Developer tier allows up to 500 MB per file; Enterprise allows up to 2 GB. There is no row limit because this is a binary ZIP operation, not a row-by-row transform.
Can I strip several workbooks at once?
Not in one click — the tool processes one file per run (the upload control is single-file). Run them sequentially, or script your own JSZip loop if you need true batch.
What tier do I need?
Developer tier or higher. Free, Pro, and Pro-media accounts can see the tool but are blocked at run time with VBA Macro Stripper requires Developer tier.
Why does the output extension change to .xlsx?
The .xlsm extension is Excel's promise that the file may contain macros. Once the macro parts are gone, the honest extension is .xlsx. The tool names the result <original>-no-macros.xlsx.
Does it handle .xlam add-ins and .xltm templates for the archive?
Yes. Both are OOXML ZIP packages with the same VBA layout, so the macro parts are removed and the output is repacked as .xlsx. Legacy binary .xls is not a ZIP and must be re-saved to OOXML first.
Should I also clean other parts before archiving?
If your policy requires de-identification, chain the Core Metadata Wiper for author/last-saved-by and the App Metadata Wiper for the editing-app fingerprint after stripping macros. To drop buried tabs use the Hidden Sheet Destroyer, and to remove reviewer notes use the Comment Purger.
Privacy first
Every JAD Excel tool runs entirely in your browser using SheetJS and ExcelJS. Your spreadsheets, formulas, and data never leave your device — verified by zero outbound network requests during processing.