🚀 Modern UI in Access: Custom Dialogs & Mini Notifications – now even smarter, faster & more flexible!
Building a modern database with the classic MsgBox & InputBox is like a new Porsche – but with Beetle rims. It works, but looks outdated.
Time for the next step: Custom Dialogs & mini Notifications!
🦉Why Custom Dialogs?
Imagine this: you've been working on an Access database for months. The logic is perfect, the performance is right, the security is top-notch. Then you show it to your customer – and the first thing they see is a grey MsgBox window from the 90s.

Here, I'll show you how to go from grey to great with little effort. If you want to impress users with an Access application today, you need more than standard dialogs. The new version of my Custom Dialogs is a complete refactor – even faster, even easier, even more powerful.
⚖️ Compare features
| Feature | Standard Dialogs | Custom Dialogs | Notifications |
|---|---|---|---|
| Formatted text | ❌ | ✔️ | |
| Images | ❌ | ✔️ | |
| Tables | ❌ | ✔️ | |
| Web content | ❌ | ✔️ | |
| Printable | ❌ | ✔️ | |
| Don't show again | ❌ | ✔️ | |
| Copy content | ❌ | ✔️ | |
| Delayed buttons | ❌ | ✔️ | |
| Colored header | ❌ | ✔️ | |
| Templates | ❌ | ✔️ | |
| Data selection | ❌ | ✔️ | |
| Auto close | ❌ | ✔️ | ✔️ |
| Custom Icons | ❌ | ✔️ | |
| Build in | ✔️ | ❌ | ❌ |
| Easy to use | ✔️ | ✔️ | ✔️ |
| IntelliSense | ✔️ | ✔️ | ✔️ |
✨ The stars of the show:
- myMsgBox – the modern alternative to MsgBox
- myInputBox – more attractive than the original InputBox
- myComboBox – like an InputBox but with data selection
- myListBox – like myComboBox but as a list box (multiple selections possible).
- myErrorBox – a dialog box for displaying error messages.
- myNotification – discreet, brief feedback to the user.
MyComboBox and myListbox can be filled with values either as a values list or via SQL query. Multi-column entries are also possible.
💡 Not all feedback requires a dialog box:
myNotification provides discreet, brief feedback—displayed as a semi-transparent overlay across the entire screen, with a centrally placed icon. The notification stands out visually and closes automatically after a short time. This gives users immediate feedback without interrupting their workflow.
🎨 Two integrated editors – full control
✨ Dialog-Type Editor
With the Dialog Type Editor, you can customize the icon, set a header color, and even determine the color gradient of the header. This gives the dialogs a much more modern look and fits perfectly into the design of your application.
✨ Template Editor
With the Template Editor, you can create or edit complete dialog templates – quickly, flexibly, and conveniently.
There you can:
✅ select the dialog type (myMsgBox, myInputBox, myComboBox, or myListBox),
✅ enter the header & body text (plain text or HTML),
✅ define the button captions,
✅ add a “Do not show again” checkbox,
✅ activate a print button,
✅ activate a copy content button,
✅ determine the auto-close time and the delayed display of the buttons,
✅ store default values for input, list, or combo boxes,
✅ enter values for list boxes and combo boxes directly. As a value list or as an SQL string

Particularly practical: an online HTML editor can be opened directly from the editor. With this WYSIWYG tool, simple plain text can be turned into cool HTML in no time at all, which you can then transfer directly to the template editor.

💡 IntelliSense
With modHelper_Enumeration, IntelliSense support is finally here!
It was important to me that calling dialog boxes and notifications be as easy as possible—and that requires IntelliSense. That's why all dialog types (for both notifications and dialog boxes) are controlled via enumerations.
To eliminate the effort of manually entering these enums, I developed the modHelper_Enumeration module. New enum entries can be dynamically created, edited, or deleted at runtime—directly via a the Type Editor. A real highlight: a module that can read, check, edit, or delete values from a module.
Two additional classes come into play:
clsDLG_Config – manages the complete configuration setup and the values of the dialog boxes.
clsDLG_Result – provides the returns, i.e., which button was clicked or which values were entered/selected in the ListBox, ComboBox, or InputBox.
This creates a structure that is both highly flexible and intuitive – with full IntelliSense power!
🔍 Some examples?
myMsgBox "Header", "This is the body text", DLG_Info, "OK", "Cancel"Debug.Print myComboBox("QUESTION", "Please choose a value.", DLG_Question, "SELECT dlg_type FROM tblDLG_Dialogs_types", "OK")Debug.Print myInputBox("QUESTION", "Please enter a value.", DLG_Question, "Default value", "OK", "Cancel")Debug.Print myListBox("QUESTION", "Please choose a value.",DLG_Mail, "1;2;3;4;3;5", "OK")
With DLG_Config
.DialogType = DLG_Info
.header = "HEADER Text”
.Body = “HTML string”
.Button1 = "OK"
.Button2 = "Cancel"
.Button3 = "Another button"
.Printing = True
.CopyContent = True
.AutoClose = 20
.ButtonDelay = 4
.DialogWidth = 10000
.DialogHeight = 5000
.Start_as_MsgBox
End With
With DLG_Config
.DialogType = DLG_Question
.header = "HEADER Text”
.Body = “HTML string”
.Button1 = "OK"
.ComboValue = "SELECT dlg_type, dlg_typeColor FROM tblDLG_Dialogs_types ORDER BY dlg_type"
.ComboWidths = "5cm;0cm"
. DefaultValue = “DLG_Info”
.Start_as_ListBox
End With
With DLG_Config
.TemplateName = "delete"
.TemplateValue1 = "Example text 1"
.TemplateValue2 = "Example text 2"
.DefaultValue = “Text xxx”
.Start_as_InputBox
End With
myNotification DLG_Cancel, Black, 1
💡 Replacing build in standard dialogs
I had the privilege of giving a presentation at the Access User Group Europe. During the session, someone asked whether it would be possible to create a function that could automatically replace the built-in standard dialogs — MsgBox and InputBox.
You asked for it, and here it is!My new version now supports exactly that. The function scans the entire VBE, detects all MsgBox and InputBox calls, displays them, and lets the user decide whether they should be replaced.

💡 Playground: A preview of what else is possible
In addition to the actual dialogs, I have also included a playground. Here, I will briefly show you what else is possible with the new functions:
✅ Manipulate values in existing HTML code (e.g., for theme or language)
✅ Read out selected values again
In doing so, I also came across a small peculiarity:
The web browser control in Access currently only allows content to be read out if it has been loaded using the navigate function. However, if I write the innerHTML directly (as I do in the templates – because it's faster), the values cannot be read out.
👉 My workaround in the Playground: I create a temporary HTML file, load it, and then delete it again. It works – but the loading time is noticeably longer.
But there is a solution for a very quick load of the HTML file. It seems the web browser control does a DNS call before loading the local file. Sound stupid, but it is. So it takes a long time until the DNS server respond back, that he has no glue where your local file is located. But before Windows does the the DNS call, it looks always into the local hosts-file to find an entry for. If we add '127.0.0.1 msaccess' into this file, the HTML file is loaded immediately.
WITH THIS FIX I CONSIDER THE PLAYGROUND NOT ANYMORE AS A TEST ENVIRONMENT!!!
You will find the file typically at C:\Windows\System32\drivers\etc\hosts
My new version has now a build in feature to check if the entry exists. If not It will done.
🧪 Just give it a try
You can try out the dialogs and notifications directly using my testing form. This makes it easy to get to know them, test them, and incorporate them into your own application. Your users will thank you for it.
Are you developing with Access? Then give it a try—I look forward to your feedback or ideas for additional features! 🚀
Let's take ACCESS to the next level together. Because one thing is clear:
Standard was yesterday. Today, ACCESS is sexy again.
This small extension not only makes your Access interface more intuitive, but also a whole lot “sexier”.
You can find the detailed description and all notes directly in the code - well documented as usual.
Version: 3.3.1 (04 OCT 2025)
