假设我们得到一个总和为1的向量。假设如果值高于n,我们将这些值最大化为n值,并且我们想要使其余的数字再次使得和等于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的元素。
答案 0 :(得分:1)
不确定我同意所需的公式是“长”和“复杂”,也不是“计算密集”: - )。
假设您的原始值在A2:A6中,并且您选择的是n,例如: 0.25,在C1中,然后在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。
此致
答案 1 :(得分:0)
我正在研究这个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(&lt; vector_values&gt;,&lt; element_returned&gt;,&lt; max_n&gt;,&lt; target_total&gt; )
在C2中的下图中,
=udf_vector_elements(A$2:A$6, ROW(1:1), E$1, 1)
根据需要填写。