Edit Excel VBA code directly in VS Code. Browse modules in a sidebar tree,
edit with syntax highlighting and symbol navigation (Go to Definition,
Find All References, Rename Symbol), save changes back to the .xlsm
file with Ctrl+S, and expose every operation to GitHub Copilot via the Language Model API.
VS Code 1.95+Python 3.10+-- the VBA read/write backend runs as a child process- Python packages:
pyOpenVBA >= 3.0.1
,openpyxl >= 3.1.0
No COM automation, no Office installation, no win32com -- works on Windows, macOS, Linux, and remote containers.
git clone https://github.com/WilliamSmithEdward/xlide_vscode.git
cd xlide_vscode
npm install
npm run compile # type-check + esbuild bundle -> out/extension.js
python -m venv .venv
.venv\Scripts\activate # or: source .venv/bin/activate
pip install -r python/requirements.txt
Press F5 in VS Code to launch an Extension Development Host with the extension loaded and the watch compiler running.
xlide_vscode/
src/
extension.ts # activate() -- wires everything together
pythonBridge.ts # JSON-RPC 2.0 client over child_process stdio
xlideFileSystem.ts # xlide-vba:// virtual FileSystemProvider
xlsmExplorer.ts # Sidebar TreeDataProvider
commands.ts # VS Code command registrations
agentTools.ts # vscode.lm.registerTool() for Copilot
moduleDump.ts # Shared export-to-folder logic (UI + AI lane)
vbaSymbolIndex.ts # In-memory cross-module symbol index
vbaLanguageProviders.ts # DocumentSymbol / Definition / References / Rename
python/
server.py # JSON-RPC 2.0 server (stdin/stdout, newline-delimited)
xlide/
vba_io.py # pyOpenVBA wrappers -- listModules, readModule, writeModule
excel_io.py # openpyxl wrappers -- readCells, writeCells
syntaxes/
vba.tmLanguage.json # TextMate grammar (MS-VBAL spec-accurate)
language-configuration/
vba-language-configuration.json # Brackets, indent rules, folding
walkthrough/ # Markdown content for VS Code Getting Started tab
docs/
architecture.md # Full architecture reference
| Decision | Rationale |
|---|---|
| Long-lived Python process | Amortises ~200 ms Python startup across all requests |
FileSystemProvider over TextDocumentContentProvider |
|
Read/write virtual FS -- Ctrl+S triggers writeFile with no custom save command |
|
Virtual URI scheme xlide-vba:// |
|
| Decouples workbook path + module name from the editor's file concept | |
Shared moduleDump.ts |
|
| Export logic is single-source-of-truth for both UI commands and Copilot agent tools | |
| No COM / no Office | Portability -- pyOpenVBA reads the OVBA binary format directly |
| Confirmation on write tools | Prevents AI agents from silently mutating production workbooks |
| Method | Params | Returns |
|---|---|---|
listModules |
||
{ path } |
||
[{ name, type }] |
||
listSubs |
||
{ path, module } |
||
[{ name, kind, line }] |
||
readModule |
||
{ path, module } |
||
{ source } |
||
writeModule |
||
{ path, module, source } |
||
{} |
||
renameModule |
||
{ path, module, newName } |
||
{} |
||
deleteModule |
||
{ path, module } |
||
{} |
||
readCells |
||
{ path, sheet, range } |
||
{ values } |
||
writeCells |
||
{ path, sheet, startCell, data } |
||
{} |
Registered as vba
in package.json
with extensions .bas
, .cls
, .frm
.
The TextMate grammar in syntaxes/vba.tmLanguage.json
is scoped to
source.vba
and covers all reserved identifiers from MS-VBAL v20250520 (section 3.3.5.2: statement-keywords, marker-keywords, operator-identifiers, reserved-names, special-forms, reserved-type-identifiers, literal-identifiers, def-type directives, and implementation-reserved identifiers).
| Command | Purpose |
|---|---|
npm run compile |
|
| Type-check + dev bundle | |
npm run watch |
|
| Incremental type-check + esbuild watch | |
npm run package |
|
| Production bundle (minified) | |
vsce package --no-dependencies |
|
Build .vsix for distribution |
| Tool name | Reference | Reads/Writes | Confirm |
|---|---|---|---|
xlide_listModules |
|||
#xlideListModules |
|||
| R | No | ||
xlide_listSubs |
|||
#xlideListSubs |
|||
| R | No | ||
xlide_readModule |
|||
#xlideReadModule |
|||
| R | No | ||
xlide_writeModule |
|||
#xlideWriteModule |
|||
| W | Yes | ||
xlide_readCells |
|||
#xlideReadCells |
|||
| R | No | ||
xlide_writeCells |
|||
#xlideWriteCells |
|||
| W | Yes | ||
xlide_exportModules |
|||
#xlideExportModules |
|||
| W | Yes | ||
xlide_configureExportMode |
|||
#xlideConfigureExportMode |
|||
| W | Yes |
Stored beside each workbook as <workbookname>.extension.repo.json
:
{
"exportFolder": "C:/absolute/path/to/export",
"exportMode": "trueUp",
"managedFiles": ["Module1.bas", "Sheet1.cls"]
}
trueUp
(default) -- replace existing, add new, delete stale files tracked in
managedFiles
. replaceExistingOnly
-- only replaces files already on disk.
XLIDE VBA browsing for Live Share guests is currently not supported.
Microsoft's Live Share platform restricts the shared-service RPC channel
(vsls.shareService
) to extensions on a curated first-party allowlist, so third-party extensions like XLIDE cannot proxy VBA read/write calls from a guest to the host. The XLIDE Explorer therefore returns an empty tree for guests and shows an informational welcome view.
What still works in a Live Share session:
| Role | XLIDE behaviour |
|---|---|
| Host | |
Full local VBA editing -- open, edit, save .xlsm /.xlsb /.xlam modules exactly as if no session were active. |
|
| Guest | |
| Can fully view and edit any VBA module the host has open in the editor (Live Share shares those buffers normally). Cannot browse the XLIDE Explorer or open new modules independently -- only the host can navigate and open them. XLIDE panel shows a "not supported" notice. | |
| Guest without XLIDE installed | |
| No action needed -- XLIDE is host-only. Joining a session does not require the extension. |
Related upstream issue: microsoft/live-share#4877
(third-party shareService
allowlist, closed as Not Planned).
docs/architecture.md-- full architecture referenceMS-VBAL specificationpyOpenVBA