2016-10-13 92 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

@喬臣好點,謝謝 –