将长嵌套的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}
E28是0
我也一片一片地得到了其余部分的结果。 我只是需要指导如何把它放在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];