当用户减少一个单元格的值时寻求解决方案,另一个单元格(不同的列)将增加相同的值

时间:2018-07-11 13:08:43

标签: excel vba excel-vba

示例:

Column A = 1
Column B = 0

[用户将Column A的值更改为0]

新值:

Column A = 0
Column B = 1

3 个答案:

答案 0 :(得分:2)

以下是 A B 列的示例。将此事件宏插入工作表代码区域:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim A As Range, OldValue As Variant, NewValue As Variant, Delta As Variant
    Set A = Range("A:A")
    If Intersect(Target, A) Is Nothing Then Exit Sub
    If Target.Count > 1 Then Exit Sub

    Application.EnableEvents = False
        NewValue = Target.Value
        Application.Undo
        OldValue = Target.Value     'capture previous value
        Target.Value = NewValue    'restore new value
        If NewValue < OldValue Then
            Delta = OldValue - NewValue
            Target.Offset(0, 1).Value = Target.Offset(0, 1).Value + Delta
        End If
    Application.EnableEvents = True
End Sub

如果通过用户操作减小了 A 列中的值,则 B 列(相邻单元格中)中的值将增加同样的数量。

如果 A 列中的值增加,则不会采取任何措施。如果同时更改 A 列中的多个单元格,则不会采取任何措施。

答案 1 :(得分:0)

我有点不喜欢您未付出任何努力来解决您的问题,但是考虑到这是一个很有趣的话题,我为自己准备了一种不错的“实践作业”形式。

此代码产生预期的结果:

Dim oldval As Long
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Dim ws As Worksheet: Set ws = Sheets("Sheet1")
   If Not Intersect(Target, ws.Range("A1:A" & Rows.Count)) Is Nothing Then
        If IsNumeric(Target.Value2) Then
            oldval = Target.Value2
        Else
            oldval = 0
        End If
   End If

End Sub

第一个过程用于存储更改前的原始值^

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A1:A" & Rows.Count)) Is Nothing Then
        Target.Offset(0, 1).Value2 = oldval - Target.Value2
    End If
End Sub

更改后,在B列中显示差异^

  

输入数据:

enter image description here

  

根据A列(预期结果)

enter image description here

答案 2 :(得分:0)

我有这个,它将在workbook_open的A和B列上加和,然后在A或B更改值时使用它。

这应该转到ThisWorkbook代码区域:

Private Sub Workbook_Open()
Dim i As Integer
For i = 1 To Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
Sheets("Sheet1").Range("C" & i) = Sheets("Sheet1").Range("A" & i) + Sheets("Sheet1").Range("B" & i)
Next i

End Sub

这应该到达工作表代码区域:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
    Cells(Target.Row, 2) = Cells(Target.Row, 3) - Cells(Target.Row, 1)
    End
End If
If Target.Column = 2 Then
    Cells(Target.Row, 1) = Cells(Target.Row, 3) - Cells(Target.Row, 2)
    End
End If
End Sub