如何使用Excel-DNA在Excel中循环遍历一系列单元格来构建UDF?

时间:2018-04-29 18:50:26

标签: c# excel excel-vba vsto excel-dna vba

我正在使用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,如果有办法直接遍历单元格,我甚至不需要数组。

1 个答案:

答案 0 :(得分:0)

要在UDF中获取值数组,您可以将匹配参数的类型设置为double[]以获取简单列表,double[,]表示2D范围或{{1}如果你期待的不仅仅是数字。

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

object[,]

您可以使用包含以下代码的项目:

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