首页 > 解决方案 > 如何使用 Excel-DNA 循环遍历 Excel 中的一系列单元格来构建 UDF?

问题描述

我正在使用 C# 和 Excel-DNA 构建 UDF。但是,当我尝试循环遍历作为 UDF 参数之一的单元格范围时,我遇到了障碍。我的第一次尝试是在 C# 中将该范围的单元格转换为一个数组,但我不知道如何使用 Excel-DNA 来实现。我正在使用以下 VBA 代码来构建我的 C# 代码。

Function my_UDF(stk, F)

Dim i As Integer
z = stk
k = 0
i = 1
sum_if = 0
count_if = 0

Do Until i = 30
    'If F(i) > 0 Then
           If z >= F(i) Then
                z = z - F(i)
                If F(i) > 0 Then
                    k = k + 1
                    sum_if = sum_if + F(i)
                    count_if = count_if + 1
                End If
            Else
                k = k + (z / F(i))
                z = 0
            End If
    i = i + 1
Loop
If z > 0 Then k = k + (z / (sum_if / count_if))
my_UDF = k

End Function

在 C# 中,我试图用这样的东西来:

using ExcelDna.Integration;


namespace my_project
{
    public class my_UDF_class
    {
        [ExcelFunction(Name = "my_UDF_function")]
        public static double my_UDF_function(double stk, double f)
        {

            // transform range of cells into array?

            int i = 1;
            double c = 0;
            double sum_f = 0;
            double count_f = 0;

            while (i > 30)
            {
                if (stk >= f(i))
                {
                    stk = stk - f(i);

                    if (f(i) > 0)
                    {
                        c = c + 1;
                        sum_f = sum_f + f(i);
                        count_f = count_f + 1;
                    }
                }
                else
                {
                    c = c + (stk / f(i));
                    stk = 0;
                }
                i++;
            }

            if (stk > 0)
            {
                c = c + (stk / (sum_f / count_f));
            }
            return c;
        }
    }
}

Perharps,如果有办法直接遍历单元格,我什至不需要数组。

标签: c#excelvstoexcel-dnavba

解决方案


要在 UDF 中获取值数组,您需要将匹配参数的类型设置double[]为简单列表、double[,]二维范围或object[,]如果您期望的不仅仅是数字。

所以你的函数签名可能是:

public static double my_UDF_function(double stk, double[] f)

您可能会使用带有如下代码的项目:

double total = 0;
for (int i = 0; i < f.Length; i++)
{
    total = total + f[i];
}
  • 请注意,C# 中的数组是从 0 开始的。
  • 您可以使用 获取数组中的项目数f.Length
  • f.GetLength(0)对于二维数组,您可以使用和获得二维中的项目数g.GetLength(1)
  • 您也可以使用 VB.NET 而不是 C# 来完成所有这些工作。

推荐阅读