Richiamare variabili delle sub



  • Richiamare variabili delle sub
    di Matbuz (utente non iscritto) data: 26/03/2014 17:26:41

    Buonasera a tutti,
    io ho un codice molto lungo che, per comodità di lettura, volevo spezzettare in varie sub in maniera tale da avere un codice più snello e semplice da leggere.
    L'idea mia era quindi di prendere i vari pezzi del codice e metterli ognuno in una sub per poi richiamarle tramite Call.

    Il problema che mi si pone è che le variabili che calcolo all'interno delle sub non vengono riportate nel codice principale e quindi il programma non continua correttamente.

    Non so se sono stato in grado di spiegarmi bene. Vi porto un esempio che forse potrebbe aiutare
     
    If a>b then
             c=d+e
    else
            c=f+g
    end if
    
    numero=c
    
    Io volevo fare:
    
    If a>b then
            call calcola1
    else
           call calcola2
    end if
    
    numero=c
    
    sub calcola1 ()
         c=d+e
    end sub
    
    sub calcola2 ()
        c=f+g
    end sub
    
    
    
    Il problema che si pone è che c dentro la sub assume un valore ma appena mentre appena rietornato sul codice master c assume valore "vuoto"


  • Filtrare contatti ripetuti entro 30 giorni
    di Ghibli (utente non iscritto) data: 26/03/2014 17:51:50

    Buonasera.
    Ho un foglio di excel (esportato da una tabella di access) di circa 10.000 righe così composto:
    CODICEFISCLIENTE DATACONTATTO
    ABCEFG01A02A100G 27/01/2013
    ABCEFG01A02A100G 11/02/2013
    ABCEFG01A02A100G 16/03/2013
    ABCEFG01A02A100G 04/04/2013
    HILMNP03B04B200F 05/04/2013
    HILMNP03B04B200F 12/05/2013
    HILMNP03B04B200F 18/06/2013
    HILMNP03B04B200F 24/07/2013

    Vorrei impostare un filtro o una formula che mi consentisse di vedere quanti contatti dello stesso cliente ci sono stati entro 30 giorni dal precedente riferito alla totalità dei clienti e possibilmente selezionare le righe con tali requisiti.
    Nell'esempio: per il primo cliente dovrebbe restiturmi 3 e mostrare la prima, seconda e quarta riga (in quanto il terzo contatto è avvenuto dopo 30 giorni dal secondo), mentre per i secondo cliente dovrebbe restituirmi 2 e mostrare la prima e seconda riga (relativa al secondo cliente).
    Attendo fiducioso e saluto tutti.



  • di Vecchio Frac data: 26/03/2014 17:54:00

    @Ghibli
    La tua nuova discussione è finita dentro una discussione già aperta da Matbuz.
    Ti prego di creare una nuova discussione e riproporre il tuo quesito.





  • di Vecchio Frac data: 26/03/2014 18:03:12

    @Matbuz
    Uno dei metodi, semplice, è servirsi di variabili globali.
    Una variabile dichiarata entro una certa funzione o una procedura ha visbilità limitata al pezzo di function o sub entro cui è dichiarata; la variabile globale, invece, è quella che si dichiara fuori dalle altre sub (dopo Option Explicit) e ha visibilità all'interno del modulo in cui è dichiarata. Può essere letta e scritta da qualunque sub o function all'interno del proprio modulo (o foglio). Se la dichiari Public e la sistemi in un modulo poi sarà visibile all'intero progetto.
    Chiaramente le variabili globali vanno utilizzate con cura e discernimento.
    Vedi esempio qui sotto, lanciando "test_variabili_globali".
     
    Option Explicit
    
    'tutto in un modulo
    Private nome as string, eta as integer
    
    public sub test_variabili_globali()
    
        call chiedi_nome
        call chiedi_eta
    
        msgbox "Adesso so che ti chiami " & nome & " e che hai " & eta & " anni."
    
    end sub
    
    private sub chiedi_nome()
        nome = inputbox("Inserisci il tuo nome:")
    end sub
    
    private sub chiedi_eta()
        eta = inputbox("Inserisci la tua età:")
    end sub
    
    
    






  • di scossa data: 26/03/2014 20:39:06

    Se il codice che hai mostrato rispecchia l'esigenza reale, direi che la scelta migiore è quella di usare delle function anziché delle sub.
     
    If a>b then
            c = calcola(d,e)
    else
           c = calcola(f, g)
    end if
    
    numero=c
    
    function calcola (byVal V1 as variant, byVal V2 as variant)
         calcola=V1+V2
    end sub
    
    



  • di scossa data: 26/03/2014 20:40:26

    Errata
    function calcola (byVal V1 as variant, byVal V2 as variant)

    Corrige
    function calcola (byVal V1 as variant, byVal V2 as variant) as variant
     
    function calcola (byVal V1 as variant, byVal V2 as variant) as variant
         calcola=V1+V2
    end sub



  • di scossa data: 26/03/2014 20:41:34

    Ovviamente, se conoscessi il tipo di variabili, si potrebbero dichiarare le variabili secondo il tipo corretto.