2015-01-19 9 views
7

enden Ich habe ein Problem mit Visual Basic. Ich möchte ein Makro/eine Funktion machen, die eine Zahl multipliziert, die ich durch 3 eingegeben habe, und ein Ergebnis in derselben Zelle geben. Ich habe versucht, so etwas wie diese:Wie endlose "Change" Schleife in VBA

Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$Q$21" Then 
     Target.Value = Target.Value * 3 
    End If 
End Sub 

, aber es funktioniert nicht - ich bin immer Ergebnisse wie „xE25“, weil es die Multiplikation hält.

Ich möchte es nach der ersten Iteration oder nur funktionieren, wenn ich "Enter" nicht bei jeder Änderung in der Zelle drücken.
Es ist ziemlich einfach, ein Ergebnis in andere Zelle zu setzen, aber das ist nicht mein Punkt.


----- Edit:
I edited "If" Zeile:
If (Target.Column = 5 Or Target.Column = 11 Or Target.Column = 17 Or Target.Column = 23) And (Target.Row >= 19 And Target.Row <= 24) And Target.Value <> "" Then
so wäre es auf alle Zellen zu arbeiten, die ich brauche. Danach ist die beste Lösung die Art und Weise, die von @ Chrismas007 angegeben wird, da es keinen Fehler verursacht, wenn versucht wird, Daten in wenigen Zellen gleichzeitig zu löschen.

+1

wenn IsVBA Oder IsExcel-vba IsNot Then (vb.net) – Plutonix

+0

Leider = True, ich bin in dieser Sprache neu, nicht weiß was zu wählen: P – Pawel

Antwort

5

Mit Fehlerbehandlung .EnableEvents, um sicherzustellen, geht zurück auf True:

Sub Worksheet_Change(ByVal Target As Range) 
    On Error GoTo CleanExit 
    If Target.Address = "$Q$21" Then 
     Application.EnableEvents = False 
     Target.Value = Target.Value * 3 
    End If 
CleanExit: 
    Application.EnableEvents = True 
    On Error GoTo 0 
End Sub 
6

Wenn ein Worksheet_Change Ereignis Makro einen Wert ändert, müssen Sie Application.EnableEvents-falsch oder Risiko ein anderes Ereignis ausgelöst wird und mit der Makro-Lauf auf sich selbst setzen.

Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$Q$21" Then 
     Application.EnableEvents = False 
     Target.Value = Target.Value * 3 
     Application.EnableEvents = True 
    End If 
End Sub 

Während ich in der Regel eine gewisse Fehlerkontrolle, um sich bringen würde, dass die .EnableEvents immer wahr zurückgesetzt wurde, begann die oben erhalten, sollten Sie.

2

Sie müssen Ereignisse deaktivieren Rekursion zu vermeiden:

Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$Q$21" Then 
     application.enableevents = false 
     Target.Value = Target.Value * 3 
     application.enableevents = true 
    End If 
End Sub 

nur als Alternative, können Sie auch nicht Ihre eigene Variable verwenden als mit EnableEvents bastelt, obwohl es Ihr Code reagiert zweimal bedeuten wird, obwohl es doesn ‚t tut eigentlich alles beim zweiten Mal: ​​

Dim bSkipEvents as Boolean 
    Sub Worksheet_Change(ByVal Target As Range) 
     If bSkipEvents then exit sub 
     If Target.Address = "$Q$21" Then 
      bSkipEvents = True 
      Target.Value = Target.Value * 3 
      bSkipEvents = False 
     End If 
    End Sub 

Dies ist auch die Art von Ansatz, den Sie brauchen, um mit Benutzerformularen und die meisten Veranstaltungen für ActiveX-Steuerelemente in Arbeitsblatt.

+0

Ein paar Sekunden zu langsam @Rory ... – Chrismas007

+1

@ Chrismas007 Soweit ich sehen kann, war ich zuerst ...;) – Rory

+0

nein: http://imgur.com/fEfwg41 – Chrismas007