2015-01-19 17 views
7

Mam problem z wizualnym podstawowym. Chcę utworzyć makro/funkcję, która pomnoży liczbę wprowadzoną przez 3 i da wynik w tej samej komórce. Próbowałem coś takiego:Jak zakończyć nieskończoną pętlę "zmiany" w VBA

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

ale to nie działa - otrzymuję wyniki takie jak "xE25", ponieważ zachowuje pomnożenie.
Chciałbym, aby zatrzymał się po pierwszej iteracji lub pracy tylko wtedy, gdy naciskam "enter" nie z każdą zmianą w komórce.
Bardzo łatwo jest umieścić wynik w innej komórce, ale nie o to mi chodzi.


----- Edit:
I edycja "If" linia:
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
tak to działa na wszystkich komórkach, które muszę. Po tym najlepszym rozwiązaniem jest sposób podany przez @ Chrismas007, ponieważ nie monituje o błąd podczas próby usunięcia danych w kilku komórkach jednocześnie.

+1

jeśli IsVBA Albo IsExcel-vba Następnie IsNot (vb.net) = true – Plutonix

+0

Niestety, jestem nowy w tym języku, nie Wiesz, co wybrać: P – Pawel

Odpowiedz

5

z obsługą w celu zapewnienia .EnableEvents błędu sięga 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

Gdy makro Worksheet_Change wydarzenie zmienia wartość, trzeba ustawić Application.EnableEvents do fałszywe lub ryzyko wywołania innego zdarzenia i konieczności makro uruchamiane na szczycie siebie.

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 

Chociaż ja zwykle obejmują pewną kontrolę błędów w porządku, że .EnableEvents zawsze zresetowany do prawdziwej, powyższe powinno Ci zacząć.

2

trzeba wyłączyć zdarzenia w celu zapobieżenia rekurencji:

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 

tylko jako alternatywa, można również użyć własnej zmiennej zamiast majstrować przy EnableEvents, choć będzie to oznaczać kod odpowiada dwa razy, mimo że nie robi „t faktycznie nic zrobić po raz drugi okrągły:

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 

jest to także rodzaj podejścia trzeba z pakietowi i większości imprez dla formantów ActiveX w arkuszach.

+0

Kilka sekund za wolno @Rory ... – Chrismas007

+1

@ Chrismas007 O ile widzę, byłem pierwszy ...;) – Rory

+0

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