Cellwright

← Cellwright

Migration guide · Scott Campbell · Updated October 10, 2026

Move an Excel VBA workbook to LibreOffice.

Opening a workbook is one step. Rebuilding its automation needs a separate review of the code, controls and results.

Why macros and buttons need attention

Excel VBA can depend on Excel-specific objects, Windows APIs, COM services and control events. LibreOffice's VBA compatibility support covers a subset; it does not establish that every routine or button works the same way. Cellwright inventories those dependencies and creates a reviewable candidate with explicit unresolved items.

1. Inventory a copy of the workbook

Download the full Cellwright archive and open its launcher. Setup checks explain missing dependencies. Use Scan demonstration workbook first, then scan your own workbook. The Rust scanner needs neither Excel nor LibreOffice, and scanning never executes macros. Source-free reports are the default.

Review modules, references, UserForms, ActiveX, connections and Power Query. Treat unknown coverage as a separate investigation: a skipped or unreadable part can hide work that the estimate does not include. Hour ranges are uncalibrated planning assumptions.

2. Generate a conversion candidate

Choose compatibility Basic, native UNO Basic, Python UNO or standalone Python. Basic/UNO candidates need LibreOffice; standalone Python uses openpyxl. Every candidate retains the original source, diffs and unresolved items. Source workbooks remain intact and conversion does not run routines.

Supported deterministic rewrites include formatting, explicit cell reads/writes, clearing ranges, native copying, a bounded single-column numeric sort and literal equality filtering. Sheet creation appends/selects the new sheet. Unsupported or ambiguous arguments stay on the checklist.

Worksheets("Data").Range("A1:B4").Sort _
    Key1:=Worksheets("Data").Range("A1"), _
    Order1:=xlAscending, Header:=xlYes

Use explicit sheets, ranges, order and Header. Guessed headers, locale-sensitive text sorting, multiple sort keys and complex filters require a manual recipe.

3. Resolve the checklist

Each unresolved item has a location, reason and next action. Review shell/COM operations, automatic events and external connections with particular care. Unsupported Basic code can remain in the candidate; generating a neighboring rewrite does not make that code safe to execute.

UserForms and ActiveX need their own layout, property and event review. Imported layouts and saved bindings are candidates; complex handlers and custom controls remain manual.

4. Compare a focused test case deliberately

The dashboard lets you choose an ordinary routine, typed inputs and cells to compare. Execution requires an explicit startup flag and per-case consent. On Linux, supply a saved Excel capture covering the same routine, inputs and cells. A pass applies only to that selected case; formatting, other cells, side effects and additional workflows need their own review.

Keep these states distinct: candidate generated, manual work required, not tested and selected tests passed. openpyxl can write formula text but cannot calculate it.

Does Cellwright automatically migrate every workbook?

No. It handles a bounded subset with deterministic rules and retains original evidence. Custom object models, advanced VBA semantics, unsupported providers and uninspected parts require human work. New form interactions and Basic helpers have static checks, without runtime equivalence claims.

Download for Windows Download for Linux

The archive includes a sample workbook to try before using your own files.

Full conversion reference · Manual recipes · Validation evidence · LibreOffice VBA compatibility documentation