Passare da una sub a unaltra con Goto




  • di Grograman (utente non iscritto) data: 29/01/2014 16:08:30

    ma l'etichetta a cui rimandi deve far parte della medesima routine
     
    Option Explicit
    
    Sub pippo()
    Dim i As Long
      For i = 0 To 100
        If i > 5 Then
          Call pluto
        Else
          GoTo VIA
        End If
        'blablabla
    VIA:
      Next i
    End Sub
    
    Sub pluto()
         'bla bla
    End Sub
    



  • di Grograman (utente non iscritto) data: 29/01/2014 16:09:26

    Per la cronaca... scritta così non ha alcun senso eh, è solo per far vedere come usare l'etichetta!



  • di rambo424 (utente non iscritto) data: 29/01/2014 16:20:03

    appunto.. so che deve stare nella stessa routine..

    il codice è più complesso di quello che ho riportato nell'esempio e proprio mi serve che se una condizione è verificata nella sub sottostante, il codice risalga a quella precedente! è proprio lì il problema!



  • di rambo424 (utente non iscritto) data: 29/01/2014 16:27:58

    L'unica cosa che mi viene in mente è mandarlo in errore e fare una cosa del tipo:
    sinceramente lo vorrei evitare perchè a questo punto non avrei più alcun errore di debug, quindi non credo sia una soluzione fattibile..


     
    sub pippo
    on error goto VIA
        for i=0 to 100
               call pluto 
        VIA:
        next i
    end sub
    
    sub pluto
          if i>5 then ok=5/0 'lo mando in errore e quindi vado su via
    end sub



  • di Grograman (utente non iscritto) data: 29/01/2014 16:32:42

    No allora fai esempi più specifici anche perchè scritta come l'hai messa non si verificherà MAI la condizione di i>5 NON essendo i passata alla routine pluto.

    E anche passandogliela ti si bloccherebbe ugualmente.

    Specifica meglio cosa vuoi ottenere, possibilmente con un file di esempio, che un modo lo troviamo!
     
    Sub pippo()
    On Error GoTo VIA
        For i = 0 To 100
               Call pluto(i)
    VIA:
        Next i
    End Sub
    
    Sub pluto(ByVal i As Long)
          If i > 5 Then ok = 5 / 0 'lo mando in errore e quindi vado su via
    End Sub
    



  • di rambo424 data: 29/01/2014 16:40:17

    Intanto grazie per l'interessamento :D

    Ti ho scritto un file di esempio che semplifica abbastanza la struttura del mio codice: una serie di sub concatenate che spesso hanno parametri calcolate da funzioni.
    Io voglio che se si verifica una condizione (che nel caso in esempio è quantità<50), il codice risalga alla prima funzione, e proceda con il next i.
    Non vi soffermate sulla struttura logica dell'esempio, che ovviamente non ha senso, ma serve solo da esempio.

    ps.: I valori che arrivano alla funzione cerca_prezzo sono fissi; in realtà vengono fuori da altre sub che fa il mio codice.
     
    Sub test1()
    For i = 0 To 100
        Call test2
    VIA:
    Next i
    End Sub
    Sub test2()
        quantità = 10
        prezzo = 5
        prezzo = cerca_prezzo(quantità, prezzo)
    End Sub
    Function cerca_prezzo(ByVal quantita, prezzo)
        If quantita < 50 Then GoTo VIA 'e qui ovviamente scritta così non funge!!!
        cerca_prezzo = quantita * prezzo
    End Function
    



  • di Grograman (utente non iscritto) data: 29/01/2014 16:46:08

    No non ci siamo!
    Mi serve un FILE, non il codice ^_^

    La soluzione potrebbe essere un banale controllo PRIMA di richiamare la routine, un ciclo while, una funzione ricorsiva, ma senza la REALE struttura di dati e codice, non sono in grado di trovarla!



  • di Grograman (utente non iscritto) data: 29/01/2014 16:48:21

    O utilizzare una booleana pubblica:
     
    Option Explicit
    Public blnOk As Boolean
    Sub test1()
    Dim i As Long
    For i = 0 To 100
        Call test2
        If blnOk Then GoTo VIA
    VIA:
    Next i
    End Sub
    Sub test2()
    Dim quantità As Long, prezzo As Long
        quantità = 60
        prezzo = 5
        prezzo = cerca_prezzo(quantità, prezzo)
    End Sub
    Function cerca_prezzo(ByVal quantita, prezzo)
        If quantita < 50 Then blnOk = True 'e qui ovviamente scritta così non funge!!!
        cerca_prezzo = quantita * prezzo
    End Function
    
    



  • di rambo424 data: 29/01/2014 17:20:51

    Allora:
    la booleana public non riesce a intercettare il problema che si verifica a livello di sub.

    quanto al banale controllo? che avevi in mente?

    quanto al file di esempio, ti assicuro che la struttura è esattamente quella che ti ho riportato, una serie di nested sub e function; non posso inviarti il file originale per problemi di tutela della privacy



  • di patel data: 29/01/2014 18:29:28

    un file di esempio è il file originale con dati fittizi





  • di rambo424 data: 29/01/2014 18:57:46

    ragassuoli vi state fossilizzando sul file originale, ma non ne vedo la necessità.. sono una decina di moduli vi complicherei la vita inutilmente!

    vi riporto un altro esempio, magari riesco a spiegarmi meglio:
     
    Sub test1()
        For i = 0 To 100
            Call test2
        Next i
    End Sub
    
    
    Sub test2()
        quantità = 10
        prezzo = 100
        prezzo = cerca_prezzo(quantità, prezzo)
    End Sub
    
    
    Function cerca_prezzo(ByVal quantita, prezzo)
        If quantita < 50 Then
    
    '   torna al next i -> parte che mi manca!! 
    
        cerca_prezzo = quantita * prezzo
    End Function
    



  • di scossa data: 29/01/2014 21:16:19

    GOTO??
    Ho letto bene?
    GOTO ??????




  • di Grograman (utente non iscritto) data: 29/01/2014 23:18:51

    cit: " sono una decina di moduli vi complicherei la vita inutilmente!"

    E' più probabile che la semplificheremmo noi a te



  • di Zer0Kelvin data: 02/02/2014 04:39:51

    Ma siamo noi che ci stiamo fossilizzando o tu che insisti con una richiesta ASSURDA?