如果某些值发生变化,计算数组的固定和

假设我们得到一个向量,其总和为1.假设值高于n,我们将这些值最大化为n,并且我们希望使剩下的数字等于1再次等于1。 即其他值需要(潜在地)增加。 其他值必须均匀增加(以相同的因子)

在Excel中有一个简单的方法来做到这一点?

Ex. let n = 0.25 0.077331613 0.077331613 0.237037801 0.237037801 0.341441747 0.25 0.336289699 0.25 0.007899139 0.007899139 

第二个向量不加和为1,我们需要确保它不会改变值为0.25的元素。

不知道我同意所需的公式是“长”,“复杂”,也不是“计算密集型”:-)。

假设你的原始值在A2:A6中,并且在C1中select了n,例如0.25,那么在B2中:

=IF(A2>=C$1,C$1,A2*(1-C$1*COUNTIF(A$2:A$6,">="&C$1))/SUMIF(A$2:A$6,"<"&C$1))

复制到B6。

问候

我正在研究这个UDF,而另一个答案被接受,所以我会在这里发布它为这个线程的未来的观众。

点击Alt + F11然后Alt + I,M并将以下内容粘贴到模块代码表中。 点击Alt + Q返回到您的工作表。

 Function udf_vector_elements(rng As Range, elm As Long, n As Double, ttl As Double) Dim dTTL As Double Dim v As Long, vELMs As Variant Dim awf As WorksheetFunction Dim iSAFETY As Long, iLESS As Long, dFUDGE As Double Set awf = Application.WorksheetFunction ReDim vELMs(1 To rng.Cells.Count) 'safety for not enough elements × n < ttl If rng.Cells.Count * n < ttl Then udf_vector_elements = "never enough" Exit Function End If 'seed the solution array For v = LBound(vELMs) To UBound(vELMs) If rng.Cells(v).Value2 < n Then vELMs(v) = rng.Cells(v).Value2 iLESS = iLESS + 1 Else vELMs(v) = n End If Next v 'safety for sum(elements) > ttl If awf.Sum(vELMs) > ttl Then udf_vector_elements = "already too much" Exit Function End If 'get to work Do While Round(awf.Sum(vELMs), 6) < ttl dFUDGE = (ttl - Round(awf.Sum(vELMs), 6)) / iLESS iLESS = 0 For v = LBound(vELMs) To UBound(vELMs) vELMs(v) = Round(awf.Min(vELMs(v) + dFUDGE, n), 6) iLESS = iLESS - (vELMs(v) <> n) Next v Loop 'debug.print dTTL = awf.Sum(vELMs) Set awf = Nothing 'return the individual adjusted vector array element udf_vector_elements = vELMs(elm) End Function 

用作任何其他本地工作表函数。

= udf_vector_elements( <vector_values>,<element_returned>,<max_n>,<target_total>

在C2中的下图中,

 =udf_vector_elements(A$2:A$6, ROW(1:1), E$1, 1) 

udf_vector_elements

根据需要填写。