UDF (User-Defined Functions)
DVDAddin provides ~70 custom Excel functions — used like normal Excel formulas (=DvdSum(A1:A10)).
How to use
In any cell, type = + function name + arguments:
=DvdNumToText(1234567) → "Một triệu hai trăm ba mươi tư nghìn năm trăm sáu mươi bảy"
=DvdDateLunar(A1) → "15/04/Ất Tỵ" (solar → lunar)
=DvdSpillRows(A1:C100, "Hanoi") → dynamic spill array of matching rowsAll functions start with Dvd prefix (e.g. DvdSum, DvdLookup, DvdNumToText) — ensures no naming conflict with Excel built-ins.
Categories
Text (DvdTextFunctions.cs)
| Function | Description |
|---|---|
DvdUpper, DvdLower, DvdProper | Upper / lower / proper case — Vietnamese diacritics support (unlike UPPER built-in). |
DvdRemoveDiacritics(text) | Strip Vietnamese diacritics: "Hà Nội" → "Ha Noi". |
DvdJoin(range, separator) | Concat cells with separator (improved TEXTJOIN). |
DvdRegexMatch(text, pattern) | True if text matches regex. |
DvdRegexReplace(text, pattern, replacement) | Replace with regex. |
DvdExtractNumbers(text) | Extract numbers from text. |
DvdReverseText(text) | Reverse string. |
DvdRomanToArabic(roman) | "MMXXVI" → 2026. |
DvdArabicToRoman(num) | 2026 → "MMXXVI". |
Money + Math (DvdMoneyAndMath.cs)
| Function | Description |
|---|---|
DvdNumToText(num) | 1234 → "Một nghìn hai trăm ba mươi tư đồng". |
DvdNumToTextEN(num) | 1234 → "One thousand two hundred thirty four". |
DvdRound(value, mode) | Round with mode "up", "down", "nearest", "banker". |
DvdFormatVnd(num) | 1234567 → "1.234.567 đ". |
DvdFormatUsd(num) | 1234.56 → "$1,234.56". |
Date/Time (DvdDateTimeFunctions.cs)
| Function | Description |
|---|---|
DvdWorkdays(start, end, holidays) | Working days (excluding Sat, Sun, holidays). |
DvdAddWorkdays(start, days, holidays) | Add N working days. |
DvdMonthDiff(start, end) | Months between 2 dates. |
Lunar Calendar (DvdLunarCalendar.cs)
| Function | Description |
|---|---|
DvdToLunar(date) | Solar → lunar: "15/04/Ất Tỵ". |
DvdToSolar(lunarDate) | Lunar → solar. |
Range (DvdRangeFunctions.cs)
| Function | Description |
|---|---|
DvdSumVisible(range) | Sum VISIBLE cells (post-AutoFilter), unlike SUM. |
DvdCountVisible(range) | Count visible cells. |
DvdLastNonEmpty(range) | Last non-empty cell. |
DvdFirstNonEmpty(range) | First non-empty cell. |
DvdMaxByDate(rangeData, rangeDate) | Get value at max date. |
Lookup (DvdLookupFunctions.cs)
| Function | Description |
|---|---|
DvdVLookupAll(needle, range, col) | Return all matches (unlike VLOOKUP first only). |
DvdXLookup2D(rowKey, colKey, table) | 2D XLOOKUP. |
DvdRangeByName(name) | Get range by Named Range. |
Spill (dynamic arrays) (DvdSpillFunctions.cs)
| Function | Description |
|---|---|
DvdSpillFilter(range, condition) | Filter rows matching condition → spill. |
DvdSpillUnique(range) | Unique values (unlike UNIQUE built-in, multi-column). |
DvdSpillSort(range, col, asc) | Sort spill. |
Shape (DvdShapeFunctions.cs)
| Function | Description |
|---|---|
DvdShapeText(shapeName) | Text inside shape. |
DvdShapeFillColor(shapeName) | Fill color of shape (hex). |
DvdShapePosition(shapeName, prop) | Get Top/Left/Width/Height. |
Network (DvdNetworkFunctions.cs)
| Function | Description |
|---|---|
DvdHttpGet(url) | GET request, returns body text. |
DvdParseJson(text, path) | Read JSON field by dotted path. |
AI (DvdAIFunctions.cs)
| Function | Description |
|---|---|
DvdAskGemini(prompt) | Ask Gemini, return text. Cell-level AI assistant. |
Explain (DvdExplainFunctions.cs)
| Function | Description |
|---|---|
DvdExplain(cell) | AI explains formula in cell. |
DvdExplainEN(cell) | English version. |
Auto-Hide / Auto-Show (DvdAutoHide.cs)
| Function | Description |
|---|---|
DvdAutoHideRows(condition) | Hide/show rows by condition (volatile). |
Translate
| Function | Description |
|---|---|
DvdTranslateGoogle(text, from, to) | Translate via free Google. |
DvdTranslateGemini(text, from, to) | Translate via Gemini (needs API key). |
DvdTranslateChatGPT(text, from, to) | Translate via OpenAI/Groq/Cerebras. |
OCR (OcrLegacy.cs)
| Function | Description |
|---|---|
DvdOcr(filePath) | OCR image file → text. |
DvdOcrPdf(pdfPath, page) | OCR one PDF page. |
Notes
Volatile functions
Some functions are volatile — Excel recalculates them every time ANY cell changes. Volatile functions:
DvdAutoHideRowsDvdHttpGet(if URL contains{{timestamp}})
Volatile functions slow down workbooks. Avoid using in large quantity (>100 cells).
Async behavior
Network-calling functions (DvdHttpGet, DvdAskGemini, DvdTranslate*, DvdOcr*) run async — return #GETTING_DATA immediately → resolve when response arrives.
If a workbook has many async UDFs, you can limit concurrency to avoid rate limits:
DvdTranslate*uses SemaphoreSlim(10) — max 10 parallel requests.DvdHttpGetno limit.
License gating
| Function | Free | Activated/Trial |
|---|---|---|
| Text/number/date functions (local-only) | ✓ | ✓ |
DvdTranslateGoogle | ✓ | ✓ |
DvdTranslateGemini, DvdTranslateChatGPT, DvdAskGemini, DvdExplain*, DvdOcr* | ✗ (returns #LICENSE!) | ✓ |
Sample workbook
DVD Addin → ribbon → Sample Forms → opens demo file with all UDFs.
Related
- AI Assistant — interactive AI dialog (not UDF).
- Translate — translate dialog (not UDF).