Access and Web Access Builder compared
<img src="../public/img/logo.svg" alt="Web Access Builder" width="276">Web Access Builder is modelled on Microsoft Access (2010 onwards, with the PivotTable and PivotChart views of 2002–2010) but runs in a browser against a database on a server. Most things work the way an Access developer expects. This page lists where they don't: what is missing, what behaves differently, and what Web Access Builder adds. The VBA environment gets the most detail, because that is where ported code meets the differences.
Key: Same works as in Access · Different works, but not quite as in Access · Missing not in Web Access Builder (yet, or because a web page can't) · Added Web Access Builder only: code using it won't run in Access.
The big picture
| Access | Web Access Builder | |
|---|---|---|
| Where it runs | A Windows program; the database is an .accdb file | A web page; the database lives on a server (SQLite) |
| Sharing | Split front end and back end on a network share | Everyone opens the same site; nothing to install |
| Security | None, or the database password; user-level security only in old .mdb files | Sign-in for every user, with two roles: admin (design, code, import, users) and user (data) |
| Design changes | One designer at a time, with the database open exclusively | Admins design while users work; a saved design is what the next person to open the object gets |
| Code | VBA in the Office VBA editor, running on Windows | A VBA interpreter in the browser, with a VBA-style editor; it runs on any device |
| Getting outside the database | DLLs, COM/ActiveX, files, the registry, Shell | None, deliberately: code sees only its own database and the browser. JavaScript modules replace DLLs |
| Dates and money | Windows regional settings | UK throughout: dd/mm/yyyy and £ |
| Backups | Copy the file | Database Tools > Back Up Database downloads a SQLite copy |
| Help with errors | Help pages and the web | Explain Error and Fix Error ask Claude about the error on the line (admins; needs an API key on the server) |
Tables and data types
| Feature | Notes | |
|---|---|---|
| AutoNumber, Short Text, Long Text, Number, Currency, Date/Time, Yes/No | Same | Number sizes Byte, Integer, Long Integer, Single, Double, Decimal |
| Attachment, OLE Object, Hyperlink, Lookup Wizard, Calculated, Large Number, Date/Time Extended | Missing | Attachment and OLE fields are dropped on import |
| Field size, Caption, Default Value, Required, Indexed | Same | Default Value is a literal, Date() or Now() |
| Format, Input Mask, Validation Rule and Text, Allow Zero Length, Text Format, Unicode Compression | Missing | An empty string is always stored as Null (Allow Zero Length off) |
| Object and field names | Same | Access's rules: up to 64 characters; letters, digits, spaces and punctuation except . ! ` [ ]; not starting with a space. Module names are stricter: letters, digits and _ |
| Primary key, multi-field keys, unique indexes | Same | An AutoNumber field is always the only key field |
| Multi-field indexes, the Indexes window | Missing | |
| Relationships window, referential integrity, cascades | Missing | Joins are made in each query |
| Table-level validation, data macros | Missing | Use form BeforeUpdate events |
| Changing a design with data in the table | Different | The table is rebuilt and the rows copied; renames keep data; a dialog lists data that will be cut or cleared before you confirm |
| Datasheet: edit in place, save on leaving the row, sort, Filter by Selection | Same | |
| Datasheet: column widths, freezing and hiding columns, Find, totals row, subdatasheets | Missing | |
| Text comparison | Same | Case-insensitive |
| Dates | Different | Stored as ISO text and shown dd/mm/yyyy; Access stores a Double |
Queries and SQL
| Feature | Notes | |
|---|---|---|
| Design grid, joins by dragging, Join Properties, Totals, criteria rows, parameters | Same | |
| SQL view | Same | Editing SQL by hand detaches the grid: Web Access Builder cannot turn SQL back into a grid |
| Select queries saved and used as sources | Same | |
| Action queries (make-table, append, update, delete) | Same | Query Type in Design view, with Append To, Update To and Delete rows; saved, run from the Navigation Pane with Access's warnings, or from code. Everyone can run them; make-table needs an admin |
| UPDATE or DELETE with a join | Same | Changes one table |
| UNION, crosstab (TRANSFORM…PIVOT), pass-through, data-definition queries | Missing | The PivotTable view covers much of what crosstabs are used for |
| TOP n | Different | Ties are not included |
| TOP n PERCENT | Missing | |
| Editable query results (dynasets) | Missing | Select query results are read-only in datasheets and forms. In code, a recordset on a query that reads one table can be edited |
Date literals #…# |
Different | Read day first (#08/11/2026# is 8 November). Access SQL reads month first. #2026-11-08# means the same in both |
True |
Different | 1 in SQL, not −1. Not is logical, not bitwise |
| Division by zero | Different | Null in a query instead of an error; #Div/0! in a calculated control |
| Aliases in HAVING and ORDER BY | Different | Allowed; Access usually treats them as parameters |
Replace, In (…) |
Different | Case-sensitive in SQL |
InStr, StrComp compare argument; first-day-of-week arguments |
Different | In SQL, StrComp's compare argument and the first-day-of-week arguments are ignored and InStr takes no compare argument (a fourth is an error): both always ignore case, and weeks start on Sunday |
| Domain functions inside SQL | Missing | Available in code and in calculated controls |
PARAMETERS |
Different | One-word types only (Text, not Text (255)) |
IN 'other.accdb', linked tables, ODBC |
Missing | Connections to external SQL databases are on the roadmap |
Like wildcards * ? # [a-z] [!a] |
Same | ANSI % and _ are ordinary characters |
Forms
| Feature | Notes | |
|---|---|---|
| Single Form, Continuous Forms, Datasheet | Same | |
| PivotTable and PivotChart views | Same as Access 2002–2010 | Access 2013 removed them |
| Split Form, Layout view, Navigation forms, web browser control | Missing | |
| Header, Detail and Footer sections | Same | No page header or footer |
| Labels, text boxes, combo and list boxes, check boxes, option groups, option and toggle buttons, buttons, tab controls, images, subforms, lines, rectangles | Same | |
| Hyperlink | Different | A control of its own (http, https, mailto) rather than a hyperlink field |
| Bound and unbound object frames, attachments, charts (other than PivotChart), ActiveX | Missing | |
| Button actions | Different | A fixed list (save, undo, new, delete, navigation, close, open a form, hide/show the ribbon and pane) in place of the Command Button Wizard's macros |
| Combo boxes | Different | Bound Field and Display Field in place of Column Count and Column Widths; one column shown; up to 1,000 rows. NotInList is not raised |
Calculated controls, =Sum() and other totals, domain functions |
Same | Totals are worked out by the server |
| Conditional formatting, including data bars | Same as Access 2010 | Up to 50 rules per control; text boxes and combo boxes |
| Anchoring, Pop Up, Modal, Auto Center | Same | A form fills its tab, as a tabbed document does |
| Startup form, custom ribbons, custom shortcut menus | Missing | Button actions and DoCmd.ShowToolbar can hide the ribbon and Navigation Pane. The Navigation Pane has a right-click menu (Open or Run, Design View); forms and datasheets have none |
| Code in Datasheet view | Different | A form in Datasheet view (its own, a datasheet subform, or Default View Datasheet) runs none of its event code; conditional formatting still applies |
| Filter by Form, Advanced Filter/Sort, Find and Replace | Missing | Filter by Selection, sorting and code filters work |
| Design undo, copy and paste between forms, alignment, sizing, spacing | Same | |
| Subform nesting | Different | Three levels (Access allows seven) |
| Forms on queries | Different | Read-only |
| Images | Different | Stored in the form, up to 400 KB |
Reports, macros and other objects
| Object | Notes | |
|---|---|---|
| Reports: Report button, Design view, Report View, Print Preview, printing | Same | Report, Page, Detail and group headers and footers; labels, text boxes, check boxes, hyperlinks, images, lines, rectangles; conditional formatting |
| Group, Sort, and Total; Totals; Running Sum; Hide Duplicates; Force New Page; Repeat Section; Keep Together; Page Numbers | Same | |
| Export a report to PDF | Different | Through the browser's print dialog (Save as PDF); no PDF made on the server yet |
| Subreports, Can Grow and Can Shrink, Layout view, labels wizard, charts in reports | Missing | Subreports and Can Grow/Shrink are next |
Opening reports from code (DoCmd.OpenReport, OutputTo), the Reports collection |
Missing | DoCmd.OpenReport raises 2501 "Reports come in a later update" |
| Macros, embedded macros, data macros, AutoExec | Missing | Use VBA |
| Modules and class modules | Same | |
| Relationships, Documenter, Analyzer, linked table manager, Switchboard | Missing | |
| Compact and Repair | Same | Database Tools |
| Import from Access: Import Objects dialog, tables (definition and data, or definition only) and queries | Same | Queries are rebuilt as Access SQL, including action queries; one that can't run as it is still comes in, with the reason. Union, crosstab and pass-through queries can't come in yet |
| Import forms, reports, macros and modules from Access files | Missing | Listed but not imported yet. Export modules from Access's editor and use Import File… |
| Import from Excel, text | Same | .xls must be saved as .xlsx first |
| Export to Excel, text | Same | Also from users, not just designers |
| Saved imports and exports, SharePoint, XML, ODBC | Missing | |
| User and group security | Different | Built in: admins and users, managed in Database Tools > Users |
The VBA editor
| Feature | Notes | |
|---|---|---|
| Project list, Object and Procedure drop-downs | Same | Inside the app's code window, not a separate program |
| Syntax colouring, auto-indent, case and spacing tidy on leaving a line, red syntax-error lines | Same | |
| IntelliSense: List Members, constants, Parameter Info, Complete Word (Ctrl+J, Ctrl+I, Ctrl+Space) | Same | Lists include your Types, Enums, classes and JavaScript functions |
| Debug > Compile | Same | Also flags code that can't run on the web, with the reason |
| Breakpoints, Step Into/Over/Out, Run to Cursor, Locals, Watches, Call Stack | Same | Same keys (F5, F8, F9…). Admins only |
| Immediate window | Same | Also has IntelliSense; while paused, works in the paused procedure |
| Edit and Continue | Different | Change variables while paused and continue; code edits take effect the next time the procedure runs, not in the paused one |
? in code |
Different | Becomes Debug.Print, not Print |
| Clearing the Immediate window from code | Added | Debug.Clear or Cls |
| Explain Error, Fix Error (AI) | Added | Claude explains the error on the line and proposes a fix to apply or not; admins, when the server has an API key |
| Properties window, Object Browser, UserForms, Add Watch conditions (break when true or changed), Set Next Statement, Quick Watch, bookmarks, split window | Missing | |
| Import and Export File | Same | .bas and .cls files open in Access's editor; .frm UserForms do not import |
| Tools > References | Different | Fixed list: VBA, Access, DAO and JSON always on; Scripting Runtime, VBScript Regular Expressions and six JavaScript libraries to tick. No COM type libraries or Browse… |
| Module passwords, VBA project protection, digital signatures, Trust Center | Missing | Only admins can open the code window, but every module's code is sent to each user's browser to run, so keep secrets (keys, passwords) out of code |
| Where modules are saved | Different | All changed modules save together with Ctrl+S; a module saves even with compile errors |
The VBA language
| Feature | Notes | |
|---|---|---|
| Variables, constants, arrays, user-defined Types, Enums, Option Explicit/Compare/Base | Same | |
| Option Compare Binary | Different | Makes comparisons case-sensitive, but InStr, InStrRev, StrComp, Replace and Filter still ignore case unless given vbBinaryCompare |
| Sub, Function, Property Get/Let/Set, Optional, ParamArray, ByRef/ByVal, named arguments | Same | |
| If, Select Case, For, For Each, Do, While, With, GoTo, Exit, End, Stop | Same | |
| On Error GoTo / Resume Next / GoTo 0 / GoTo -1, Resume, Err.Raise | Same | Same error numbers and messages |
| Class modules, New, Class_Initialize, Class_Terminate, Is, TypeOf | Same | |
| Implements, Event, RaiseEvent, WithEvents | Missing | Compile error |
| Default members of your own classes, For Each over your own class | Missing | |
| GoSub…Return, On…GoTo, On…GoSub | Missing | Compile error, suggesting a Sub or Select Case |
Line numbers as labels (10 x = 1, GoTo 10) |
Same | |
Erl |
Missing | |
| Declare, AddressOf, LongPtr pointers | Missing | Write a JavaScript module |
| File I/O (Open, Print #, Input #, Line Input, Get, Put, FreeFile, EOF, LOF) | Missing | |
| Collection | Same, plus extras | Exists, Key, Keys, Items, RemoveAll, Sort and assigning to an item are added |
| ReDim Preserve | Added | Can change any bound, not just the last dimension's upper bound |
Date literals in code #m/d/yyyy# |
Same | (Different from Web Access Builder SQL, which reads day first) |
CDec, Decimal |
Different | Held as Double |
CurrentUser() |
Same | Always "Admin", as in an unsecured Access database. Application.CurrentUser gives the signed-in user (different) |
StrConv |
Different | vbUpperCase, vbLowerCase and vbProperCase only |
Format, DateDiff, DatePart |
Different | First-day-of-week and first-week-of-year arguments are ignored; weeks start on Sunday; formats are UK. Weekday honours its first-day argument |
Randomize |
Different | Accepted, no effect: Rnd cannot be seeded, so repeatable sequences (Rnd(-1) then Randomize n) are not available. Rnd(0) repeats the last number |
IsError, CVErr |
Different | IsError is always False; CVErr returns the number |
SysCmd |
Different | Returns 0 |
Eval |
Same | Reads Forms! and TempVars! references, so prm.Value = Eval(prm.Name) fills a QueryDef's parameters |
Error() function, Error statement |
Missing | Use Err.Description and Err.Raise |
| Infinite loops and deep recursion | Different | No "Out of stack space" (28); the page stays busy until you press Break or Reset |
| Speed | Different | Interpreted in the browser, and every data call is a request to the server: loop over records in SQL (CurrentDb.Execute) rather than in VBA where you can |
Events
| Event | Notes | |
|---|---|---|
| Form Open, Load, Current, BeforeInsert, AfterInsert, BeforeUpdate, AfterUpdate, Dirty, Delete, Unload, Close, Timer | Same | Cancel works where Access allows it |
| Control Click, DblClick, Change, BeforeUpdate, AfterUpdate, Enter, Exit, GotFocus, LostFocus; tab control Change | Same | |
| Activate, Deactivate, Resize, Error, KeyDown, KeyUp, KeyPress, NotInList, form Click and DblClick, a text or combo box's Dirty | Missing | Offered in the editor and they compile, but they are not raised yet |
| MouseDown, MouseUp, MouseMove, BeforeDelConfirm, AfterDelConfirm; the KeyPreview property | Missing | Not offered |
| Events in Datasheet view | Missing | A form in Datasheet view runs no event code |
| On Render | Added | Runs as each record's copy of a control is drawn, for per-record formatting from code |
Event properties pointing at macros or =Function() |
Missing | Only [Event Procedure] |
| Report events | Missing | Reports have no code yet |
Access objects in code
| Object or member | Notes | |
|---|---|---|
Me, Me!x, Me.x, Me("x"), Me.Controls, Me.Parent, Me.ActiveControl, subform .Form |
Same | |
| Form properties: Caption, Dirty, NewRecord, CurrentRecord, OpenArgs, Filter, FilterOn, OrderBy, OrderByOn, AllowEdits and friends, TimerInterval, RecordsetClone, Recordset, Bookmark | Same | |
Me.RecordSource = … |
Missing | Error 2448 "comes in a later update" |
Me.Cycle, Hwnd, Painting, Properties, WindowLeft/Top/Width/Height, Me.Height, Me.BackColor |
Missing | They compile but fail when run (2465 or 438) |
| Control properties: Value, Text, OldValue, Visible, Enabled, Locked, Caption, colours, fonts, Left/Top/Width/Height (twips), Tag, ControlTipText, RowSource, ControlSource, SourceObject; Column, ItemData, ListCount, ListIndex; SetFocus, Requery, Undo | Same | |
ItemsSelected, Selected (multi-select list boxes), Pages, PreviousControl, SelStart/SelLength/SelText |
Missing | |
Forms!Name, Forms("Name"), Forms.Count, Screen.ActiveForm, Screen.ActiveControl, TempVars |
Same | TempVars last for the browser session |
DoCmd.OpenForm (with WhereCondition, data mode, acDialog, OpenArgs), Close, GoToRecord, GoToControl, Requery, RefreshRecord, ApplyFilter, ShowAllRecords, RunSQL, SetWarnings, Hourglass, Beep, CancelEvent, ShowToolbar, MoveSize, OpenTable, OpenQuery (including action queries) |
Same | ShowToolbar knows "Ribbon" and "Navigation Pane" only. OpenForm with acFormDS opens a plain datasheet: no WhereCondition, OpenArgs or code |
DoCmd.RunCommand |
Different | Seven commands (save, undo, delete, new record, refresh, remove filter/sort, select record); others raise 2046 |
DoCmd.OpenReport, OutputTo, FindRecord, FindNext, SearchForRecord |
Missing | Compile, but raise 2501 "comes in a later update" |
DoCmd.TransferSpreadsheet, TransferText, TransferDatabase, PrintOut, SendObject, RunMacro, Quit, CopyObject, DeleteObject, Rename, Echo… |
Missing | Compile error "not available on the web" |
DoCmd.Save, Maximize, Minimize, Restore |
Different | Accepted, no effect |
Application.Quit |
Missing | Error 2501: close the browser tab |
Me("x"), Me(0) |
Different | Reach controls only; Me.x and Me!x reach controls, then fields |
CurrentProject, CodeProject, CodeDb, DBEngine, Workspaces, Reports, AllForms, CommandBars, Application.FileDialog |
Missing | |
MsgBox, InputBox |
Same | Shown as the app's own dialogs; the default title is "Web Access Builder". vbCritical and vbExclamation show a warning style; vbQuestion and vbInformation have no icon. InputBox ignores XPos, YPos and help |
DAO and data from code
| Feature | Notes | |
|---|---|---|
CurrentDb.OpenRecordset on a table, query or SQL |
Same | |
| Move…, EOF, BOF, RecordCount, AbsolutePosition, Bookmark, Find…, NoMatch, Clone, GetRows, Requery | Same | RecordCount is right straight away (no MoveLast needed) |
| Edit, AddNew, Update, CancelUpdate, Delete | Same | On recordsets of one table's records |
| Updating a recordset on a query | Different | Allowed when the query reads one table (no join, totals or DISTINCT); otherwise read-only (error 3027) |
| Size | Different | Every record is read at once, up to 50,000 |
CurrentDb.Execute (SQL or a saved action query), RecordsAffected, DoCmd.RunSQL with its warnings |
Same | |
Execute without dbFailOnError |
Different | Each statement is one transaction: a bad value means nothing changes and no error is raised (RecordsAffected = 0). Access changes the records it can |
[Forms]!… and [TempVars]!… in SQL for Execute and OpenRecordset |
Different | Filled in from open forms and TempVars (Access raises 3061); other parameters still raise 3061 |
| SELECT … INTO | Different | Admins only |
| Domain functions DLookup, DCount, DSum, DAvg, DMin, DMax, DFirst, DLast | Same | |
| DStDev, DStDevP, DVar, DVarP | Missing | |
| QueryDefs: Name, SQL, Type, Fields, Parameters, OpenRecordset, Execute, CreateQueryDef (saved or temporary), Append, Delete | Same | Setting SQL saves the query. Changing designs needs an admin |
| TableDefs: Fields (with Caption and Description properties), Indexes, RecordCount, CreateTableDef, CreateField, Fields.Append/Delete, renaming, TableDefs.Append/Delete | Same | Changing designs needs an admin |
| CreateIndex, linked tables (Connect, RefreshLink), Relations, Containers, Workspaces | Missing | Set Indexed in Design view |
| Transactions (BeginTrans, CommitTrans, Rollback) | Missing | Each change is saved straight away |
| ADO, ODBC connections, linked tables | Missing | |
| Multi-user locking (Record Locks, LockEdits, the "write conflict" dialog) | Missing | There are no record locks and no conflict check: if two people edit the same record, the later save wins |
Things a web page cannot do
Each of these is a compile error with the reason, so ported code shows straight away what needs changing.
| VBA | Why | Instead |
|---|---|---|
Shell, SendKeys, AppActivate |
They drive Windows | — |
Kill, MkDir, RmDir, ChDir, ChDrive, FileCopy, Dir, CurDir, FileLen, FileDateTime, GetAttr, SetAttr |
No access to the computer's files | External Data import and export |
Open … For, Print #, Input #, Line Input, Get, Put, Write #, FreeFile, EOF(n), LOF |
No files | Build text with Csv.Stringify or JSON |
Environ, GetSetting, SaveSetting, DeleteSetting, GetAllSettings |
No Windows settings or registry | A settings table, or TempVars |
Declare, AddressOf |
No DLLs | A JavaScript module |
CreateObject("…") other than Scripting.Dictionary and VBScript.RegExp, GetObject |
No COM | The JavaScript libraries; JSON |
CallByName |
Not supported | Select Case |
Web Access Builder additions
Code using these won't run in Access. For SortArray, Cls, Debug.Clear, the Collection extras and ReDim Preserve beyond VBA's rules, the first time each line runs the Immediate window says so: Note (Module1, line 12): SortArray is a webaccess addition; Access's VBA doesn't have it. The others print no note.
| Addition | What it does |
|---|---|
| On Render event | Per-record formatting from code, after conditional formatting |
| ReDim Preserve on any bound | Keeps the elements still in range |
| Collection extras | c(key) = value, Exists, Key(i), Keys, Items, RemoveAll, Sort |
SortArray |
Sorts 1-D arrays, or 2-D arrays by a column |
Debug.Clear, Cls |
Clear the Immediate window |
| JSON type | JSON.Parse, j("key"), j.Stringify, JSON.FromRecordset |
| JavaScript modules | Functions in JavaScript that VBA calls, in place of DLLs |
| JavaScript libraries | Csv, Stats, Geo (British National Grid, OS grid references, chainage), Dates (UK bank holidays, working days, financial years), Fuzzy, Crypto |
| PivotTable and PivotChart views | Restored from Access 2010 |
| Roles and sign-in | Admin and user, without user-level security files |
| AI help with errors | Explain Error and Fix Error in the code window |
Porting code from Access
- Import Objects from the Access file (External Data > Access) brings in the tables and saved queries. Rewrite any union or crosstab queries, and re-create the forms and reports, with the same control names.
- Export each module from Access's editor (right-click > Export File) and Import File… it in the code window. Form modules (
Form_<name>.cls) go behind the form of that name, so make the forms first. - Compile. Fix what it reports: file, registry, Shell and DLL calls; GoSub and On…GoTo; Implements and WithEvents; unsupported DoCmd methods. Explain Error helps here if the server has an API key.
- Check dates in SQL strings:
"… WHERE Placed >= #" & Format(d, "mm/dd/yyyy") & "#"must becomeFormat(d, "yyyy-mm-dd"), which reads the same in both. Date literals in VBA code itself are unchanged. - Check code that relies on events not yet raised (KeyDown, KeyPress, NotInList, Error, Activate, Resize), on report events or on opening reports from code.
- If you use a Web Access Builder addition, keep a fallback if the code must still run in Access (the Immediate window notes some of them; see Web Access Builder additions).
Microsoft Access is a trademark of Microsoft Corporation. Web Access Builder is an independent product and isn't affiliated with or endorsed by Microsoft. © 2026 Simon Wilson.