Feature Tour
Guided overview of the Addin’s core capabilities. Most features are built on the same public APIs the Addin uses internally, allowing you to work at a high level or drop down to the underlying worker classes when deeper customization makes sense.
Model and Field System
Define models using typed fields (TextField, DateField, PositiveIntegerField, etc.)
through a built-in user form interface.
The Addin generates required class modules, constructors, and Getter/Setter
properties automatically, allowing you to work with records as real objects
instead of raw worksheet rows.
through a built-in user form interface.
The Addin generates required class modules, constructors, and Getter/Setter
properties automatically, allowing you to work with records as real objects
instead of raw worksheet rows.
Database Records
Once a model exists (e.g. ApartmentUnit with number_beds, square_feet, rent_asking),
records can be created immediately.
All Getter/Setter procedures are fully wired by default, allowing instances to be
created, read, and updated without manual VBA plumbing.
records can be created immediately.
All Getter/Setter procedures are fully wired by default, allowing instances to be
created, read, and updated without manual VBA plumbing.
Database Record Sorting
Records can be sorted by one or more fields, including relational fields
(ForeignKey), even when the sort column lives on a different worksheet.
This allows expressive, database-style ordering while remaining entirely
Excel-native.
(ForeignKey), even when the sort column lives on a different worksheet.
This allows expressive, database-style ordering while remaining entirely
Excel-native.
Basic Fields
Basic field types enforce value correctness at the object level, reducing the need
for repeated defensive checks throughout your code.
Available field types are listed here.
for repeated defensive checks throughout your code.
Available field types are listed here.
Relational Fields
ForeignKey and ManyToMany field types are supported, enabling expressive access
patterns such as property.amenities.all().
Relational fields allow models to reference one another without duplicating data,
bringing database-style relationships into worksheets.
patterns such as property.amenities.all().
Relational fields allow models to reference one another without duplicating data,
bringing database-style relationships into worksheets.
FormulaFields
FormulaField represents values calculated from worksheet cells. This allows your records to have
Setting Registry
Some values do not belong to any specific model but still need persistence.
The Setting Registry stores these values on a hidden worksheet with zero VBA edits.
Settings persist with the workbook itself, unlike Windows Registry storage, which
is machine-specific and not portable.
The Setting Registry stores these values on a hidden worksheet with zero VBA edits.
Settings persist with the workbook itself, unlike Windows Registry storage, which
is machine-specific and not portable.
Built-In Procedure Runners
The Addin ships with several built-in procedure runners that manage execution,
error capture, and reporting consistently.
In essence, write a test function, and the Addin will discover and execute it whenever
the "Test Workbook" Ribbon button is clicked. The benefit is you don't have to wire anything. You only write the test, validation, or reset function.
error capture, and reporting consistently.
In essence, write a test function, and the Addin will discover and execute it whenever
the "Test Workbook" Ribbon button is clicked. The benefit is you don't have to wire anything. You only write the test, validation, or reset function.
ErrorBank and Assertions
ErrorBank is the foundation for testing and validation. It provides expressive
assertions such as AssertGreaterThan and rich failure messages that include
context and values.
Multiple ErrorBanks can be merged together, which is how runners aggregate results
across procedures.
assertions such as AssertGreaterThan and rich failure messages that include
context and values.
Multiple ErrorBanks can be merged together, which is how runners aggregate results
across procedures.
Generic Form Views
The Addin provides generic ListView, EditView, and CreateView forms for interacting
with records.
Given a model and list of fields, the Addin renders compatible input controls,
validates submitted values, and highlights violations directly in the form.
These forms are particularly useful for relational fields, where users must select
from related records.
They are intended as a starting point rather than an end state.
with records.
Given a model and list of fields, the Addin renders compatible input controls,
validates submitted values, and highlights violations directly in the form.
These forms are particularly useful for relational fields, where users must select
from related records.
They are intended as a starting point rather than an end state.
Custom Forms
When building custom forms, submitted values are available immediately and can be
assigned directly to model properties.
Invalid assignments (e.g. assigning text to an IntegerField) fail loudly, while
bulk pre-validation can be requested before saving any values.
Type enforcement, validation, and persistence are handled centrally, eliminating
large classes of repetitive worksheet code.
assigned directly to model properties.
Invalid assignments (e.g. assigning text to an IntegerField) fail loudly, while
bulk pre-validation can be requested before saving any values.
Type enforcement, validation, and persistence are handled centrally, eliminating
large classes of repetitive worksheet code.
FormBuilder Class
Generic forms are built on top of FormBuilder. FormBuilder is also exposed
directly for advanced use cases.
Unlike generic forms, FormBuilder allows inputs to save into multiple models
at once, making more sophisticated workflows practical.
directly for advanced use cases.
Unlike generic forms, FormBuilder allows inputs to save into multiple models
at once, making more sophisticated workflows practical.
WhoaRefactoring Tool
The refactoring tool performs coordinated renaming across VBA code, modules,
range names, and worksheet cells.
Think of it as a workbook-aware Find and Replace with context.
range names, and worksheet cells.
Think of it as a workbook-aware Find and Replace with context.
Fixture Registry
The Fixture Registry saves named text blobs using Base64 compression on hidden
worksheets. Text is decompressed transparently when retrieved.
Fixtures help keeps workbook size manageable and enables the programmatic test runner to execute, even when
your VBA project is locked.
worksheets. Text is decompressed transparently when retrieved.
Fixtures help keeps workbook size manageable and enables the programmatic test runner to execute, even when
your VBA project is locked.
Programmatic Row and Column Hide
Row and column visibility can be controlled programmatically as part of larger
procedures or runners.
procedures or runners.
Prompt Interceptor
An experimental mechanism for intervening in AI prompts.
More inspirational than prescriptive at this stage.
More inspirational than prescriptive at this stage.
Progress Bar Utility
Displays progress feedback during execution.
Adds runtime overhead but improves perceived responsiveness.
Adds runtime overhead but improves perceived responsiveness.
High-Resolution Timer
Provides fine-grained timing beyond VBA’s built-in timers, allowing side-by-side
performance comparisons.
performance comparisons.
Spell Currency
Converts numeric currency values into written English. Useful in valuation and reporting contexts.
ATTRIBUTION: this was obtained (and minimally adapted) from: www.ExcelDataPro.com
ATTRIBUTION: this was obtained (and minimally adapted) from: www.ExcelDataPro.com
GIS Feature Overview
Some GIS features use Google API keys, which are free under generous limits.
All GIS capabilities are usable without paid services.
All GIS capabilities are usable without paid services.
Geocoding Street Addresses
Geocoding transforms a street address into latitude and longitude coordinates,
which serve as the basis for other GIS operations.
Requires a Google API key.
which serve as the basis for other GIS operations.
Requires a Google API key.
Distance Calculation (As the Crow Flies)
Given two coordinate pairs, distance is calculated mathematically using the
Haversine formula.
This avoids API calls but loses precision over longer distances.
Haversine formula.
This avoids API calls but loses precision over longer distances.
Export Map Points to Google Earth
Converts coordinate lists into KML map files for Google Earth.
Pins can be styled with colors, labels, and descriptive hover text.
Pins can be styled with colors, labels, and descriptive hover text.
Parse KML Polygons to Coordinates
Extracts coordinate data from polygons defined in Google Earth.
Primarily used with point-in-polygon operations.
Primarily used with point-in-polygon operations.
Point Within Polygon Boundary
Determines whether coordinates fall within a defined polygon.
Useful for zoning, environmental studies, and property analysis.
Useful for zoning, environmental studies, and property analysis.