[]
        
(Showing Draft Content)

LAMBDA 函数

LAMBDA 函数支持用户在 Excel 中创建自定义且可重复使用的函数,并为其指定易于识别的名称,这些函数可像内置的 Excel 函数一样在整个工作簿中调用和使用。

您可以将常用公式封装为自定义函数,写入 Excel 的名称管理器。使用时直接调用自定义名称,无需频繁复制粘贴,从而减少出错风险。LAMBDA 函数无需依赖 VBA、宏或 JavaScript,大幅提升公式的复用性和维护效率。

函数语法

LAMBDA 函数的语法为=LAMBDA([parameter1, parameter2, …,], calculation),参数如下:

参数

描述

参数

[可选] 您希望传递给函数的变量(如单元格引用、字符串或数字),最多可以输入 253 个参数。

计算

[必选] 实际执行并返回结果的公式。它必须是最后一个参数,并且有返回值。

以下示例演示如何在 GcExcel 中通过名称管理器自定义 LAMBDA 公式,实现批量将华氏度温度转换为摄氏度。

// 初始化工作薄。
var workbook = new GrapeCity.Documents.Excel.Workbook();
var sheet = workbook.Worksheets[0];

// 设置数据。
sheet.Range["B3:C11"].Value = new object[,] {
    { "Date","Fahrenheit" },
    { new DateTime(2025,6,1),95},
    { new DateTime(2025,6,2),95},
    { new DateTime(2025,6,3),96.8},
    { new DateTime(2025,6,4),86},
    { new DateTime(2025,6,5),82.4},
    { new DateTime(2025,6,6),89.6},
    { new DateTime(2025,6,7),86},
    { new DateTime(2025,6,8),87.8} };

ITable table = sheet.Tables.Add(sheet.Range["B3:C11"], true);
ITable table1 = sheet.Tables.Add(sheet.Range["E3:E11"], true);
sheet.Range["B3:B11"].NumberFormat = "yyyy-mm-dd";

table.ConvertToRange();
table1.ConvertToRange();

// 定义 LAMBDA 名称 ToCelsius,实现华氏温度转摄氏温度的公式。
workbook.Names.Add("ToCelsius", "=LAMBDA(temp, (5/9) * (temp-32))");

// 在 E4:E11 区域插入公式,计算 C 列的华氏度转换为摄氏度。
sheet.Range["E4:E11"].Formula2 = "ToCelsius(C4)";

sheet.Range["E3"].Value = "=ToCelsius(C4:C11)";
sheet.Range["B:E"].AutoFit();

// 保存 Excel 文件。
workbook.Save("LAMBDAToCelsius.xlsx");

结果如下图所示:

image

Formula2 支持设置动态数组函数和最新 Excel 公式功能的公式,并且完全兼容Formula的用法。

LAMBDA 函数通过添加自定义名称,支持在其定义中引用自身,从而实现递归计算。在 GcExcel 中, LAMBDA 的最大递归深度为 256 层。以下示例演示如何在 GcExcel 中通过名称管理器自定义 LAMBDA 函数,实现数字的阶乘。

// 初始化工作薄。
var workbook = new Workbook();
var sheet = workbook.Worksheets[0];
sheet.Name = "FactorialLambda";

// 设置数据。
sheet.Range["A1"].Value = "n";
sheet.Range["A2"].Value = 1;
sheet.Range["A3"].Value = 2;
sheet.Range["A4"].Value = 3;
sheet.Range["A5"].Value = 4;
sheet.Range["A6"].Value = 5;
sheet.Range["A7"].Value = 6;

sheet.Columns[1].ColumnWidth = 10;
sheet.Columns[0].HorizontalAlignment = HorizontalAlignment.Right;
sheet.Columns[1].HorizontalAlignment = HorizontalAlignment.Right;
sheet.Range["A1:B1"].Font.Bold = true;

// 定义自定义名称 Factorial,实现数字的阶乘。
workbook.Names.Add("Factorial", "=LAMBDA(n, IF(n<=1, 1, n*Factorial(n-1)))");
sheet.Range["B1"].Value = "=Factorial(A2:A7)";

// 在 B2:B7 区域插入公式,计算A列数字的阶乘。
sheet.Range["B2:B7"].Formula2 = "Factorial(A2)";

sheet.Columns[1].AutoFit();

// 保存 Excel 文件。
workbook.Save("LAMBDAFactorial.xlsx");

结果如下图所示:

image

您可以在不同的工作表甚至不同的工作簿中引用某个工作表上定义的自定义名称。以下示例演示在一个工作表中添加自定义名称后,如何在另一个工作表的公式中引用它。

// 初始化工作薄。
var workbook = new Workbook();
var sheet1 = workbook.Worksheets[0];

// 在Sheet1上定义名称"Test",其内容为ABS函数。
sheet1.Names.Add("Test", "ABS");

// 添加第二个工作表。
var sheet2 = workbook.Worksheets.Add();

// 在Sheet2的B2单元格设置公式,跨表引用Sheet1上的自定义名称"Test"。
sheet2.Range["B2"].Formula2 = "=Sheet1!Test(-2)";
sheet2.Range["B1"].Formula2 = "=FORMULATEXT(B2)";
sheet2.Range["A1"].Value = "Formula Text:";
sheet2.Range["A2"].Value = "Formula Result:";
sheet2.Columns[1].AutoFit();
sheet2.Columns[0].AutoFit();
sheet2.Range["A1:A2"].Font.Bold = true;

// 保存 Excel 文件。
workbook.Save("LAMBDACrossWorbsheet.xlsx");

结果如下图所示:

image

注意:如果自定义名称与 Excel 内置函数同名(例如sheet.Names.Add("SUM", "ABS");),那么跨工作表直接引用=Sheet1!SUM(-2)会报错,此时需使用双括号强调引用自定义名称(例如 =((Sheet1!SUM))(-2)),以避免与内置函数冲突。

立即调用

LAMBDA 函数不仅可以被命名并重复使用,还支持在公式中“立即调用”。您可以在单元格公式中定义LAMBDA 函数后,立刻用实际参数调用它,从而快速实现一次性计算逻辑,无需通过名称管理器预先定义函数。在复杂公式或嵌套运算场景下,临时使用自定义函数可以提高运算的灵活性。

立即调用 LAMBDA 的基本语法为:=LAMBDA(参数1, 参数2, ..., 运算表达式)(参数值1, 参数值2, ...)。在定义 LAMBDA 函数后,直接在其后括号中传入参数即可立即执行。例如,将单元格公式设置为 =LAMBDA(x, x+1)(3),将立即返回结果 4。

Eta-reduced LAMBDA

Eta-reduced LAMBDA(Eta LAMBDA) 是对 LAMBDA 的一种语法简化,当 LAMBDA 仅用于直接传递参数时,可省略 LAMBDA 声明,​将函数名直接作为参数,传递给 BYROW、BYCOL、MAP、SCAN、MAKEARRAY、REDUCE、PIVOTBY、GROUPBY函数。

例如,在未引入 Eta LAMBDA 之前,将用于取绝对值的 LAMBDA 函数传入 BYROW 函数时,需要写作 =BYROW(A1:A10, LAMBDA(a, ABS(a))),支持 Eta LAMBDA 后,可简化为 =BYROW(A1:A10, ABS)

GcExcel 支持在自定义名称、LET 函数的 name_value 参数、LAMBDA 函数中使用 Eta LAMBDA,也支持在公式函数中引用自定义函数。

Eta LAMBDA 与普通 LAMBDA的语法对比

以下示例演示了Eta LAMBDA和普通LAMBDA在使用时的语法区别。

// 初始化工作薄。
var workbook = new GrapeCity.Documents.Excel.Workbook();

IWorksheet sheet1 = workbook.ActiveSheet;
sheet1.Name = "BYROW";

sheet1.Range["$B$2"].Value = "ETA LAMBDA VS Normal LAMBDA";
sheet1.Range["$B$2"].Font.Bold = true;

var table1 = sheet1.Tables.Add(sheet1.Range["$B$5:$E$10"], true);
table1.ConvertToRange();

// 设置数据。
var sheet1rngB5E10 = new object[,] {
    { "Student", "Math", "English", "Physics"},
    { "Tom", 19d, 23d, 19d},
    { "Jerry", 21d, 15d, 18d},
    { "Mario", 19d, 22d, 22d},
    { "Luigi", 17d, 15d, 23d},
    { "Galen", 16d, 22d, 24d}
};
var table2 = sheet1.Tables.Add(sheet1.Range["G5:G10"], true);
table2.ConvertToRange();

var table3 = sheet1.Tables.Add(sheet1.Range["G13:G18"], true);
table3.ConvertToRange();

sheet1.Range["$B$5:$E$10"].Value = sheet1rngB5E10;

// 将普通 LAMBDA 传入BYROW函数。
sheet1.Range["$G$4"].Value = "Normal LAMBDA";
sheet1.Range["$G$5"].Formula2 = "=FORMULATEXT(G6)";
sheet1.Range["$G$5"].Font.Color = Color.Black;
sheet1.Range["$G$5"].Interior.Color = Color.White;
sheet1.Range["$G$6"].Formula2 = "=BYROW(C6:E10,LAMBDA(row,SUM(row)))";

// 将 Eta LAMBDA 传入BYROW函数。
sheet1.Range["$G$12"].Value = "ETA LAMBDA";
sheet1.Range["$G$13"].Formula2 = "=FORMULATEXT(G14)";
sheet1.Range["$G$13"].Font.Color = Color.Black;
sheet1.Range["$G$13"].Interior.Color = Color.White;
sheet1.Range["$G$14"].Formula2 = "=BYROW(C6:E10,SUM)";

// 保存 Excel 文件。
workbook.Save("EtaLAMBDA.xlsx");

结果如下图所示:

image

在自定义名称中引用Eta LAMBDA

以下示例演示如何通过自定义名称 AliasOfSUM 引用 SUM。

// 初始化工作薄。
var workbook = new Workbook();
var sheet = workbook.Worksheets[0];

sheet.Range["A1"].Value = 10;
sheet.Range["A2"].Value = 20;
sheet.Range["A3"].Value = -5;
sheet.Range["A4"].Value = 0;
sheet.Range["A5"].Value = 20;

sheet.Range["C4"].Value = "Formula Text:";
sheet.Range["C5"].Value = "Formula Result:";
sheet.Range["C4:C5"].Font.Bold = true;
sheet.Columns[2].AutoFit();
sheet.Range["D5"].Interior.Color = Color.Yellow;

// 添加 FORMULATEXT 公式,显示D5中的公式文本。
sheet.Range["D4"].Formula2 = "=FORMULATEXT(D5)";

// 添加自定义名称 AliasOfSUM,其内容为SUM。
workbook.Names.Add("AliasOfSUM", "SUM");

// 在D5中使用自定义名称 AliasOfSUM 作为公式,等价于求A1到A5的和。
sheet.Range["D5"].Formula2 = "AliasOfSUM(A1:A5)";

// 保存 Excel 文件。
workbook.Save("EtaLAMBDAasDefinedName.xlsx");

结果如下图所示:

image

在 LAMBDA 函数中以参数形式传递Eta LAMBDA

以下示例演示如何将 SUM 作为参数传递给 LAMBDA 函数,实现对A1:A5区域求和。

// 初始化工作薄。
var workbook = new Workbook();
var sheet = workbook.Worksheets[0];

sheet.Range["A1"].Value = 10;
sheet.Range["A2"].Value = 20;
sheet.Range["A3"].Value = -5;
sheet.Range["A4"].Value = 0;
sheet.Range["A5"].Value = 20;
           
sheet.Range["C4"].Value = "Formula Text:";
sheet.Range["C5"].Value = "Formula Result:";
sheet.Range["C4:C5"].Font.Bold = true;
sheet.Columns[2].AutoFit();
sheet.Range["D5"].Interior.Color = Color.Yellow;

// B2添加 FORMULATEXT 公式,显示B1的公式文本。
sheet.Range["D4"].Formula2 = "=FORMULATEXT(D5)";

// 定义 LAMBDA 函数,将 SUM 和A1:A5区域作为参数传入,由 LAMBDA 函数对 SUM(A1:A5) 进行求和。
sheet.Range["D5"].Formula2 = "=LAMBDA(AliasOfSUM, range, AliasOfSUM(range))(SUM, A1:A5)";

// 保存 Excel 文件。
workbook.Save("EtaLAMBDAasArguments.xlsx");

结果如下图所示:

image

在 LET 函数的“name_value”参数中引用Eta LAMBDA

以下示例演示将 SUM 作为 LET 函数的“name_value”参数,实现对A1:A5区域求和。

// 初始化工作薄。
var workbook = new Workbook();
var sheet = workbook.Worksheets[0];

sheet.Range["A1"].Value = 10;
sheet.Range["A2"].Value = 20;
sheet.Range["A3"].Value = -5;
sheet.Range["A4"].Value = 0;
sheet.Range["A5"].Value = 20;
           
sheet.Range["C4"].Value = "Formula Text:";
sheet.Range["C5"].Value = "Formula Result:";
sheet.Range["C4:C5"].Font.Bold = true;
sheet.Columns[2].AutoFit();
sheet.Range["D5"].Interior.Color = Color.Yellow;

// 添加 FORMULATEXT 公式,显示B1的公式文本。
sheet.Range["D4"].Formula2 = "=FORMULATEXT(D5)";

// 将 SUM 作为 LET 函数的“name_value”参数,赋值给变量 AliasOfSUM,通过 AliasOfSUM(A1:A5) 实现 SUM(A1:A5) 的求和
// 等价于“=LAMBDA(AliasOfSUM, range, AliasOfSUM(range))(SUM, A1:A5)”。
sheet.Range["D5"].Formula2 = "=LET(AliasOfSUM, SUM, AliasOfSUM(A1:A5))";

// 保存 Excel 文件。
workbook.Save("EtaLAMBDAforLET.xlsx");

结果如下图所示:

image

将自定义函数作为 Eta LAMBDA 应用于公式函数

以下示例演示如何将自定义函数作为 Eta LAMBDA 传递给 MAP 函数的参数。

public class IsNegativeFunction : CustomFunction
{
    public IsNegativeFunction()
        : base("ISNEGATIVE", "Returns true if the value is negative.", FunctionValueType.Boolean, new[] {
new Parameter(FunctionValueType.Number)
        })
    {
    }
    public override object Evaluate(object[] arguments, ICalcContext context)
    {
        if (arguments != null && arguments.Length > 0 && arguments[0] != null)
        {
            if (double.TryParse(arguments[0].ToString(), out double value))
            {
                return value < 0;
            }
        }
        return false;
    }
}
// 初始化工作薄。
var workbook = new Workbook();
var sheet = workbook.Worksheets[0];

Workbook.AddCustomFunction(new IsNegativeFunction(), true);
object[,] values = new object[,]
{
    { 5, -3, 0 },
    { 23, -1, -4 },
    { -13, 0, -12 }
};

sheet.Range["A2:C4"].Value = values;
sheet.PageSetup.PrintHeadings = true;
sheet.PageSetup.PrintGridlines = true;
sheet.PageSetup.Orientation = PageOrientation.Landscape;
sheet.Range["A1"].Value = "The data to be checked for negative values:";
sheet.Range["A11"].Value = "Formula Text (A7):";
sheet.Range["A6"].Value = "Formula Result:";
sheet.Range["A1"].Font.Bold = true;
sheet.Range["A11"].Font.Bold = true;
sheet.Range["A6"].Font.Bold = true;
sheet.Range["A5:E5"].Merge();
sheet.Range["A10:E10"].Merge();

// 添加 FORMULATEXT 公式,显示A7的公式文本。
sheet.Range["C11"].Formula2 = "=FORMULATEXT(A7)";

// 将自定义函数 ISNEGATIVE 作为Eta Lambda函数传入MAP函数。
sheet.Range["A7"].Formula2 = "=MAP(A2:C4, ISNEGATIVE)";

// 保存 Excel 文件。
workbook.Save("CustomFuncasEtaLAMBDA.pdf");

结果如下图所示:

image

注意事项

  • 自定义名称可以与 Excel 内置函数同名(例如 workbook.Names.Add("SUM", "ABS");),当同名存在时:

    • SUM 内置函数的行为不会改变,例如 =SUM(-1) 的值仍然为-1。

    • 当 SUM 已被用作 Eta LAMBDA(例如 =BYROW(A1:A2, SUM) ),而后又被定义为自定义名称时(例如 workbook.Names.Add("SUM", "ABS"); ),那么作为 Eta LAMBDA 的 SUM 会自动添加 _xleta. 前缀,即=BYROW(A1:A2, _xleta.SUM)

    • 当 SUM 已被定义为自定义名称,而后又被用作 Eta LAMBDA,则 Eta LAMBDA 会被视为自定义名称 SUM。此时,先定义的自定义名称的优先级高于之后同名的 Eta LAMBDA。

    • 当 SUM 作为自定义名称被添加后,如果您想把 SUM 作为 Eta LAMBDA,则需要给作为 Eta LAMBDA 的 SUM 添加 _xleta. 前缀(例如 =BYROW(A1:A2, _xleta.SUM) )。

  • 内置函数先被用于Eta LAMBDA,而后又用作自定义名称导致同名冲突时,Eta LAMBDA 中对该内置函数的引用会自动添加 _xleta. 前缀,Eta LAMBDA的计算结果不变;而对于自定义函数,如果先在 Eta LAMBDA 中使用,之后再被定义为自定义名称,Eta LAMBDA 中的该名称不会自动添加前缀,而是直接被识别为自定义名称,公式含义以及计算结果可能因此改变。

  • LAMBDA 函数和 LET 函数本身不能作为 Eta LAMBDA 使用,否则会被当作普通名称处理。

  • 给单元格公式设置为 Eta LAMBDA(如 =SUM)时,会返回 #CALC! 错误。

  • 如果函数不支持以 LAMBDA 作为参数,却接收到了 Eta LAMBDA,会返回 #VALUE! 错误。例如:=SUM(SUM)