2015-01-19 14 views
7

Ho un problema con Visual Basic. Voglio fare una macro/funzione che moltiplicherà un numero che inserisco per 3 e dare un risultato nella stessa cella. Ho provato qualcosa di simile:Come terminare il ciclo infinito di "modifica" in VBA

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

ma non funziona - sto ottenendo risultati come "xE25" perché continua a moltiplicarsi.

Mi piacerebbe fermarsi dopo la prima iterazione o lavorare solo quando premo "invio" non ad ogni cambio nella cella.
È abbastanza semplice inserire un risultato in una cella diversa, ma non è il mio punto.


----- Edit:
Ho modificato "se" linea a:
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
quindi sarebbe lavorare su tutte le cellule di cui ho bisogno. Dopodiché, la soluzione migliore è data da @ Chrismas007, poiché non richiede un errore quando si tenta di cancellare i dati in poche celle contemporaneamente.

+1

se IsVBA O IsExcel-VBA Poi IsNot (vb.net) = TRUE – Plutonix

+0

Scusate, sono nuovo di questo linguaggio, no so cosa scegliere: P – Pawel

risposta

5

Con la gestione per garantire .EnableEvents errore risale al 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

Quando una macro Worksheet_Change evento cambia un valore, è necessario impostare Application.EnableEvents-falso o rischiano di innescare un altro evento e avere la corsa macro su se stesso.

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 

Mentre io di solito comportano un certo controllo degli errori in modo che il .EnableEvents era sempre ripristinate vero, quanto sopra dovrebbe iniziare.

2

è necessario disabilitare gli eventi per impedire ricorsione:

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 

Proprio in alternativa, è anche possibile utilizzare il proprio variabile piuttosto che armeggiare con EnableEvents, anche se significherà il codice risponde due volte anche se doesn 't in realtà fare nulla la seconda volta:

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 

Questo è anche il tipo di approccio avete bisogno con i form e maggior parte degli eventi per i controlli ActiveX su fogli di lavoro.

+0

Pochi secondi troppo lenti @Rory ... – Chrismas007

+1

@ Chrismas007 Per quanto posso vedere, sono stato il primo ...;) – Rory

+0

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

Problemi correlati