ChiamAre una sub da un'altra sub

Anonimo
2016-04-09T08:42:13+00:00

buongiorno, 

l'ho una procedura in un modulo, é lunga, e funziona. Vorrei peró spezzarla per questioni di leggibilità e testing definendola in blocchi di altrettante sub da richiamare. 

Pertanto richiamo nel codice principale una sub netmin0 e scrivo direttamente il suo nome.

la definizione di Netmin0 é

sub netmin0

Operazioni  su una serie di variabili definite e o calcolate nella sub principale 

end sub

al lancio della sub principale non ottengo nessun errore ma sembrerebbe che i valori delle variabili non vengono passate a netmin0. 

Help

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

8 risposte

Ordina per: Più utili
  1. Anonimo
    2016-04-09T14:12:33+00:00

    Siamo all'abc del Visual Basic.....

    Nella mia semplice risposta era tutto implicito, vediamo di esplicitare.

    Se da una routine (Sub o Function), vuoi richiamare un'altra routine e vuoi che variabili implementate nella prima siano *viste* dalla seconda, hai due strade.

    1- Passare le variabili *direttamente* dalla prima alla seconda routine:

    Public Sub Uno()

        Dim s As String  '<<=== Dichiaro la variabile

        s = "Mauro"  '<<===Implemento la variabile

        Due (s) '<<===Chiamo la seconda routine e le passo la variabile (argomento)) 

    End Sub

    Public Sub Due(ByVal myString As String) '

        MsgBox "Ciao " & myString

    End Sub

    In questo caso si dice che la seconda routine ha un parametro (myString) e che quando la richiami le passi un argomento (la s all'interno della parentesi ). I parametri possono essere più di uno e tutti si aspettano il relativo argomento, a meno che i parametri non siano dichiarati Optional (opzionali). Gli argomenti devono essere dello stesso tipo dichiarato nel parametro (string con string, long con long, ecc.).

    2 - Dichiarare le variabili *all'esterno* delle routine.

    Privates As String '<<===Dichiarazione della variabile all'esterno della routine e visibile da tutte le routine presenti nel modulo di codice

    Public Sub Uno()

        s = "Mauro"  '<<===Implementazione della variabile

        Due  <<===Chiamo la seconda routine

    End Sub

    Public Sub Due()

        MsgBox "Ciao " & s  '<<=== La variabile è vista senza che debba fare nulla

    End Sub

    In questo caso, come già scritto, la variabile è *vista* da tutte le routine del modulo e una volta implementata posso utilizzarla.

    Nel caso di variabile che debbano essere viste non solo dallo specifico modulo ma da tutto il programma, le variabili vanno posizionate in un Modulo standard e dichiarate Public.

    Quando si usano variabili esterne alle routine, pensare sempre BENE a tutto lo sviluppo dell'applicazione. Le variabili sono si viste da tutte le routine, ma possono essere anche MODIFICATE da tutte le routine.

    Nota. Sandro passa l'argomento al parametro senza utilizzare le parentesi. Personalmente preferisco passarlo all'interno delle parentesi. Solo questione di forma.

    Vedi anche:

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  2. Anonimo
    2016-04-09T10:56:26+00:00

    ciao Danny,

    che tipo di variabili sono net, ord1 e ord2? numeriche? long? integer?

    supponendo siano long:

    nella sub prova avrai:

    public sub prova()

     ' tutto il tuo codice

    netmin0 net, ord1, ord2, rst

    end sub

    'Ma il valore di net e ord1, ord2, non sembrano essere passati alla routine netmin0

    nel codice che mostri non hai passato alcun parametro alla netMin0 e la stessa deve "sapere" quali parametri deve ricevere quindi ad esempio :

    private sub netmin0(byVal myNet as long, _

                                     byVal myOrd1 as long, _

                                      byVal myOrd2 as long, _

                                      byVal rst2 as dao.recordset)

    ' tuo codice

    with rst2

       .addnew

        .fields("prjinv")=sch

        'tuo codice.

    end with

    end sub

    la variabili sch, dta_sch, dta, ss...ect sembrano non dichiarate nel codice che mostri.

    ti consiglio di rendere obbligatoria la dichiarazione delle variabili con option Explicit in testa ad ogni modulo standard e/o di classe.

    E' bene anche distruggere gli oggetti in chiusura della routine in particolare tbl e rec che se non erro sono entrambe recordset

    quindi set tbl=nothing e set rec= nothing.

    Facci sapere.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-04-09T09:32:58+00:00

    Grazie Sandro, pero' sono duro di comprendonio, faccio il caso:

    Sub prova ()

    dim...

    dim...

    'prova calcola ad certo punto una variabile nel definita come'

    net = net + compo + SM_PF - qty * flag - SS

    'calcola il quantitativo da ordinare

    If Tbl.Fields("min") = 0 Then moq = 1

    If Tbl.Fields("OM") = 0 Then moq = 1

    If Abs(net) / moq < 1 Then

        ord1 = moq

        Else

        ord1 = Int(Abs(net) / moq) * moq

        End If

        bal = Abs(net) - ord1

            If bal < 0 Then

            ord2 = 0

            ElseIf bal > 0 And bal < OM Then

            ord2 = OM

            Else

            ord2 = (Int(bal / OM) + 1) * OM

        End If.                         Decido poi di verificare un testi ns sub netmin0 separata sotto definita

    netmin0.

    .......

    End sub.     'Prova

    Public Sub netmin0()

    If net < 0 Then

    sch = ord1 + ord2

    dta_sch = dta

    totsch = totsch + sch

    net = net + sch

    Rec.AddNew

    Rec.Fields("prjinv") = sch

    Rec.Fields("item_code") = cd_cmp

    Rec.Fields("sscomp") = SS

    Rec.Fields("ss_pdr") = sspadr

    Rec.Fields("nome") = sup

    Rec.Fields("inv_comp") = 0

    Rec.Fields("comp_disp_qty") = 0

    Rec.Fields("RRUITM") = "Sch_" & M

    Rec.Fields("RRDSC1") = Pur_Fcst

    Rec.Fields("PF_SML_disp_qty") = 0

    Rec.Fields("PF_Sml_Inv") = 0

    Rec.Fields("qta") = sch

    Rec.Fields("TP") = "OdA"

    Rec.Fields("dat") = dta_sch - 30

    Rec.Update

    End If

    End Sub

    'Ma il valore di net e ord1, ord2, non sembrano essere passati alla routine netmin0

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-04-09T09:27:46+00:00

    Dipende da chi e cosa elabora le variabili che vuoi passare alle Sub richiamate.

    Soluzione 1:

    Public Sub Uno()

        Dim s As String

        s = "Mauro"

        Due (s)

    End Sub

    Public Sub Due(ByVal myString As String)

        MsgBox "Ciao " & myString

    End Sub

    Soluzione 2:

    Private s As String

    Public Sub Uno()

        s = "Mauro"

        Due (s)

    End Sub

    Public Sub Due(ByVal myString As String)

        MsgBox "Ciao " & myString

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2016-04-09T09:15:03+00:00

    La risposta è stata utile?

    0 commenti Nessun commento