2011-10-10 1 views
32

Questo mio script semplificato:Chiamata di un sub in VBA

Sub SomeOtherSub(Stattyp As String) 
     'Daty and the other variables are defined here 

     CatSubProduktAreakum(Stattyp, Daty + UBound(SubCategories) + 2) 

    End Sub 

    Sub CatSubProduktAreakum(Stattyp As String, starty As Integer) 

    'some stuff 

    End Sub 

La chiamata di CatSubProduktAreakum è contrassegnata in rosso come un "Errore di sintassi". Non capisco l'errore. È una semplice chiamata sub-routine con due argomenti. Perché VBA non accetta la chiamata?

risposta

60

Try -

Call CatSubProduktAreakum(Stattyp, Daty + UBound(SubCategories) + 2) 

quanto riguarda il motivo, questo da MSDN tramite questa domanda - What does the Call keyword do in VB6?

Non sono tenuti a utilizzare la parola chiave di chiamata quando si chiama una procedura. Tuttavia, se si utilizza la parola chiave Chiama per chiamare una procedura che richiede argomenti , l'elenco di argomenti deve essere racchiuso tra parentesi. Se si omette la parola chiave Chiama , è inoltre necessario omettere le parentesi attorno all'elenco di argomenti . Se si utilizza la sintassi di chiamata per chiamare qualsiasi funzione intrinseca o definita dall'utente , il valore di ritorno della funzione viene scartato.

+1

Grazie, sembra funzionare. Se chiamo Sub-routine con un solo argomento (e lo definisco con un solo argomento), allora posso chiamarlo solo con il suo nome (e l'argomento tra parentesi). Perché non è possibile chiamare semplicemente un Sub con due argomenti? – reggie

+3

@reggie È possibile chiamare un sub senza Call purché si salti le parentesi 'Mysub arg1, arg2, arg3' Tuttavia, è necessario leggere su ByVal e ByRef. – Fionnuala

+0

Ho aggiornato la risposta con una spiegazione più completa. – ipr101

5

Per chiunque ancora a venire a questo post, l'altra opzione è quella di omettere semplicemente le parentesi:

Sub SomeOtherSub(Stattyp As String) 
    'Daty and the other variables are defined here 

    CatSubProduktAreakum Stattyp, Daty + UBound(SubCategories) + 2 

End Sub 

I Call parole chiave è veramente solo in VBA per la compatibilità all'indietro e non è effettivamente necessaria.

Se tuttavia, si decide di utilizzare la parola chiave Call, è necessario modificare la sintassi per adattarla.

'// With Call 
Call Foo(Bar) 

'// Without Call 
Foo Bar 

Entrambi faranno esattamente la stessa cosa.


Detto questo, ci possono essere casi di guardare fuori per cui utilizzando parentesi inutilmente causerà cose da valutare in cui non si intendeva loro di essere (come parentesi fanno in VBA) così con questo in attenzione l'opzione migliore è probabilmente quella di omettere la parola chiave e le parentesi