2017-10-20 6 views
0

Vous avez un petit problème et vous avez besoin de votre aide pour mettre à jour mon code VBA.VBA Comment utiliser les événements sur le changement de feuille de calcul interconnectés entre deux colonnes

J'ai deux colonnes, la première colonne affichant% de la 2e et la 2e colonne étant un nombre. Les cellules doivent être recalculées en fonction des entrées de l'utilisateur, c'est pourquoi j'ai utilisé un événement sur la feuille de calcul (code ci-dessous). Ce que j'ai réussi à faire est d'avoir la 2ème colonne modifiée chaque fois que vous changez le% dans le 1er.

Maintenant je voudrais savoir comment je pourrais (si possible donné le cas), le modifier de sorte que si l'utilisateur change le% dans la 1ère colonne il recalcule le 2ème (que j'ai) OU si l'utilisateur change la 2ème colonne il recalculerait le% dans le 1er, tout le temps sans se redéclencher encore et encore.

C'est ce que j'ai. Toute aide appréciée.

Colonne 1 étant "P" et la colonne 2 étant "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ème exemple de ce que je avais besoin:

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 

Répondre

0

vous devez désactiver les événements au début et à la fin de votre procédure événementielle Change:

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

Vous ne savez pas exactement ce que vous vouliez dire par là. J'ai inventé un deuxième exemple et l'ai essayé mais je ne fais rien. Comment est-ce que j'utiliserais le Application.EnableEvents pour l'arrêter fondamentalement une fois qu'un changement est fait? –