Skip to content

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 rows

All functions start with Dvd prefix (e.g. DvdSum, DvdLookup, DvdNumToText) — ensures no naming conflict with Excel built-ins.

Categories

Text (DvdTextFunctions.cs)

FunctionDescription
DvdUpper, DvdLower, DvdProperUpper / 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)

FunctionDescription
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)

FunctionDescription
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)

FunctionDescription
DvdToLunar(date)Solar → lunar: "15/04/Ất Tỵ".
DvdToSolar(lunarDate)Lunar → solar.

Range (DvdRangeFunctions.cs)

FunctionDescription
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)

FunctionDescription
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)

FunctionDescription
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)

FunctionDescription
DvdShapeText(shapeName)Text inside shape.
DvdShapeFillColor(shapeName)Fill color of shape (hex).
DvdShapePosition(shapeName, prop)Get Top/Left/Width/Height.

Network (DvdNetworkFunctions.cs)

FunctionDescription
DvdHttpGet(url)GET request, returns body text.
DvdParseJson(text, path)Read JSON field by dotted path.

AI (DvdAIFunctions.cs)

FunctionDescription
DvdAskGemini(prompt)Ask Gemini, return text. Cell-level AI assistant.

Explain (DvdExplainFunctions.cs)

FunctionDescription
DvdExplain(cell)AI explains formula in cell.
DvdExplainEN(cell)English version.

Auto-Hide / Auto-Show (DvdAutoHide.cs)

FunctionDescription
DvdAutoHideRows(condition)Hide/show rows by condition (volatile).

Translate

FunctionDescription
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)

FunctionDescription
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:

  • DvdAutoHideRows
  • DvdHttpGet (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.
  • DvdHttpGet no limit.

License gating

FunctionFreeActivated/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.

Released under DVDAddin License.