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

时间:2015-12-08 08:34:35

标签: arrays excel

假设我们得到一个总和为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的元素。

2 个答案:

答案 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)

udf_vector_elements

根据需要填写。