我正在使用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,如果有办法直接遍历单元格,我甚至不需要数组。
答案 0 :(得分:0)
要在UDF中获取值数组,您可以将匹配参数的类型设置为double[]
以获取简单列表,double[,]
表示2D范围或{{1}如果你期待的不仅仅是数字。
所以你的函数签名可能是:
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];
}
获取数组中的项目数。f.Length
和f.GetLength(0)
获得二维中的项目数。