将长嵌套的Excel公式转换为c#

我的任务是将Excel VBA转换为基于Web的应用程序 。 我正在使用Web窗体 。 我坚持一个很长的Excel公式,但我已经把一半的长公式转换成C#

这是Excel公式:

 IF(AND(D7="u", H7/F7>1), 0, INDEX(Scoring!$O$8:$O$10, SUMPRODUCT(--(E28 <= Scoring!$N8:$N10),--(E28 >= Scoring!$N8:$N10), ROW(INDIRECT("'Scoring'!$M1:$M3")))) 

虽然这是我在C#方法上的进展。 我需要ELSE部分的帮助:

 IF (variable = "u" && ((CurrentValue / AcceptedValue) > 1)){ return 0; ELSE { // the INDEX clause on the Excel Formula } 

O8 – O10的值是{2, 1, 0} 2,1,0 {2, 1, 0}

N8 – N10的值是{1, 1.5, 9999999999}

E280

我也一片一片地得到了其余部分的结果。 我只是需要指导如何把它放在C#中

 =INDEX(Scoring!$O$8:$O$10, SUMPRODUCT({1,1,1}, {0,0,0}, 1)) 

double minus(--)使其返回0/1而不是真/假。 ROW(INDIRECT($M1-$M3))等于1

我可以使用一些帮助将Excel公式转换为C#代码。

下面是一些C#代码来复制你的公式的这一部分:

INDEX(Scoring!$O$8:$O$10, SUMPRODUCT(--(E28 <= Scoring!$N8:$N10),--(E28 >= Scoring!$N8:$N10), ROW(INDIRECT("'Scoring'!$M1:$M3")))

在代码中,我必须为ROW(INDIRECT("'Scoring'!$M1:$M3"))分配数组{1, 1, 1} ROW(INDIRECT("'Scoring'!$M1:$M3")) {1, 1, 1} 。 在SUMPRODUCT的行动中,您的问题存在一些不明确的地方。 根据support.office.com

将给定数组中的相应组件相乘,并返回这些产品的总和。

但是,这个问题中的一些细节让我觉得你正在想每个数组得到总结,然后这些结果相乘。 无论如何,请查看下面代码中的注释以遵循以下逻辑:

 // inputs double[] o8o10 = new double[] { 2, 1, 0 }; // Scoring!$O$8:$O$10 double[] n8n10 = new double[] { 1, 1.5, 9999999999 }; // Scoring!$N8:$N10 double e28 = 0; // E28 // entries to SUMPRODUCT List<int> test1 = new List<int>(); List<int> test2 = new List<int>(); Array.ForEach(n8n10, x => { test1.Add((e28 <= x) ? 0 : 1); }); Array.ForEach(n8n10, x => { test2.Add((e28 >= x) ? 0 : 1); }); // ROW(INDIRECT("'Scoring'!$M1:$M3")) should be an array ! List<int> test3 = new List<int> { 1, 1, 1 }; // evalue SUMPRODUCT int sumProductResult = 0; for (var i=0; i<test1.Count; i++) { sumProductResult += test1[i] * test2[i] * test3[i]; } // evalute INDEX double indexResult = 0; indexResult = o8o10[sumProductResult]; // output Console.WriteLine(indexResult); Console.ReadKey(); 

我的输出是2因为那是o8o10数组的第0个元素。 我们得到0的数组索引,因为

=SUMPRODUCT({1, 1, 1}, {0, 0, 0}, {1, 1, 1})

解决:

=SUM(1*0*1, 1*0*1, 1*0*1}

哪个给0

HTH

ROW(INDIRECT("'Scoring'!$M1:$M3"))实际上评估为{1; 2; 3} {1; 2; 3} {1; 2; 3}

--(E28 <= Scoring!$N8:$N10),--(E28 >= Scoring!$N8:$N10)--(E28 = Scoring!$N8:$N10)

所以SUMPRODUCT公式只是:

 (E28 = Scoring!$N8) * 1 + (E28 = Scoring!$N9) * 2 + (E28 = Scoring!$N10) * 3 

和在C#中:

 double[] n8n10 = { 1, 2, 3 }; double e28 = 2; double sumProduct = n8n10.Select((d, i) d == e28 ? i + 1 : 0).Sum(); 

但是 ! 因为Scoring!$O$8:$O$10只有3个单元,而SUMPRODUCT在理论上可以超过3个,INDEX SUMPRODUCT部分的实际目标似乎是这样的:

 double[] o8o10 = { 4, 5, 6 }, n8n10 = { 1, 2, 3 }; double e28 = 2, result = o8o10[0]; // INDEX(array, 0) results in array if (n8n10[1] == e28) result = o8o10[1]; else if (n8n10[2] == e28) result = o8o10[2];