更新5个值以将特定数字相加

时间:2017-02-02 00:45:02

标签: excel vba excel-vba

我的数据集如下所示,应始终等于100:

enter image description here

如果我更改其中一个值,我希望将其旁边的值调整为总和仍为100.不幸的是,当我更改任何值时,我的代码不会更新数字上方或下方的数字数字。此外,sub不会返回错误。有什么建议为什么会这样?

    Sub Worksheet_Change(ByVal Target As Range)

        If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
        If IsNumeric(Target) Then
            If Application.WorksheetFunction.Sum(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 + 100 - Application.Sum(Cells(1, Target.Column), Cells(5, Target.Column))
                Else
                    Cells(Target.Row + 1, Target.Column).Value = Cells(Target.Row + 1, Target.Column).Value + 100 - Application.Sum(Cells(1, Target.Column), Cells(5, Target.Column))
                End If

            End If
        End If
    End If

    End Sub

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

你有几个问题:

  1. 正如共产国际在评论中指出的那样,您的End IfIf不匹配。 (您可能打算将其用于单行If,但单行If不需要End If。)

  2. 您不会在代码运行时禁用发生的事件,这可能会导致在您从代码中启动其他更改时发生奇怪的事情。 (主要仅在首次设置值时才会出现问题。)

  3. 您的Sum函数仅在第1行和第5行添加数字。

  4. 您的代码的重构版本如下:

    Sub Worksheet_Change(ByVal Target As Range)
    
        If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
        Application.EnableEvents = False
        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 + 100 - Application.Sum(Range(Cells(1, Target.Column), Cells(5, Target.Column)))
                Else
                    Cells(Target.Row + 1, Target.Column).Value = Cells(Target.Row + 1, Target.Column).Value + 100 - Application.Sum(Range(Cells(1, Target.Column), Cells(5, Target.Column)))
                End If
    
            End If
        End If
        Application.EnableEvents = True
    End Sub