2010-12-29 19 views
13

Sono nuovo in VBA e voglio tornare da una funzione quando vedo un errore. Non è in grado di farlo. Qualche indicazione?VBA - Ritorno da una funzione in caso di errore

Function GetEditboxValue(control As IRibbonControl, text As String) As String 

    If Not IsMissing(text) Then 
     If Not IsNumeric(text) Then 
      MsgBox "Please enter numeric value only." 
      ' I WANT TO RETURN HERE 
     End If 
    End If 


    If control.id = "xyz" Then 
    spaceAboveTable = text 
    End If 


End Function 
+1

Ti rendi conto che la funzione non restituisce un valore, giusto? In VBA, una funzione che non restituisce un valore dovrebbe essere dichiarata come 'Sub'. Altrimenti, ti consigliamo di assegnare un valore a "GetEditboxValue" prima di uscire dalla funzione. (Ovviamente, questo è nel caso in cui non si desideri uscire presto * senza * restituire un valore.) –

+1

Per non dimenticare, questa funzione sembra molto brutta. Invece di restituire un valore, da una editbox (ciò che implica il nome), l'unica cosa che sembra fare è creare qualche effetto collaterale sgradevole - dandoti un mal di testa prima o poi. Invece di separare il rilevamento degli errori dalla gestione degli errori, gestisce gli errori stessi con un MsgBox. Meglio separare queste preoccupazioni, se il testo non è numerico, restituisce un valore di errore o genera un evento di errore o qualcosa del genere, ma lascia che il chiamante decida se vuole mostrare una finestra di messaggio o fare una diversa gestione degli errori. –

+0

@Cody, giusto per chiarire la tua osservazione per @ydobonmai, tutte le routine dichiarate come funzioni restituiscono un valore. Se non si specifica esattamente * quale * valore con una riga come "GetEditboxValue = ", la funzione restituirà qualsiasi valore predefinito per il tipo di funzione. In questo caso è la stringa vuota, ma potrebbe essere 0, "", False, Vuoto, Niente, ecc. – jtolle

risposta

26

è necessario mettere EXIT FUNCTION lì per uscire da ulteriore esecuzione:

Function GetEditboxValue(control As IRibbonControl, text As String) As String 

    If Not IsMissing(text) Then 
     If Not IsNumeric(text) Then 
      MsgBox "Please enter numeric value only." 
      EXIT FUNCTION 
     End If 
    End If 


    If control.id = "xyz" Then 
    spaceAboveTable = text 
    End If 


End Function 
+0

@Sarfraj, ho una domanda VBA qui: - http://stackoverflow.com/questions/4565185/iterating-xml-nodes-using-vba. Potresti per favore aiutare. –

+2

Oppure ESCI SUB se è una subroutine, anziché una funzione. –

1

È possibile utilizzare Exit Function dopo vostro MsgBox dichiarazione

0

Un'altra opzione è quella di sollevare esplicitamente un errore utilizzando Err.Raise. Poiché non si dispone di un gestore errori all'interno di questa funzione (ad esempio, nessuna riga On Error ...), l'errore verrà propagato attraverso lo stack di chiamate finché non viene eseguito in un gestore degli errori.

4

In un certo senso generalizzato (non sto dicendo in realtà tutto ciò che non sia già stato detto):

Function Foo(inputVar As Double) As Double 

    On Error GoTo ErrorHandler 

    ' Code assigning something to returnValue and defaultOutput 

    Foo = returnValue 

    Exit Function 

    ErrorHandler: 

    Foo = defaultOutput 

End Function 

Nessun motivo deve essere doppia, naturalmente.

(A cura perché ho avuto un secondo "Exit Function" invece di "End Function.")