Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA,工作表。更改为3个单元格_Excel_Vba - Fatal编程技术网

Excel VBA,工作表。更改为3个单元格

Excel VBA,工作表。更改为3个单元格,excel,vba,Excel,Vba,我有三个单元,它们以如下方式相互依存: 如果我知道其中两个的值,那么我可以计算剩余一个的值。换句话说,如果我的三个单元格是A1,A2,A3 我可以根据A1和A2计算A3中的值 我可以根据A1和A3计算A2中的值 我可以用A2和A3计算A1的值 我的目标是获得一份完成以下工作的工作表: 如果我更改A1和A2中的值(以任何顺序),则计算A3中的值 如果我更改A1和A3中的值(以任何顺序),则计算A2中的值 最后,如果我改变A2和A3中的值(以任何顺序),那么A1中的值就会被计算出来 如果只有

我有三个单元,它们以如下方式相互依存:

如果我知道其中两个的值,那么我可以计算剩余一个的值。换句话说,如果我的三个单元格是A1,A2,A3

  • 我可以根据A1和A2计算A3中的值
  • 我可以根据A1和A3计算A2中的值
  • 我可以用A2和A3计算A1的值
我的目标是获得一份完成以下工作的工作表:

  • 如果我更改A1和A2中的值(以任何顺序),则计算A3中的值
  • 如果我更改A1和A3中的值(以任何顺序),则计算A2中的值
  • 最后,如果我改变A2和A3中的值(以任何顺序),那么A1中的值就会被计算出来
如果只有两个单元格,那么我就知道如何使用
工作表.Change
来获得类似的内容。同样,如果两个单元格中的值同时改变,那么我也知道如何获得令人满意的结果


但是,在我的例子中,更改是连续的,而不是同时进行的,因此我不知道如何实现它,因为
工作表。更改
只对一个目标有效。

您只需跟踪三个单元格的更改状态,并在两个单元格更改时采取行动,如下所示

Private Sub Worksheet_Change(ByVal Target As Range)
    Static TrackChange As Integer

    On Error GoTo EH
    If Not Application.Intersect(Target, Me.Cells(1, 1)) Is Nothing Then
        TrackChange = TrackChange Or 1 ' Set bit 0
    End If
    If Not Application.Intersect(Target, Me.Cells(2, 1)) Is Nothing Then
        TrackChange = TrackChange Or 2 ' Set bit 1
    End If
    If Not Application.Intersect(Target, Me.Cells(3, 1)) Is Nothing Then
        TrackChange = TrackChange Or 4 ' Set bit 2
    End If
    Debug.Print TrackChange
    Select Case TrackChange
        Case 3 ' A1, A2 changed
            Application.EnableEvents = False
            ' update A3
            Me.Cells(3, 1) = Me.Cells(1, 1) + Me.Cells(2, 1)
            TrackChange = 0
        Case 5 ' A1, A3 changed
            Application.EnableEvents = False
            ' update A2
            Me.Cells(2, 1) = Me.Cells(1, 1) + Me.Cells(3, 1)
            TrackChange = 0
        Case 6 ' A2, A3 changed
            Application.EnableEvents = False
            ' update A1
            Me.Cells(1, 1) = Me.Cells(2, 1) + Me.Cells(3, 1)
            TrackChange = 0
        Case 7 ' A1, A2, A3 changed
            TrackChange = 0
    End Select
EH:
    Application.EnableEvents = True
End Sub

您只需跟踪三个单元格的更改状态,并在两个单元格发生更改时采取行动,如下所示

Private Sub Worksheet_Change(ByVal Target As Range)
    Static TrackChange As Integer

    On Error GoTo EH
    If Not Application.Intersect(Target, Me.Cells(1, 1)) Is Nothing Then
        TrackChange = TrackChange Or 1 ' Set bit 0
    End If
    If Not Application.Intersect(Target, Me.Cells(2, 1)) Is Nothing Then
        TrackChange = TrackChange Or 2 ' Set bit 1
    End If
    If Not Application.Intersect(Target, Me.Cells(3, 1)) Is Nothing Then
        TrackChange = TrackChange Or 4 ' Set bit 2
    End If
    Debug.Print TrackChange
    Select Case TrackChange
        Case 3 ' A1, A2 changed
            Application.EnableEvents = False
            ' update A3
            Me.Cells(3, 1) = Me.Cells(1, 1) + Me.Cells(2, 1)
            TrackChange = 0
        Case 5 ' A1, A3 changed
            Application.EnableEvents = False
            ' update A2
            Me.Cells(2, 1) = Me.Cells(1, 1) + Me.Cells(3, 1)
            TrackChange = 0
        Case 6 ' A2, A3 changed
            Application.EnableEvents = False
            ' update A1
            Me.Cells(1, 1) = Me.Cells(2, 1) + Me.Cells(3, 1)
            TrackChange = 0
        Case 7 ' A1, A2, A3 changed
            TrackChange = 0
    End Select
EH:
    Application.EnableEvents = True
End Sub

我可以想出多种方法来解决这个问题。(1) 使用工作表更改事件查看两个单元格是否已填充,从而允许您计算第三个单元格(2)在用户更改哪个单元格时保持跟踪(带有某种时间戳),并始终基于最后更改的两个单元格计算第三个单元格(3)改为使用
userform
。通过选项按钮、复选框和每个文本框上的多个事件,还有许多方法可以实现这一点。所以,对我(个人)来说,这个问题实际上有点太宽泛了,无法回答(就目前而言)。我可以想出多种方法来解决这个问题。(1) 使用工作表更改事件查看两个单元格是否已填充,从而允许您计算第三个单元格(2)在用户更改哪个单元格时保持跟踪(带有某种时间戳),并始终基于最后更改的两个单元格计算第三个单元格(3)改为使用
userform
。通过选项按钮、复选框和每个文本框上的多个事件,还有许多方法可以实现这一点。所以,对我(个人)来说,这个问题实际上有点太宽泛了,无法回答(就目前的情况而言)。回答得很好。我不知道的行为,或是有可能保留一个变量的值之间的两个过程调用。好!您应该添加
案例7 TrackChange=0
。如果你不这样做,你的代码将停止工作后,改变所有3个单元格一次。伟大的答案。我不知道的行为,或是有可能保留一个变量的值之间的两个过程调用。好!您应该添加
案例7 TrackChange=0
。如果不这样做,则在更改所有3个单元格一次后,代码将停止工作。