c# - 如何使用 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,如果有办法直接遍历单元格,我什至不需要数组。
解决方案
要在 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# 来完成所有这些工作。
推荐阅读
- javascript - 如何使用卡片触发点击事件?
- angular - 使用 compodoc 的 Angular 项目文档
- jquery - 如何限制从 MVC 中的模型填充的数据?
- azure-keyvault - 可访问多个密钥保管库的 Azure Web 应用
- javascript - 无法在我的组件中调用 redux 操作
- perl - 为什么这个 Perl foreach 循环只执行一次?
- python - 在 Python2 中编写二进制访问流数据以在 Fortran 中读取
- angular - 错误:Angular 2 中的 BehaviorSubject
- ios - 根据日期对数组进行排序/过滤到字典
- php - 当并行处理的队列不多时,如何保持它的敏捷?