Excel VBA,工作表。更改为3个单元格
我有三个单元,它们以如下方式相互依存: 如果我知道其中两个的值,那么我可以计算剩余一个的值。换句话说,如果我的三个单元格是A1,A2,A3Excel 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和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个单元格一次后,代码将停止工作。