Как пройти через ряд ячеек в Excel, используя Excel-DNA для построения UDF? - PullRequest
0 голосов
/ 29 апреля 2018

Я строю UDF, используя C # и Excel-DNA. Тем не менее, я попал в кирпичную стену, когда пытался зациклить, хотя диапазон ячеек, который является одним из параметров 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 голосов
/ 29 апреля 2018

Чтобы получить массив значений в UDF, вы должны установить тип соответствующего параметра на double[] для простого списка, double[,] для 2D-диапазона или, возможно, 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 #.
...