C# 如何使用Excel DNA在Excel中的一系列单元格中循环构建UDF?

C# 如何使用Excel DNA在Excel中的一系列单元格中循环构建UDF?,c#,excel,vsto,excel-dna,vba,C#,Excel,Vsto,Excel Dna,Vba,我正在用C#和Excel DNA构建一个UDF。然而,当我尝试循环遍历作为UDF参数之一的单元格范围时,遇到了一个难题。我的第一次尝试是用C#将这一范围的细胞转换成一个数组,但我不知道如何使用Excel DNA。我正在使用下面的VBA代码来构建我的C#代码 在C#中,我试图用这样的方式: using ExcelDna.Integration; namespace my_project { public class my_UDF_class { [ExcelFu

我正在用C#和Excel DNA构建一个UDF。然而,当我尝试循环遍历作为UDF参数之一的单元格范围时,遇到了一个难题。我的第一次尝试是用C#将这一范围的细胞转换成一个数组,但我不知道如何使用Excel DNA。我正在使用下面的VBA代码来构建我的C#代码

在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;
        }
    }
}
double total = 0;
for (int i = 0; i < f.Length; i++)
{
    total = total + f[i];
}

Perharps,如果有一种直接循环单元格的方法,我甚至不需要数组。

要在您的UDF中获得一个值数组,您可以将匹配参数的类型设置为
double[]
,对于一个简单的列表,
double[,]
对于二维范围,或者如果您期望的不止是数字,则可以设置为
object[,]

因此,您的函数签名可能是:

public static double my_UDF_function(double stk, double[] f)
您可以将项目与以下代码一起使用:

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;
        }
    }
}
double total = 0;
for (int i = 0; i < f.Length; i++)
{
    total = total + f[i];
}
双倍合计=0;
对于(int i=0;i
  • 请注意,C#中的数组是基于0的
  • 您可以使用
    f.Length
    获取数组中的项数
  • 对于二维数组,您可以通过
    f.GetLength(0)
    g.GetLength(1)
    获得二维中的项数
  • 您也可以使用VB.NET而不是C#来完成所有这些