Autocontrollo Dati



  • Autocontrollo Dati
    di LisaB. (utente non iscritto) data: 27/01/2015 07:15:43

    Buongiorno amici, mi chiedevo se era possibile creare una sorta di "autocontrollo dei dati".
    Mi spiego meglio:

    Sul foglio1 ho dati che modifico e gli stessi vengono poi riportati sul foglio2 tramite una macro che fa copia e incolla.
    È già capitato però che venissero fatte modifiche e che poi per.dimenticanza non venissero riportate.
    Mi chiedevo quindi, sul foglio2 è possibile creare un "autocontrollo" che al momento dell'apertura del foglio controlli se i dati sono uguali a quelli di foglio1 e nel caso di differenze mi avvisi di aggiornare?

    Grazie



  • di lepat (utente non iscritto) data: 27/01/2015 08:17:40

    nella vinestra VBA seleziona Questa_Cartella_di_Lavoro, poi Workbook e nella sub che ti si apre "Private Sub Workbook_Open() "inserisci un richiamo alla sub che fa la copia




  • di LisaB. (utente non iscritto) data: 27/01/2015 09:24:27

    Cosi facendo però lancio la macro aggiorna giusto?
    Non effettua un controllo, io ho la necessità di fare un controllo e in caso di valori differenti mi dica di aggiornare i



  • di lepat (utente non iscritto) data: 27/01/2015 09:44:42

    presupponevo che tu lo sapessi fare il controllo, altrimenti allega il file, comunque si fa prima a fare la copia che a fare il controllo



  • di LisaB. (utente non iscritto) data: 27/01/2015 11:03:48

    Mi chiedevo se in vba è possibile fare ciò che fa la formula =se

    Dovrei confrontare il range a5:L25 del foglio1 con quello del foglio2 se uguali OK se diversi AGGIORNARE

    Ho iniziato facendo il confronto cella per cella con la formula SE ma la cosa è lunghetta



  • di lepat (utente non iscritto) data: 27/01/2015 11:08:25

    insisto, che senso ha controllare e poi copiare ? tanto vale copiare subito, addirittura invece di farlo all'apertura del file conviene farlo automaticamente alla chiusura itilizzando l'evento before_save



  • di LisaB. (utente non iscritto) data: 27/01/2015 11:51:38

    Non mi permette di individuare eventuali cambiamenti se modifico a prescindere.
    E io ho la necessità di sapere appena accedo sul foglio se il range1 è uguale al range2



  • di lepat (utente non iscritto) data: 27/01/2015 12:17:33

    nel primo post hai detto:
    Sul foglio1 ho dati che modifico e gli stessi vengono poi riportati sul foglio2 tramite una macro che fa copia e incolla.
    È già capitato però che venissero fatte modifiche e che poi per.dimenticanza non venissero riportate.
    con una copia automatica non puoi dimenticare



  • di LisaB. (utente non iscritto) data: 27/01/2015 12:51:40

    Ok Lepat, dimmi ti allora come devo fare il mio foglio....




  • di lepat (utente non iscritto) data: 27/01/2015 12:53:37

    ti ho già chiesto di allegare un file di esempio e non l'hai fatto, così sfrutto anche la tua macro



  • di Vecchio Frac data: 27/01/2015 13:41:44

    In funzione di quello che vuole fare Lisa, se deve confrontare cella per cella, bisognerebbe delimitare il range da controllare e poi avviare un controllo appunto cella per cella con For...Each; se il controllo è limitato ai soli valori la cosa secondo me è anche abbastanza veloce, se il controllo di uguaglianza deve essere esteso anche alla formattazione (di cella, di carattere, di bordi ecc.) allora forse si allunga un pochino il tempo di attesa. E poi bisogna anche stabilire come deve essere esposto all'utente il risultato del confronto (un msgbox? evidenziando le celle disuguali? un log separato?)





  • di Vecchio Frac data: 27/01/2015 13:43:03

    Ecco perchè dovreste evitare i tag HTML nei post: poi sporcano tutti i post successivi se non vengono chiusi bene (ma tanto non vengo mai ascoltato).
     






  • di LisaB. (utente non iscritto) data: 27/01/2015 14:24:25

    Ciao Vecchio. Frac...

    Il controllo è del solo valore di cella. Come detto su, pari pari alla formula SE

    Se il range di Foglio1 è uguale a foglio2 nella cella X mi compare Ok se diverso compare la scritta AGGIORNARE



  • di LisaB. (utente non iscritto) data: 27/01/2015 14:26:25

    Vecchio Frac, scusami cos'è un tag HTML?



  • di Vecchio Frac data: 27/01/2015 14:37:01

    Allora secondo me fai presto a buttare giù un po' di codice grezzo che compara cella per cella del range da controllare (saprai a priori quali colonne e quali righe si devono confrontare no?)

    Il tag HTML è una speciale codifica delle pagine internet grazie alla quale vengono costruite e realizzate le pagine poi visualizzate nei nostri browser. Ci sono tag per esempio per modificare la grandezza del carattere, il formato: grassetto, corsi, sottolineato, il colore del font usato, l'inserimento di immagini, link ad altre pagine internet, eccetera. C'è un mondo là fuori ^_^
    Solitamente nei forum basati su HTML ci sono dei pulsanti per impostare i formati del font utilizzato per i post. In questo forum, per sobrietà e semplicità, non sono stati previsti. Ma il codice HTML è vivo e funzionante, anche se qui ne viene sconsigliato l'uso.

    p.s. nella mia battuta di prima avevo dimenticato una faccina... sorry, rimedio ora





  • di LisaB. (utente non iscritto) data: 27/01/2015 14:38:55

    Io sono riuscita a farlo con la formula se
    Ho.assegato a vero il valore 1 a falso il valore 0 la somma di tutti i valori veri.se.è uguale a X mi da Ok altrimenti Aggiornare.

    Mi chiedevo se con il VBA fosse più semplice e veloce.



  • di Vecchio Frac data: 27/01/2015 14:59:44

    Ti allego un codice un po' grezzo che compara Foglio1 e Foglio2, riuleva le differenze e comunica l'esito della verifica.
    Se non ci sono differenze, tutto ok.
    Se ci sono differenze, vengono attivate le celle del Foglio1 che differiscono da quelle del Foglio2.
    Forniosce anche la stima del tempo impiegato.
    L'esempio lavora sul range A1:Z10000 (quindi effettua un controllo per ventiseimila celle) e sul mio pc, che non è una gazzella in quanto a velocità, ci mette circa sei secondi per rilevare zero differenze (caso migliore) e circa quindici secondi per rilevare ventiseimila celle diverse (caso peggiore).
     
    Option Explicit
    
    Sub compara()
    Dim r As Range, riga As Long, colonna As Long, c1 As String, c2 As String
    Dim t1 As Long
    
        t1 = Timer
        Set r = Nothing
        For colonna = 1 To 26
            For riga = 1 To 10000
                c1 = Sheets("Foglio1").Cells(riga, colonna)
                c2 = Sheets("Foglio2").Cells(riga, colonna)
                If c1 <> c2 Then
                    If r Is Nothing Then
                        Set r = Sheets("Foglio1").Cells(riga, colonna)
                    Else
                        Set r = Union(r, Sheets("Foglio1").Cells(riga, colonna))
                    End If
                End If
            Next
        Next
        
        MsgBox "Finito. Tempo trascorso (in secondi): " & Timer - t1
        
        If Not (r Is Nothing) Then
            MsgBox "Ci sono celle che differiscono. Evidenzio le celle del Foglio1 che risultano diverse."
            r.Select
        Else
            MsgBox "Controllo completato. Nessuna differenza rilevata tra Foglio1 e Foglio2."
        End If
            
    End Sub
    






  • di Vecchio Frac data: 27/01/2015 15:01:05

    Errata corrige: da A1 a Z10000 le celle sono 26 x 10000 cioè 260.000... sono un ciuccio in matematica ^_^





  • di Vecchio Frac data: 27/01/2015 15:08:21

    Lo stesso codice rivisitato in funzione della velocità, al termine del confronto non evidenzia niente, si ferma appena trova la prima cella che differisce.
    Vantaggio: velocità di esecuzione (caso migliore, nessuna differenza: 0, 5 secondi; caso peggiore: l'ultima cella Z10000 differisce: circa 5 secondi).
    Svantaggio: non sai quali celle sono differenti, sai solo che ci sono delle differenze.

    Potresti combinare le due macro, lanciando quella più veloce per un confronto rapidissimo e poi quella più lenta per evidenziare le celle diverse (o farti fare un report con gli indirizzi delle celle diverse).

     
    Option Explicit
    
    Sub compara()
    Dim r As Range, riga As Long, colonna As Long, c1 As String, c2 As String
    Dim t1 As Long, diff As Boolean
    
        t1 = Timer
        diff = False
        Set r = Nothing
        For colonna = 1 To 26
            For riga = 1 To 10000
                c1 = Sheets("Foglio1").Cells(riga, colonna)
                c2 = Sheets("Foglio2").Cells(riga, colonna)
                If c1 <> c2 Then
                    diff = True
                    GoTo exit_here
                End If
            Next
        Next
            
    exit_here:
        MsgBox "Finito. Tempo trascorso (in secondi): " & Timer - t1
        
        If diff Then
            MsgBox "Ci sono celle che differiscono. "
        Else
            MsgBox "Controllo completato. Nessuna differenza rilevata tra Foglio1 e Foglio2."
        End If
            
    End Sub






  • di LisaB. (utente non iscritto) data: 27/01/2015 15:09:42

    Adattata al mio caso e va benissimo è ciò che mi interessa fare... ma fin troppo complessa...

    Dasterebbe in una cella un OK se uguale o AGGIORNA se devo aggiornare.



  • di Vecchio Frac data: 27/01/2015 15:24:17

    Allora la seconda macro è quella che fa per te.
    Dopo exit_here ti basta la modifica che segue (cancella anche i riferimenti a t1 e timer visto che non ti serve controllare il tempo trascorso), che mette in A1 la scritta OK oppure AGGIORNA in base alle differenze trovate..
     
    ...
    exit_here:
     
        If diff Then
            Range("A1") = OK"
        Else
            Range("A1") ="AGGIORNA"
        End If
            
    End Sub






  • di Sara B. (utente non iscritto) data: 27/01/2015 15:34:12

    SEI UN GRANDE Vecchio Frac.... GRAZIEEEEEEEEEEEEEEEEEEEEEEEEEE e' fantastico.

    Se volessi dirgli che

    c1 = Sheets("Foglio1").Cells(riga, colonna)
    c2 = Sheets("Foglio2").Cells(riga, colonna)

    Foglio1 è quello ATTIVO e
    Foglio2 quello che lo precede come devo fare?



  • di Vecchio Frac data: 27/01/2015 15:59:16

    Ma Lisa B. e Sara B. sono la stessa persona o sono due gemelle? ^_^
    Comunque puoi usare

    sheets(activesheet.index-1)

    per riferirti al foglio che precede quello attivo... attenzione che se il foglio attivo è il primo, questo metodo fallisce perchè non puoi avere un index zero: vale a dire che niente precede il primo foglio.
     
    'e quindi nel tuo caso per confrontare lo sheet attivo con il precedente,
    'a condizione che il foglio attivo NON sia il primo:
    c1 = ActiveSheet.Cells(riga, colonna) 
    c2 = sheets(activesheet.index-1).Cells(riga, colonna) 






  • di LisaB. (utente non iscritto) data: 27/01/2015 16:13:19

    Sono sempre io
    Appena ho un attimo di calma lo adatto per bene e testo.
    Mi si è aperto un nuovo mondo con queste MACRO, sino a "ieri" sconosciuto.

    GRAZIE PER LA TUA GENTILEZZA Vecchio Frac



  • di Lisa B. (utente non iscritto) data: 27/01/2015 16:41:35

    Ho allegato il file sul quale sto facendo le prove
    Cosa ho sbagliato? Perchè non va più nulla?



  • di Lisa B. (utente non iscritto) data: 27/01/2015 17:01:22

    Invece di dargli i valori riga, colonna, non è possibile dargli il range del foglio 1 da confrontare con il range del foglio 2?



  • di Crstian (utente non iscritto) data: 27/01/2015 18:38:59

    Perché semplicemente non assegli alla cella B10 del foglio2 il valore =foglio1!B1
    (Valori cella indicativi). Eviti macro e verifiche in quanto se modifichi il foglio 1 si modifica automaticamente anche il foglio 2



  • di Vecchio Frac data: 27/01/2015 18:44:02

    Ciao Lisa,
    aggiorna tutto il codice come segue che tiene conto delle zone diverse da confrontare.
    Se aggiorni i range ricordati di farlo anche nel codice (range1 e range2 sono le due zone da confrontare tra loro, range1 appartiene al foglio attivo, range2 è ovviamente quello del foglio precedente).
    Il range di confronto è proprio minimo, perchè dici che si appesantisce con le formule?
    Comunque non dimenticare mai Option Explicit in testa ai moduli.


     
    Option Explicit
    
    Sub compara()
    Dim r As Range, riga As Long, colonna As Long, c1 As String, c2 As String
    Dim range1 As Range, range2 As Range
    Dim ci_sono_differenze  As Boolean
    
        ci_sono_differenze = False
        Set r = Nothing
        
        Set range1 = ActiveSheet.Range("K2:R5")
        Set range2 = Sheets(ActiveSheet.Index - 1).Range("B2:I5")
        
        For colonna = 1 To range1.Columns.Count
            For riga = 1 To range1.Rows.Count
              c1 = range1.Cells(riga, colonna)
              c2 = range2.Cells(riga, colonna)
    
                If c1 <> c2 Then
                    ci_sono_differenze = True
                    GoTo exit_here
                End If
            Next
        Next
            
    exit_here:
     
        If ci_sono_differenze Then
            ActiveSheet.Range("S10") = "AGGIORNARE"
        Else
            ActiveSheet.Range("S10") = "OK"
        End If
            
    End Sub






  • di LisaB. (utente non iscritto) data: 27/01/2015 19:45:20

    Vecchio Frac è semplicemente perfetto!!!

    Mi spiegheresti il perché del comando Oprion Explicit?

    Grazie ancora una volta



  • di Vecchio Frac data: 27/01/2015 21:31:29

    Avevo scritto una lunga spiegazione ma il sistema si è resettato e non ha inviato niente :(
    In due parole: Option Explicit serve a dichiarare obbligatoriamente le variabili prima di usarle, per evitare errori di battitura (altrimenti il compilatore assegna un valore di inizializzazione alle variabili e continua a usarle). C'è differenza tra "I" (i maiuscola) e "l" (elle minuscola), e tra "0" (zero) e "O" (o maiuscola).
    VBA permette di settare in automatico Option Explicit: Editor di codice >> Strumenti >> Opzioni >> Editor --> spunta su dichiarazione di variabili obbligatoria.

    Nel merito: mi piacerebbe vedere qualche formula, magari matriciale, per il confronto di due range di uguali dimensioni (ninai? altri? maghi delle formule, dove siete? ^_^).





  • di Lisa B. (utente non iscritto) data: 27/01/2015 21:44:03

    Grazie della spiegazione... Quindi è consigliabile utilizzare Option Explicit prima di ogni Sub .... ()??,



  • di scossa data: 27/01/2015 21:56:09

    cit. LisaB: "Se il range di Foglio1 è uguale a foglio2 nella cella X mi compare Ok se diverso compare la scritta AGGIORNARE"

    Non ho seguito tutto il thread, per cui mi limito alla richiesta sopracitata per proporre, col codice sottostante, una soluzione sicuramente veloce (range di 3 colonne per 450.000 righe verificato in 4 decimi di secondo).


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Sub prova2()
      Dim rngA As Range
      Dim rngB As Range
      Dim sAddrA As String
      Dim sAddrB As String
      Dim nStart As Single
    
      nStart = Timer
      Set rngA = Foglio1.Range("H1:J450000")
      Set rngB = Foglio2.Range("A1:C450000")
      sAddrA = rngA.Address(external:=1)
      sAddrB = rngB.Address(external:=1)
      If Evaluate("min(--(" & sAddrA & " = " & sAddrB & "))") Then
        MsgBox "le celle sono uguali" & vbCrLf & Timer - nStart
      Else
        MsgBox "le celle NON sono uguali" & vbCrLf & Timer - nStart
      End If
    
      Set rngA = Nothing
      Set rngB = Nothing
      
    End Sub
    



  • di Lisa B. (utente non iscritto) data: 27/01/2015 23:26:58

    GRAZIE MILLE anche a te SCOSSA...

    Cristian... non faccio come da te indicato in quanto dovrei fare "a mano" quell'operazione un SACCO di volte.

    Prutroppo chedo che non vi sia la possibilità di scrivere una formula excel che consideri il foglio prima di quello attivo, sbaglio???

    Pertato se nel foglio2 scriverò alla cella B10 =foglio1!B1, sul foglio 3 dovrò scrivere in B10 =foglio2!B1 Un semplice copia e incolla non mi aiuterebbe in quanto avrei sempre il riferimento foglio1.

    O esiste il modo???



  • di Vecchio Frac data: 28/01/2015 09:11:51

    Ecco! praticamente la soluzione matriciale che cercavo ^_^
    Interessante davvero oltre che efficiente.





  • di Lisa B. (utente non iscritto) data: 28/01/2015 09:49:25

    Vecchio Frac... Giusto x curiosità esiste un modo "sbrigativo" per fare le operazioni sopra citate??



  • di Vecchio Frac data: 28/01/2015 15:14:34

    Mi vengono in mente due possibili soluzioni.
    1) Associare alla macro una combinazione di tasti, per esempio "Ctrl-Alt-A". La macro quindi viene eseguita ogni volta che, dopo aver aperto il file, premi la combinazione di tasti.

    2) Trasformare la sub in una function (dichiarandola non volatile per evitare che venga ricalcolata ogni volta). Se la function si chiama "compara" (per restare nel mio esempio di ieri), la puoi scrivere come fosse una formula di Excel direttamente in una cella per avere il responso; la function (pubblica, in un modulo) si usa come una normale formula quindi con l'uguale davanti: "=compara()".





  • di Lisa B. (utente non iscritto) data: 28/01/2015 16:35:04

    La seconda mi sembra un'ottima soluzione!

    Io però chiedevo lumi per rispondere a Cristian... Se esiste un metodo per fare il calcolo che dice lui senza doverlo riscrivete ad ogni pagina



  • di Lisa B. (utente non iscritto) data: 28/01/2015 16:42:13

    Vecchio Frac...

    volevo provare la soluzione della function, basta che sostituisca la scritta SUB con la scritta FUNCTION?



  • di Vecchio Frac data: 28/01/2015 18:09:06

    cit. "Io però chiedevo lumi per rispondere a Cristian"
    ---> Ops, scusa. Avevo capito che ti riferivi a me.

    cit. "volevo provare la soluzione della function, basta che sostituisca la scritta SUB con la scritta FUNCTION?"
    ---> No, non basta. La cosa è un pochino più articolata. La differenza tra sub e function è essenzialmente questa: la sub "fa" qualcosa e si ferma, la function "fa" qualcosa, e "restituisce" qualcosa. VBA è abbastanza flessibile da permetterti do costruire function che non ritornano niente, ma allora si tratta di sub mascherate.
    Ricordati poi che in Excel sono visibili per essere eseguite solo le Sub, mentre le Function non si eseguono, ma si richiamano come fossero formule (nota bene: per essere usate così le function devono essere inserite in un modulo, e non nel codice di un foglio, e non devono essere dichiarate Private).
    Per ottenere un valore di ritorno nella firma della function (l'intestazione, quello che descrive la function e i suoi parametri) si aggiunge un tipo di dato con As.
    Il valore di ritorno elaborato nella function e che deve essere restituito deve essere assegnato al nome della function come ultima istruzione prima della chiusura della function stessa.
    Adesso abbiamo gli elementi per costruire una piccola function di esempio, che ti servirà per trasformare la nostra sub (meglio, quella di scossa adattata al caso) nella function che ti serve.


     
    'Esempio di Function da inserire in un Modulo.
    '(esempio banale ma è... un esempio ^_^)
    
    'questa è la firma della function "quante_celle_in_range"
    'accetta un parametro di tipo range
    'restituisce il numero di celle di cui il range è composto
    'si usa nel foglio di lavoro come una normale formula:
    'in A1: =quante_celle_in_range(B1:C10)  ---> 20
    Function quante_celle_in_range(rng as range) as integer
    dim conteggio as integer
        
        conteggio = rng.cells.count
        quante_celle_in_range = conteggio
    end function






  • di Lisa B. (utente non iscritto) data: 28/01/2015 19:21:19

    Si Vecchio Frac.... Chiedevo a te lumi x poter rispondere a Cristian

    O meglio... Gli ho risposto che quella soluzione è da inserire a mano tutte le volte.... E ti chiedevo se era vero o vi sono soluzioni che ignoro



  • di Lisa B. (utente non iscritto) data: 28/01/2015 19:24:54

    Dimenticavo.... Grazie per la function e spiegazione



  • di Vecchio Frac data: 28/01/2015 21:32:26

    Lisa, solo Cristian può dirci se la sua risposta è coerente con le tue richieste. Forse aveva in mente altro, ma non è più intervenuto.
    In base alla mia esperienza, credo che quella soluzione sia da inserire a mano in tutte le celle dell'array da confrontare, con la difficoltà aggiuntiva di individuare ogni volta il foglio precedente. La soluzione via codice già postata risolve tutti i problemi.





  • di scossa data: 28/01/2015 22:23:20

    Mi permetto solo di precisare che c'è una differenza pratica sostanziale tra Function e UDF (User Defined Function), sarò terra terra non me ne vogliano i puristi.

    Premesso che tutte le UDF sono Function, non tutte le Function sono UDF:
    una UDF è una Function che può essere richiamata da una cella del foglio.

    Prendiamo l'UDF pigreco()

    Public Function pigreco() as Double
    pigreco = 3.14
    End Function


    possiamo, ad esempio, in A1 scrivere =pigreco() e nella cella A1 otterremo 3,14.

    Ma se modifichiamo la nostra UDF così:

    Public Function pigreco() as Double
    pigreco = 3.14
    ActiveCell.Offset(0, 1).Value = pigreco
    End Function

    cercando di fargli scrivere qualcosa in una cella, ecco che non funziona più (restituirà #VALORE!), cioè non è più una UDF ma una semplice Function, infatti se la chiamiamo da codice:

    Public Sub prova()
    Dim pg As Double
    pg = pigreco()
    MsgBox pg
    End Sub


    funziona, fa quello che le abbiamo detto di fare (anche se non ha senso).

    Quindi
    cit. V.F.: "..... ma si richiamano come fossero formule (nota bene: per essere usate così le function devono essere inserite in un modulo, e non nel codice di un foglio, e non devono essere dichiarate Private)"
    aggiungerei che per essere usate così (UDF n.d.r.) le function non devono cercare di modificare le celle ma semplicemente limitarsi a restituire un valore.


    P.S. @Vecchio Frac: perdona l'abuso di tag html, ma mi sembra che rendano più facile capire quanto esposto.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Vecchio Frac data: 29/01/2015 08:49:06

    Infatti nè le function nè le udf (@lisa: funzioni definite dall'utente) sono studiate per modificare un valore esterno, ma solo per restituire il risultato di un'elaborazione.
    Non userei mai una function come un sub.
    Ci sono articoli interessanti dell'amico nick r su questo tema.
    Sull'uso dei tag html, mi sono già esposto, io non sono d'accordo, ma pazienza.





  • di scossa data: 29/01/2015 09:00:40

    cit. V.F.: "Non userei mai una function come un sub. "

    Ovviamnete la mia precisazione era per Lisa e altri utenti meno esperti.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Lisa B. (utente non iscritto) data: 29/01/2015 09:08:46

    Grazie ragazzi

    Questo forum vale ORO



  • di Lisa B. (utente non iscritto) data: 29/01/2015 16:22:22

    Rer curiosità... tornanto ai primi messaggi di Lepat...

    Come si inserisce un richiamo ad una SUB o FUNCTION in una SUB?

    Nel mio caso... come faccio a far si che la sub/function venga lanciata ogni volta che cambio foglio?



  • di Vecchio Frac data: 29/01/2015 21:02:06

    Basta semplicemente chiamare la sub o la function per nome passando eventualmente i parametri richiesti (nel caso della function, assegnandola a una variabile). Per compatibilità con i Basic più vecchi è consentito anche l'uso dell'istruzione Call (con le sub).
    Nel tuo caso, nel codice destinato all'evento Activate del foglio desiderato, richiami la sub o la function come segue.
     
    Option Explicit
    
    Private Sub Worksheet_Activate()
        'se è una subroutine:    
        mia_sub
        'oppure:
        'call mia_sub
        
        'se è una function:
        (nb! se usi option explicit, dichiarare x a inizio sub mediante dim x as ...)
        'x = mia_func()
    End Sub