2016-10-13 91 views
1

我有三个细胞,而这些都是以下列方式相互依赖:Excel的VBA,Worksheet.Change 3个细胞

如果我知道他们两个人的价值,那么我可以计算出剩下的一个值。换句话说,如果我的三个单元格为A1,A2,A3,

  • 我可以从A1和A2计算在A3的值,
  • 我可以从A1和A3,
  • 计算A2中的价值
  • 我可以从A2和A3计算A1中的值。

我的目标是获得一个工作表中执行以下操作:

  • 如果我更改了A1和A2(以任意顺序)的值,然后在A3值计算,
  • 如果我改变A1和A3的值(以任何顺序),那么计算A2中的值,
  • 最后,如果我改变A2和A3中的值(以任何顺序),那么A1中的值是计算。

如果只有两个单元格,那么我会知道如何使用Worksheet.Change以获得类似的内容。同样,如果两个单元格中的值同时发生变化,那么我也会知道如何获得令人满意的结果。

但是,在我的情况下,更改是连续的,而不是同时发生,所以我不知道如何实现它,因为Worksheet.Change只适用于一个目标。

+0

我能想到的多种方式去采取行动。 (1)使用工作表更改事件来查看是否填充了两个单元格,从而允许您计算第三个单元格(2)当用户更改哪个单元格并始终计算基于第三个单元格的单元格时保留跟踪(具有某种时间戳)在最后改变的两个单元上(3)使用'userform'来代替。通过选项按钮,复选框和每个文本框上的多个事件,还有很多方法可以解决这个问题。所以,对我个人而言,这个问题其实有点太广泛而无法回答(就像现在这样)。 – Ralph

回答

4

你只需要跟踪你的三个细胞的变化状况,当两个都变了,像这样的

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 
+0

很棒的回答。我不知道[静态](https://msdn.microsoft.com/en-us/library/office/gg251620.aspx)的行为,或者可以在两个过程调用之间保留一个变量的值。 – Ralph

+0

不错!你应该添加'Case 7 TrackChange = 0'。如果你不这样做,你的代码将在所有3个单元格更改一次后停止工作。 – Jochen

+0

@乔臣好点,谢谢 –