有没有办法在excel中的5个单元格中分配值,使得5个单元格的总和恰好为100?
我开始为每个单元格分配一个值20
。但是如果我指定其中一个值为30
答案 0 :(得分:2)
如果您希望能够更改任何5个细胞,并重新计算其他细胞,则需要复杂的论坛,具体取决于细胞位置和周围细胞。
您可以确定其他4个单元格与100之间的差异,然后将这些差异平均分配给其他4个单元格。当然,当您手动更改一个单元格时,您将清除它的论坛,因此它只能运行一次。
要使其永久化,您需要一个VBA脚本来监视一系列单元格并为您进行调整。
如果您对只有一个单元格动态变化以保持平衡感到满意,那么它就更简单了。您可以将该单元格减去100减去其他4个单元格的总和。
答案 1 :(得分:1)
如果你的5个单元格在第1行到第5行,我会使用以下 Worksheet_Change 事件来跟踪值,总是加起来为100。
示例:强>
初始数据集:
字段A3中的值更改为78后的解决方案:
请注意,代码将粘贴到您正在跟踪数字的工作表的对象中。
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