2017-10-20 71 views
0

有一点问题,需要您帮助更新我的VBA代码。VBA如何使用两列之间的工作表变更事件

我有两列,第一列显示%第二和第二列是一个数字。单元需要根据用户输入重新计算,这就是为什么我在工作表变更(下面的代码)上使用了一个事件。我设法做的是在第一列中更改%时修改第二列。

现在我想知道我怎么可能(如果可能给出的情况下),修改它,以便如果用户更改第一列中的%重新计算第二(我有)或如果用户改变第二列,它会在第一次重新计算%,而不会一遍又一遍地重新触发它自己。

这就是我所拥有的。任何帮助赞赏。

列1为 “P” 和第2列是 “Q”

Private Sub Worksheet_Change(ByVal Target As Range) 

Application.Calculation = xlCalculationAutomatic 

Dim WsCY As Worksheet, WsM As Worksheet 
Dim CVal As String 
Dim Found As Range 

'Sheets I'm working with 
Set WsCY = ThisWorkbook.Worksheets("Current Year Data") 
Set WsM = ThisWorkbook.Worksheets("Main") 
'Value used to search for the base value on which the % from 1st column is applied 
CVal = WsM.Range("C10") 
Set Found = WsCY.Columns("B").Find(what:=CVal, LookIn:=xlValues, lookat:=xlWhole) 

If Target.Address = WsM.Range("P13").Address Then 
    WsM.Range("Q13").Value = WsM.Range("P13").Value * WsCY.Range("AB" & Found.Row) + WsCY.Range("G" & Found.Row) 
ElseIf Target.Address = WsM.Range("P15").Address Then 
    WsM.Range("Q15").Value = WsM.Range("P15").Value * WsCY.Range("AC" & Found.Row) + WsCY.Range("H" & Found.Row) 
ElseIf Target.Address = WsM.Range("P17").Address Then 
    WsM.Range("Q17").Value = WsM.Range("P17").Value * WsCY.Range("AD" & Found.Row) + WsCY.Range("I" & Found.Row) 
ElseIf Target.Address = WsM.Range("P21").Address Then 
    WsM.Range("Q21").Value = WsM.Range("P21").Value * WsCY.Range("AE" & Found.Row) + WsCY.Range("J" & Found.Row) 
ElseIf Target.Address = WsM.Range("P23").Address Then 
    WsM.Range("Q23").Value = WsM.Range("P23").Value * WsCY.Range("AF" & Found.Row) + WsCY.Range("K" & Found.Row) 
ElseIf Target.Address = WsM.Range("P25").Address Then 
    WsM.Range("Q25").Value = WsM.Range("P25").Value * WsCY.Range("AG" & Found.Row) + WsCY.Range("L" & Found.Row) 
Else 
End If 

End Sub 

的我需要什么示例2:

Private Sub Worksheet_Change(ByVal Target As Range) 

Application.Calculation = xlCalculationAutomatic 
Application.EnableEvents = False 

If Target.Address = WsM.Range("P1").Address Then 
    WsM.Range("Q1").Value = WsM.Range("P1").Value * 100 
ElseIf Target.Address = WsM.Range("Q1").Address Then 
    WsM.Range("P1").Value = WsM.Range("Q1").Value/100 - 1 
Else 
End If 

Application.EnableEvents = True 

End Sub 

回答

0

你应该在开始和结束时关闭事件您的更改事件过程:

Application.EnableEvents = False 
... 
Application.EnableEvents = True 
+0

不太确定您的意思。我做了第二个例子,并尝试了一下,但没有做任何事情。我如何使用Application.EnableEvents基本上停止它,一旦进行更改? –

相关问题