将值分配给excel中的单元格,使其总和为常量

时间:2017-02-01 23:03:20

标签: excel

有没有办法在excel中的5个单元格中分配值,使得5个单元格的总和恰好为100?

我开始为每个单元格分配一个值20。但是如果我指定其中一个值为30

,我希望单元格更改值

2 个答案:

答案 0 :(得分:2)

如果您希望能够更改任何5个细胞,并重新计算其他细胞,则需要复杂的论坛,具体取决于细胞位置和周围细胞。

您可以确定其他4个单元格与100之间的差异,然后将这些差异平均分配给其他4个单元格。当然,当您手动更改一个单元格时,您将清除它的论坛,因此它只能运行一次。

要使其永久化,您需要一个VBA脚本来监视一系列单元格并为您进行调整。

如果您对只有一个单元格动态变化以保持平衡感到满意,那么它就更简单了。您可以将该单元格减去100减去其他4个单元格的总和。

答案 1 :(得分:1)

如果你的5个单元格在第1行到第5行,我会使用以下 Worksheet_Change 事件来跟踪值,总是加起来为100。

示例:

初始数据集:

enter image description here

字段A3中的值更改为78后的解决方案:

enter image description here

请注意,代码将粘贴到您正在跟踪数字的工作表的对象中。

Sub Worksheet_Change(ByVal Target As Range)

Dim averageRound As Variant, averageRound1 As Variant

    If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
    Application.EnableEvents = False

    averageRound = Application.WorksheetFunction.Round((100 - Application.Sum(Range(Cells(1, Target.Column), Cells(5, Target.Column)))) / 4, 0)


        If ((100 - Application.Sum(Range(Cells(1, Target.Column), Cells(5, Target.Column)))) + averageRound * 4) <> 100 Then
            averageRound1 = (100 - Application.Sum(Range(Cells(1, Target.Column), Cells(5, Target.Column)))) - averageRound * 3
        Else
            averageRound1 = averageRound
        End If

    If IsNumeric(Target) Then
        If Application.Sum(Range(Cells(1, Target.Column), Cells(5, Target.Column))) <> 100 Then

            If Target.Row = 1 Then
                Cells(Target.Row + 1, Target.Column).Value = Cells(Target.Row + 1, Target.Column).Value + averageRound
                Cells(Target.Row + 2, Target.Column).Value = Cells(Target.Row + 2, Target.Column).Value + averageRound
                Cells(Target.Row + 3, Target.Column).Value = Cells(Target.Row + 3, Target.Column).Value + averageRound
                Cells(Target.Row + 4, Target.Column).Value = Cells(Target.Row + 4, Target.Column).Value + averageRound1
            ElseIf Target.Row = 2 Then
                Cells(Target.Row - 1, Target.Column).Value = Cells(Target.Row - 1, Target.Column).Value + averageRound
                Cells(Target.Row + 1, Target.Column).Value = Cells(Target.Row + 1, Target.Column).Value + averageRound
                Cells(Target.Row + 2, Target.Column).Value = Cells(Target.Row + 2, Target.Column).Value + averageRound1
                Cells(Target.Row + 3, Target.Column).Value = Cells(Target.Row + 3, Target.Column).Value + averageRound
            ElseIf Target.Row = 3 Then
                Cells(Target.Row - 2, Target.Column).Value = Cells(Target.Row - 2, Target.Column).Value + averageRound
                Cells(Target.Row - 1, Target.Column).Value = Cells(Target.Row - 1, Target.Column).Value + averageRound1
                Cells(Target.Row + 1, Target.Column).Value = Cells(Target.Row + 1, Target.Column).Value + averageRound
                Cells(Target.Row + 2, Target.Column).Value = Cells(Target.Row + 2, Target.Column).Value + averageRound
            ElseIf Target.Row = 4 Then
                Cells(Target.Row - 3, Target.Column).Value = Cells(Target.Row - 3, Target.Column).Value + averageRound
                Cells(Target.Row - 2, Target.Column).Value = Cells(Target.Row - 2, Target.Column).Value + averageRound
                Cells(Target.Row - 1, Target.Column).Value = Cells(Target.Row - 1, Target.Column).Value + averageRound1
                Cells(Target.Row + 1, Target.Column).Value = Cells(Target.Row + 1, Target.Column).Value + averageRound
            ElseIf Target.Row = 5 Then
                Cells(Target.Row - 1, Target.Column).Value = Cells(Target.Row - 1, Target.Column).Value + averageRound
                Cells(Target.Row - 2, Target.Column).Value = Cells(Target.Row - 2, Target.Column).Value + averageRound
                Cells(Target.Row - 3, Target.Column).Value = Cells(Target.Row - 3, Target.Column).Value + averageRound
                Cells(Target.Row - 4, Target.Column).Value = Cells(Target.Row - 4, Target.Column).Value + averageRound1
            End If

        End If
    End If

    Application.EnableEvents = True

End Sub