La mia 1 MACRO



  • La mia 1° MACRO
    di Lisa B. (utente non iscritto) data: 20/02/2015 15:41:20

    AMICI GRAZIE DI CUORE.... Sino a poco tempo fa nemmeno ne ero a conoscenza dell'esistenza...

    Oggi GRAZIE A VOI, ALLA VOSTRA PAZZIENZA, AI VOSTRI AIUTI ma sopratutto ALLA VOSTRA DISPONIBILITA'... ho scritto di mio pugno la mia 1° macro...

    GRAZIE CI VERO CUORE A CHI SINO AD OGGI MI HA SEMPRE AIUTATO.

    Vi mostro la nacro... semplice confronto alle vostre ma... utile, veloce e funzionale
     
    Sub INPUTBOX_IMPOSTA_ANNO_MENSILE_A_e_B()
        
        Sheets("Mensile_A").Select
        ActiveSheet.Unprotect
        
        ANNO = InputBox("Scrivere l'anno da impostare", "Immissione", 2016)
        
        Range( _
            "V1:AS2,V18:AS19,V35:AS36,V52:AS53,V69:AS70,V86:AS87,V103:AS104,V120:AS121,V137:AS138,V154:AS155,V171:AS172,V188:AS189" _
            ) = ANNO
            
        Range("D7").Select
        
        ActiveSheet.Protect, DrawingObjects:=True, Contents:=True, Scenarios:=True
            
        Sheets("Mensile_B").Select
        ActiveSheet.Unprotect
        
        Range( _
            "V1:AS2,V30:AS31,V59:AS60,V88:AS89,V117:AS118,V146:AS147,V175:AS176,V204:AS205,V233:AS234,V262:AS263,V291:AS292,V320:AS321" _
            ) = ANNO
            
        Range("D7").Select
        
        ActiveSheet.Protect, DrawingObjects:=True, Contents:=True, Scenarios:=True
          
        MsgBox "Anno " & ANNO & " correttamente impostato su MENSILE_A e MENSILE_B"
          
    End Sub



  • di scossa data: 20/02/2015 16:12:44

    Brava Lisa!

    Però c'è sono due cosa che dovresti imparare da subito:
    - dichiarare le variabili
    - evitare il metodo Select e la proiprietà Selection: non servono quasi mai e sono fonte di facili errori.

    Per il primo punto usa Option Explicit.
    Per il secondo, basta che guardi, nel riquadro sotto, come si possono modificare le prime due istruzioni che hai scritto (ricordati anche della "paternità" degli oggetti).


    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)

     
        Sheets("Mensile_A").Unprotect
    



  • di Vecchio Frac data: 20/02/2015 16:20:32

    +1 per Lisa :o)





  • di alfrimpa (utente non iscritto) data: 20/02/2015 16:34:57

    Brava Lisa, avanti così

    Alfredo





  • di Lisa B. data: 20/02/2015 16:51:29

    Grazie a tutti di vero ❤

    🙌 V.Frac... Sono già a +2

    Grazie Scossa... Ancora non ho cspito l'utilità e la funzionalità di Option Explicit... Quando usarlo e quando no... Anche xche' non so cosa cambi...
    Se puoi... Potresti spiegarmelo? Ho visto il tuo post in evidenza mah... Non mi sembra il mio caso.



  • di lepat (utente non iscritto) data: 20/02/2015 17:19:10

    te lo spiego io anche se sono il meno indicato, come hai visto dal post in evidenza è meglio dichiarare sempre le vaiabili, però potresti dimenticartene qualcuna, ebbene option esplicit ti obbliga a farlo, se non lo fai ti dà errore



  • di Lisa B. (utente non iscritto) data: 20/02/2015 18:22:08

    Grazie...

    Quindi nel mio caso... non essendoci variabili, potrei anche non utilizzarlo.... giusto??




  • di Vecchio Frac data: 20/02/2015 18:32:39

    "Option Explicit" si chiama, tecnicamente, "direttiva al compilatore". E' un'istruzione importante perchè istruisce il compilatore a essere preallarmato sul fatto che un certo spazio di memoria sia riservato ("allocato") per ospitare un certo quantitativo di dati cui viene assegnato un riferimento. Questo riferimento viene assegnato a un certo identificatore composto da lettere e numeri che chiamiamo "variabile" (se durante l'esecuzione può mutare il suo valore) o "costante" (se il suo valore e tipo vengono determinati dal programmatore e ne viene proibito un ulteriore riassegnamento).
    Il vantaggio di essere costretti a dichiarare in anticipo il nome delle variabili (e costanti) che si utilizzeranno, nonchè come corollario anche il loro tipo, sta nel fatto che durante la vita del programma ti viene impedito di utilizzare variabili non inizializzate e quindi ti garantisce di non commettere errori di battitura perchè ogni nome di variabile non DIMensionato non viene accettato.
    Un esempio.
    Nel programma hai una variabile chiamata "pippo" e non usi la dichiarazione di variabili obbligatoria. Se da qualche parte nel programma scrivi "pipp" oppure "piipo" oppure "pipp0" (zero finale invece che "o"), il programma continua indisturbato ma crea una nuova variabile e la imposta a un valore vuoto oppure zero, dipende dal contesto. Un disastro dal punto di vista logico, che porta a risultati inattesi perchè non usi più il valore assegnato a "pippo" ma un valore vuoto che come minimo sballa il risultato finale.

    Quindi: dichiarazione di variabili obbligatoria (Strumenti >> Opzioni >> Editor --> check su dichiarazione di variabili obbligatoria) e Option Explicit in testa a *ogni* modulo, sempre.
    Una variabile si dichiara con la parola chiave DIM e ha visibilità all'interno della procedura (sub o function) cui si riferisce. E' meglio per leggibilità dimensionare (dichiarare) le variabili in testa al codice e non sparpagliando i Dim nel corpo della procedura, pur non essendo questo influente sulle prestazioni.

    Una variabile può avere visibilità limitata al modulo cui è dichiarata (dichiarando la variabile "Private variabile" prima di ogni altra sub e function) oppure globale e comune d ogni altro oggetto del file (dichiarandola "Public" prima di ogni altra sub e function e all'interno di un modulo: quindi non all'interno di un codice del foglio).

    Qui ora si aprirebbe la grande partita dei tipi di dato... ma ne parleremo un'altra volta :o)





  • di Vecchio Frac data: 20/02/2015 18:34:24

    cit. "non essendoci variabili, potrei anche non utilizzarlo.... giusto?? "
    ---> La direttiva Option Explicit non è strettamente necessaria per l'esecuzione di un programma. Quindi a rigore di logica la risposta alla tua domanda è "sì". Ma nella pratica non si programma mai senza usare variabili (e/o costanti). Quindi la risposta vera sarà "no, meglio dichiarae comunque Option Explicit".





  • di lepat (utente non iscritto) data: 20/02/2015 19:25:19

    Una variabile l'hai utilizzata, ANNO



  • di Vecchio Frac data: 20/02/2015 20:54:32

    Già già :o)

    ANNO = InputBox("Scrivere l'anno da impostare", "Immissione", 2016)







  • di Lisa B. (utente non iscritto) data: 20/02/2015 21:09:10

    MAh... le varianti non sono IF... ELSE... FOR...



  • di alfrimpa (utente non iscritto) data: 20/02/2015 21:12:42

    No quelli sono i cicli (ma ce ne sono anche altri).

    Alfredo





  • di Lisa B. (utente non iscritto) data: 20/02/2015 21:13:40

    BELLISSIMA spiegazione V.Frac..... GRAZIE.... L'ho letta dopo aver postato il mio ultimo ora penultimo messaggio...

    GRAZIE ancora una volta!!!!!!!!!!!!!!!!!!!!!!!!!!



  • di Lisa B. (utente non iscritto) data: 20/02/2015 21:15:14

    Grazie Alfredo... Avete una pazzienza D'ORO...

    GRAZIE DELLE SPIEGAZIONI... SIETE UNA MINIERA D'ORO!!!!!!!!!!!!!!!



  • di Lisa B. (utente non iscritto) data: 20/02/2015 21:19:55

    Se si hanno MODULI con più SUB... Option Explicit va dichiaarato prima di ogni SUB o solo all'inizio del modulo?



  • di alfrimpa (utente non iscritto) data: 20/02/2015 21:31:16

    No solo all'inizio di ogni modulo.

    Come dice Vecchio Frac:

    Quindi: dichiarazione di variabili obbligatoria (Strumenti >> Opzioni >> Editor --> check su dichiarazione di variabili obbligatoria) e Option Explicit in testa a *ogni* modulo, sempre.

    Alfredo





  • di Vecchio Frac data: 20/02/2015 21:47:19

    cit. "le varianti non sono IF... ELSE... FOR ?"
    ---> Stavolta ci ho messo un po'... ma ho capito cosa volevi dire... si dice "variabile" e non "variante" :o)
    E il resto che hai citato sono istruzioni (statements): il costrutto IF...THEN...ELSE serve a far prendere decisioni al programma, il FOR...NEXT introduce un blocco ciclico (un "ciclo", un "loop").
    Le variabili sono solo quelle che il programmatore destina a contenere un valore; e c'è un corollario importante... non possono essere utilizzate come nomi di variabili e costanti le "parole chiave" anche dette "riservate" (le istruzioni, gli statements), per cui non puoi scrivere ad esempio "for = 3".





  • di Lisa B. (utente non iscritto) data: 20/02/2015 23:14:26

    GRAZIE ancora una volta.................



  • di Lisa B. data: 21/02/2015 02:00:44

    Ho modificato in questo modo.... mah... se il comando
    Sheets("Mensile_A").Unprotect "psw"
    lo lascio cosi mi da errore di runtime 1004 con la dicitura .... La cella o grafico che stai tentando di modificare è protetto..... e mi evidenzia questa stringa
    Range("V1:AS2,V30:AS31,V59:AS60,V88:AS89,V117:AS118,V146:AS147,V175:AS176,V204:AS205,V233:AS234,V262:AS263,V291:AS292,V320:AS321") = ANNO

    se lo imposto come prima invece... tutto funziona e va a buon fine... come mai?
     
    Option Explicit
    
    Sub INPUTBOX_IMPOSTA_ANNO_MENSILE_A_e_B()
     
        Dim ANNO As Variant
       
        Sheets("Mensile_A").Unprotect "psw"
        
        ANNO = InputBox("Scrivere l'anno da impostare", "Immissione", 2016)
        
        Range( _
            "V1:AS2,V18:AS19,V35:AS36,V52:AS53,V69:AS70,V86:AS87,V103:AS104,V120:AS121,V137:AS138,V154:AS155,V171:AS172,V188:AS189" _
            ) = ANNO
            
        Range("D7").Select
        
        ActiveSheet.Protect "psw", DrawingObjects:=True, Contents:=True, Scenarios:=True
            
        Sheets("Mensile_B").Unprotect "psw"
        
        Range( _
            "V1:AS2,V30:AS31,V59:AS60,V88:AS89,V117:AS118,V146:AS147,V175:AS176,V204:AS205,V233:AS234,V262:AS263,V291:AS292,V320:AS321" _
            ) = ANNO
            
        Range("D7").Select
        
        ActiveSheet.Protect "psw", DrawingObjects:=True, Contents:=True, Scenarios:=True
          
        MsgBox "Anno " & ANNO & " correttamente impostato su MENSILE_A e MENSILE_B"
          
    End Sub



  • di Lisa B. data: 21/02/2015 02:04:34

    Considerazione...

    Secondo me la dicitura

    Sheets("Mensile_A").Unprotect "psw"

    non è uguale alla dicitura

    Sheets("Mensile_A").Select
    ActiveSheet.Unprotect

    Il primo caso mi toglie la protezione al foglio MENSILE_A
    Il secondo caso... VA sul folgio MENSILE_A e gli toglie la protezione...

    Sbaglio???

    Se è cosi... cosa serve accorciare il comando se poi non va nel foglio in cui deve andare e devo aggiungere un nuovo comando???



  • di Lisa B. data: 21/02/2015 02:30:34

    Mi auto cito...

    Ho modificato in questo modo.... mah... se il comando
    Sheets("Mensile_A").Unprotect "psw"
    lo lascio cosi mi da errore di runtime 1004 con la dicitura .... La cella o grafico che stai tentando di modificare è protetto..... e mi evidenzia questa stringa
    Range("V1:AS2,V30:AS31,V59:AS60,V88:AS89,V117:AS118,V146:AS147,V175:AS176,V204:AS205,V233:AS234,V262:AS263,V291:AS292,V320:AS321") = ANNO

    se lo imposto come prima invece... tutto funziona e va a buon fine... come mai?

    In pratica tenta di scrivere il valore ANNO sul RANGE in MENSILE_A

    e ovviamente mi da l'errore

    Quindi...

    Trovo inutile modificare il comando

    Sheets("Mensile_A").Select
    ActiveSheet.Unprotect

    o

    Sheets("Mensile_B").Select
    ActiveSheet.Unprotect

    in

    Sheets("Mensile_a").Unprotect

    o

    Sheets("Mensile_B").Unprotect

    in quanto se mi trovo su un foglio diverso da Mensile_A mi scrive nel range del foglio in cui mi trovo.... e poi si blocca...
    Se sono nel foglio Mensile_A mi scrive la prima parte poi si blocca...

    Dico bene???



  • di Lisa B. data: 21/02/2015 03:05:41

    mmm mi sta venendo un dubbio...

    Dim nel mio caso non è Variant ma String... giusto?



  • di lepat (utente non iscritto) data: 21/02/2015 08:09:19

    Scossa ha detto
    - evitare il metodo Select e la proiprietà Selection: non servono quasi mai e sono fonte di facili errori.

    quasi mai non è = mai
    in alcuni casi select è necessario e conveniente



  • di Lisa B. (utente non iscritto) data: 21/02/2015 10:56:31

    Mi ha anche specificato di sostituire la mia stringa con la sua senza select



  • di Vecchio Frac data: 21/02/2015 11:20:33

    Si tratta sempre di qualificare correttamente i range cui ci si riferisce.

    cit. "Secondo me la dicitura
    Sheets("Mensile_A").Unprotect "psw"
    non è uguale alla dicitura
    Sheets("Mensile_A").Select
    ActiveSheet.Unprotect "

    ---> Sono istruzioni, non "diciture". E il ragionamento che fai è *corretto*.

    Le righe seguenti:
    Sheets("Mensile_A").Unprotect "psw"
    Range("V1:AS2,V30:AS31,V59:AS60,V88:AS89,V117:AS118,V146:AS147,V175:AS176,V204:AS205,V233:AS234,V262:AS263,V291:AS292,V320:AS321") = ANNO


    ti *possono* dare errore se il foglio attivo NON E' il foglio Mensile_A e se il foglio attivo E' attualmente protetto.

    Il punto focale non è il Protect o l'UnProtect ma il Range, che deve puntare al foglio sprotetto affinché possa funzionare:
    Sheets("Mensile_A").Unprotect "psw"
    Sheets("Mensile_A").Range("V1:AS2,V30:AS31,V59:AS60,V88:AS89,V117:AS118,V146:AS147,V175:AS176,V204:AS205,V233:AS234,V262:AS263,V291:AS292,V320:AS321") = ANNO


    La differenza è chiara? o è Lisa? :o)

    cit. "Dim nel mio caso non è Variant ma String... giusto?"
    ---> Non ti sei espressa in modo comprensibile. Cosa intendi dire? Dim è un'istruzione che assegna un tipo di dato, non può "essere" di un qualche tipo.

    cit. "Mi ha anche specificato di sostituire la mia stringa con la sua senza select "
    ---> Non è chiaro il meccanismo?

    cit. "Mah"
    ---> Usi spesso questa interiezione dubitativa al posto di "ma" che è invece una congiunzione: la prima introduce un periodo caratterizzato dalla perplessità, la seconda raccorda due frasi logiche di cui la seconda si suppone in contrasto con la prima. Quando vedo "mah" non mi aspetto un proseguimento del discorso legato al precedente periodo, che invece spesso avviene, e quindi devo reinterpretare tutto il ragionamento in funzione di questo :o)






  • di Lisa B. (utente non iscritto) data: 21/02/2015 12:35:27

    Scusa V Frac... Come da te proposto dico di sproteggere foglio a, di copiare anno su foglio a...
    Nel mio vado in foglio a, sproteggo e copio...

    Cosa cambia??? Nulla direi



  • di scossa data: 21/02/2015 13:42:15

    cit. LisaB: "(scossa) Mi ha anche specificato di sostituire la mia stringa con la sua senza select"

    Ma ho anche detto "ricordati anche della 'paternità' degli oggetti" .....



    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: 21/02/2015 14:04:22

    cit. Lisa: "Cosa cambia??? Nulla direi"
    ---> No, non cambia nulla (in questo caso). E' solo un diverso /stile/ di programmazione. Risparmio un po' di scrittura di codice (soprattutto se raggruppo il riferimento al foglio "mensile_A" con With).
    Quand'è che cambierebbe?
    - A volte non voglio che l'utente *veda* il foglio su cui faccio delle operazioni: selezionandolo, viene mostrato all'utente.
    - E se avessi del codice che viene eseguito all'attivazione del foglio, selezionandolo verrebbe eseguito.

    cit. scossa: "ricordati anche della 'paternità' degli oggetti" ..
    ---> @Lisa, ogni oggetto dipende da un oggetto superiore (l'oggetto da cui un oggetto dipende si chiama "padre": spesso esposto da una proprietà .Parent). La gerarchia degli oggetti si evidenzia con la notazione punto:
    nel frammento di codice Activesheet.Range("A1").Font.Name = "Courier New" il "padre" (Parent) di ogni membro è quello che lo precede. Quindi Activesheet è il padre di Range, e anche se non è espresso, un Activeworkbook è il padre di Activesheet. Qualificare pienamente un oggetto garantisce al compilatore senza possibilità di errore che ti riferisci a quell'oggetto e non ci sono equivoci.






  • di Lisa B. (utente non iscritto) data: 21/02/2015 17:30:07

    Ora ho capito cosa vuol dire Paternità degli oggetti

    Grazie per la SANTA pazienza che avete... VI SONO DAVVERO GRATA



  • di Vecchio Frac data: 21/02/2015 17:40:41

    E' gratificante vedere che le persone ti ascoltano, si impegnano, provano e magari sbagliano anche, e chiedono quando non capiscono. La soddisfazione è vedere che quello che scrivi e dici, cioè l'esperienza che cerchi di trasmettere, non cade in un pozzo profondo. Quindi alla fine, grazie a te :o)





  • di alfrimpa (utente non iscritto) data: 21/02/2015 17:53:54

    Che bella risposta che hai dato Vecchio Frac.

    È questo, a mio avviso, il principale obiettivo che devono avere i forum come questo: la crescita dei suoi utenti e non la fornitura della "pappa pronta".

    Chi ha acquisito conoscenze (molte o poche che siano) lo ha fatto a costo di studio, lavoro e tempo per cui si aspetta, giustamente, che il suo sforzo sia ripagato; e questo è il miglior modo per farlo.

    Alfredo



  • di Vecchio Frac data: 21/02/2015 17:59:48

    Questo però lo si capisce generalmente solo dopo aver superato gli anta :o)






  • di alfrimpa (utente non iscritto) data: 21/02/2015 18:34:23

    Ed io li ho superati da parecchio

    Sarà per questo?

    Alfredo





  • di Lisa B. (utente non iscritto) data: 22/02/2015 00:02:18

    Io ancora non ci sono agl'anta... Ma vi STIMO e RINGRAZIO con tutto il cuore!!!

    SIETE FANTASTICI!!!!!!



  • di Mauro data: 22/02/2015 07:40:57

    Scusate se mi intrometto, il mio sembrerà.un intervento a gamba tesa, ma nel leggere questa discussione sono così gratificato che non riesco a starmene in disparte! Questa discussione racchiude veramente lo spirito del forum: pazienza nelle spiegazioni da parte degli utenti esperti, umiltà e gratitudine di chi recepisce l'informazione, e tanta cordialità. Questo è l'excelvba.it che mi piace! Continuate così! Grazie



  • di lepat (utente non iscritto) data: 22/02/2015 08:57:03

    non capita spesso trovare un utente che ha voglia di imparare, la maggior parte vuole risolvere il problema e basta



  • di Mauro data: 22/02/2015 10:11:32

    È vero molto utenti ragionano così. In effetti il forum si divide in 2 categorie di utenti. Chi chiede aiuto e chi risponde , che sono i soliti e pochi che si prestano e che io chiamo esperti. Chi chiede non deve aspettarsi la pappa pronta ma chi risponde deve cercare di far fare un percorso all'utente inesperto, in modo che l'utente capisca e soprattutto che la discussione aperta abbia un senso per chi la legge. Il tutto in un contesto di cordialità. Scusate se vado OT. Forse la questione andrebbe discussa in Area 51.



  • di alfrimpa (utente non iscritto) data: 22/02/2015 11:22:12

    Perdonate l'ignoranza ma cos'è Area 51

    Alfredo





  • di Mauro data: 22/02/2015 11:27:10

    È un'area riservata agli utenti iscritti che più si impegnano nel forum, utile per discutere le linee guida e per i test.



  • di Lisa B. data: 22/02/2015 16:24:20

    Ciao Mauro... Grazie x l'intervento e x aver creato questo magnifico forum...

    Mi chiedevo... Ti è arrivata la mia donazione di qualche giorno fa?



  • di Mauro data: 22/02/2015 16:29:20

    Certo! Approfitto per ringraziarti. Con la tua donazione hai contribuito a finanziare la nostra comunità



  • di Vecchio Frac data: 22/02/2015 21:36:29


    Grazie Lisa, naturalmente, anche da parte mia!





  • di Lisa B. data: 23/02/2015 00:19:24

    Sono io che ringrazio voi!!!!

    Chiudo qiesta discussione

    Ora siamo alla seconda