1、通过 LAMBDA 函数创建的自定义公式.
仅在 Excel 2021 和 Microsoft 365 中可用,旧版本(如 Excel 2019)不支持。
- 在名称管理器中定义:
- 名称:DiscountPrice
- 公式:=LAMBDA(price, rate, price * (1 - rate))
- 在工作表中使用:=DiscountPrice(A1, B1),其中 A1 是原价,B1 是折扣率。
- =LAMBDA(price,rate, price * (1 - rate))
- =DiscountPrice(B1,C1)
2、通过 VBA 创建的自定义公式(UDF)
Function SquareSum(a As Double, b As Double) As Double
SquareSum = a ^ 2 + b ^ 2
End Function
vba源码添加模块另存为xla,在开发工具加载项加载xla,如果避免自己写的公式不被泄露需要添加保护,需要保护整个工作簿,导致很多功能不能用,这种必须保存为宏文件体验不好。
典型的插件:雳英(LYPG)资产评估软件
在 C# 中实现 Excel 的 **自定义公式(UDF)**,可以通过以下两种常见方式:
✅ 方法一:使用 Excel-DNA 创建自定义函数(推荐)
步骤:
1. 安装 Excel-DNA NuGet 包
在你的 C 项目中安装:
```
Install-Package ExcelDna.AddIn
```
2. 编写 UDF 函数
创建一个类库项目(.NET Framework 推荐使用 4.8):
```csharp
using ExcelDna.Integration;
public static class MyFunctions
{
[ExcelFunction(Description = "Returns the double of the input")]
public static double DoubleValue(double x)
{
return x * 2;
}
[ExcelFunction(Description = "Greets the user")]
public static string Greet(string name)
{
return "Hello, " + name;
}
}
```
3. 创建 `.dna` 文件(用于声明为 Excel 插件)
创建一个和 DLL 同名的 `.dna` 文件,例如 `MyAddin.dna`:
```xml
<DnaLibrary RuntimeVersion="v4.0" Name="My Addin">
<ExternalLibrary Path="MyAddin.dll" />
</DnaLibrary>
```
4. 构建并运行
构建后,将生成 `.xll` 文件,双击即可在 Excel 中打开插件,或放入 `XLSTART` 文件夹自动加载。
5. 在 Excel 中使用
比如上面的函数可以直接在 Excel 中输入:
```excel
=DoubleValue(5)
=Greet("Tom")
```
---
✅ 方法二:使用 COM 注册表导出 Excel UDF(不推荐,复杂且对部署要求高)
* 将类库注册为 COM 组件
* 实现 `IDTExtensibility2` 或 `ICustomFunction`
* 使用 `RegAsm.exe` 注册 DLL,添加注册表项
⚠️缺点:复杂、容易出错、不支持跨平台、较新版本 Office 限制较多。
---
✅ 总结:推荐使用 Excel-DNA 的原因
| 特性 | Excel-DNA | COM 插件 |
| ------------ | --------- | ------ |
| 简单易用 | ✅ | ❌ |
| 支持 UDF 函数 | ✅ | ✅ |
| 部署便捷 | ✅(XLL 文件) | ❌ |
| 支持 .NET 最新版本 | ✅ | ❌ |
| 跨平台兼容 | 部分支持 | ❌ |
---
🔧 附:生成 `.xll` 的实用工具
你可以使用 Excel-DNA 提供的打包工具 `ExcelDnaPack.exe` 将你的 DLL 和 `.dna` 文件打包成一个 `.xll` 文件:
```bash
ExcelDnaPack.exe MyAddin.dna
```
使用 Excel 的 自定义公式(UDF, User Defined Function) 无论是通过 VBA、Excel-DNA、还是 COM 插件方式,都有一些不可忽视的缺点和限制。以下是它们的主要劣势:
---
❗通用缺点(适用于所有 UDF,包括 VBA 和 C/Excel-DNA)
1. 🚫 无法在数组公式/动态数组中完整支持(取决于平台)
UDF 默认不支持像 `FILTER()`、`SEQUENCE()` 等动态数组函数的行为。
在较新版本(如 Excel 365)中配合 `LAMBDA` 使用可以部分规避,但需要技巧。
2. 📉 计算性能差(尤其是大量调用时)
与 Excel 原生函数相比,UDF 执行速度慢很多;
如果在大量单元格中调用,会显著拖慢工作簿性能。
3. 🔁 不自动重算(需显式指定)
如果函数引用了外部单元格,但没有作为参数传入,Excel 不会自动刷新结果;
例如访问 `Range("A1")` 而不是传入参数。
4. 🧠 不支持异步或后台计算(尤其是 VBA)
UDF 都是同步运行,阻塞 Excel 主线程;
不支持异步请求(例如:Web API 调用、数据库操作)。
---
❗VBA 实现的 UDF 特有的缺点
1. ⚠️ 安全限制(宏必须启用)
用户必须启用宏(.xlsm 或 .xla 文件)才能使用;
某些组织政策中禁用宏,导致函数不可用。
2. ❌ 不支持多线程重算(MTD)
Excel 的多线程计算(Multi-threaded calculation)对 VBA 函数无效。
3. 📁 文件依赖(插件文件容易丢失或未加载)
`.xla` 或 `.xlsm` 文件必须随时可用,否则函数失效。
---
❗C/Excel-DNA 实现的 UDF 特有的缺点
1. 🔌 需要加载 `.xll` 插件(用户要手动或自动添加)
尽管可以“拷贝即用”,但仍需要加载操作,略麻烦;
用户卸载或重装 Excel 时,插件需要重新加载。
2. ❌ 不支持跨平台(Windows Only)
Excel-DNA 插件 只能在 Windows Excel 桌面版使用;
Mac Excel、Excel Online 不支持 `.xll` 插件。
3. ⚠️ Excel 安全设置限制 `.xll` 插件运行
用户机器如果设置了较高的加载项安全等级,插件可能被阻止运行。
---
✅ 使用建议
| 场景 | 是否推荐使用 UDF |
| ---------------- | --------------------- |
| 简单重复的逻辑计算 | ✅ 可使用 VBA 或 Excel-DNA |
| 大规模数据处理、性能关键 | ❌ 推荐用 Power Query 或插件 |
| 跨平台支持(Mac/Web) | ❌ 不适合用 UDF |
| 引入复杂库(如 C 数学库) | ✅ 推荐用 Excel-DNA |
| 和其他系统交互(API、数据库) | ❌ 推荐单独用 C 做插件或工具 |