Alexsandra

WinGirls
  • Numero contenuti

    61
  • Iscritto

  • Ultima visita

Su Alexsandra

  • Livello
    Apprendista

Contact Methods

  • ICQ
    0

Profile Information

  • Sesso
    Femmina
  • Località
    Verona
  1. Prova a fare un cerca da win e cancella il file Normal, al riavvio di word verrà ricreato. è probabile che tu abbia una macro nel normal.
  2. VBA : Le Userform :: Parte 1 Finora abbiamo visto come utilizzare delle finestre di dialogo che VBA mette a disposizione tramite le funzioni MsgBox e InputBox, sebbene queste funzioni possano garantire ad un programma un’ottima funzionalità il loro utilizzo è abbastanza limitato. Durante lo sviluppo di programmi più complessi è indispensabile usare finestre di dialogo, che permettano all’utente di selezionare più opzioni, scegliere elementi da una lista o digitare valori diversi, in pratica per incrementare la funzionalità del programma è necessario utilizzare finestre di dialogo personalizzate che ci permettano di velocizzare le nostre procedure, in questo contesto VBA ci mette a disposizione l’oggetto Userform(Finestre Utente) che ci permette la creazione e la manipolazione di finestre di dialogo personalizzate all’interno di programmi o procedure. Utilizzando le Userform, è possibile costruire finestre personalizzate per visualizzare dati, o richiedere all’utente la digitazione di valori, utilizzando la logica che abbiamo impostato per la corretta esecuzione del programma, per esempio possiamo mostrare una finestra di dialogo, che mette a disposizione una serie di formati data, obbligando l’utente alla scelta di un solo formato tra quelli mostrati. In sostanza le finestre di dialogo permettono al programma di interagire con l’utente in modo più “sofisticato” e forniscono uno strumento versatile per svolgere le normali funzioni di Input e Output. L’oggetto Userform è una finestra di dialogo vuota e contiene una barra del titolo e un pulsante di chiusura, aggiungendo controlli a un oggetto di tipo Userform è possibile personalizzare l’aspetto e la funzionalità della finestra di dialogo. Ogni oggetto Userform possiede proprietà, metodi e risponde ad eventi, tutti ereditati dall’oggetto Userform, inoltre ogni oggetto Userform incorpora un modulo nel quale l’utente può aggiungere i propri metodi e proprietà e nel quale può scrivere il codice che risponde ad eventi della finestra. Cosa significa questo? Significa che possiamo definire evento qualsiasi cosa si verifichi all’interno della finestra di dialogo o in un suo controllo, tipici esempi di evento sono la pressione di un pulsante di comando o la selezione di una casella di controllo. Altri eventi possono includere la modifica di una casella di testo o la selezione di una lista, i clic del mouse, la pressione dei tasti e altre azioni interne attivano gli eventi. Gli oggetti utilizzati (finestre e controlli) rendono disponibile una serie di eventi, è quindi possibile scrivere procedure VBA che rispondono a questi eventi. Queste procedure vengono denominate Procedure di evento come per esempio la pressione di un pulsante di comando, la procedura di evento contiene tutte (e solo) le azioni da eseguire in relazione all’evento, altro esempio può essere la chiusura di una finestra tramite il pulsante di chiusura la procedura di evento viene eseguita in aggiunta all’azione causata dall’evento (in questo caso la chiusura della finestra di dialogo) Userform: Come crearle Per inserire in un file di Excel una Userform la procedura è abbastanza semplice, entriamo nell’editor del VBA (premiamo i tasti ALT+F11) e ci comparirà una schermata come la seguente Fig. 1 Tralasciamo per il momento l’area bordata di rosso che il suo contenuto varia dal tipo di software installati che si interfacciano con il pacchetto Office, poco sotto vediamo il nostro file VBAProject (lezione8.xls) che contiene i fogli del nostro file, inoltre vediamo anche un altro modulo (ThisWorkbook) che rappresenta e corrisponde all’intero file (lezione8.xls), poco sotto compare una finestra (Finestra delle Proprietà) evidenziata dalla freccia rossa. Per creare una Userform seguiamo questo percorso Inserisci > Userform Fig. 2 Come evidenziato in figura e di seguito ci compare una finestra come questa Fig. 3 Possiamo notare che nella finestra di destra ci è comparsa una Form vuota e a sinistra vediamo un box (Casella degli strumenti) che ci permette di inserire i vari controlli all’interno della nostra Userform. La Userform ora è creata, possiamo modificarla a piacere, basta posizionarsi in un angolo (inferiore destro) e trascinare il mouse tenendo premuto il tasto sinistro e rilasciarlo quando abbiamo raggiunto le dimensioni desiderate. Il metodo più semplice per controllare un oggetto Userform è utilizzando i Metodi e le Proprietà predefinite della classe Userform e scrivere le procedure evento per la gestione della finestra e dei controlli in essa contenuti, i metodi più comuni da utilizzare sono: Copy – Cut – Hide – Paste – PrintForm – Repaint – Show Inoltre l’oggetto Userform dispone anche di eventi che sono i seguenti Activate – Click – DblClick – Deactivate – Initialize – Terminate Come vedete sono diversi, per il momento ci fermeremo a quelli più usati, iniziamo dai metodi cioè: Hide e Show e vediamo il loro significato. Hide : Nasconde la finestra di dialogo (la Userform) senza liberare la memoria associata all’oggetto, in questo modo vengono mantenuti i valori nei vari controlli contenuti in essa Show : Rende visibile la finestra sullo schermo, se la finestra non è caricata in memoria, viene effettuato il caricamento Inoltre VBA fornisce due comandi che sono molto utili quando usiamo l’oggetto Userform, i comandi sono Load e Unload, questi comandi possono essere utilizzati per caricare l’oggetto in memoria e per liberare la memoria se occupata dall’oggetto. La sintassi per questi comandi è la seguente: Load Oggetto Unload Oggetto In questo enunciato Oggetto rappresenta un riferimento valido ad un oggetto di tipo Userform, con il comando Load carichiamo l’oggetto in memoria, ma non lo rende visibile sullo schermo, e con il comando Unload lo scarichiamo dalla memoria. Abbiamo appena detto che con Load carichiamo l’oggetto in memoria, ma non lo portiamo a video, inneschiamo solo l’evento Initialize (che vedremmo più avanti) della Userform ma per poter vedere l’oggetto sullo schermo dobbiamo usare il comando Show, l’enunciato è il seguente Userform1.Show Pertanto se vogliamo far comparire una finestra di dialogo a video dovremmo lanciare il comando Show, ma come facciamo? Una volta creata la Form abbiamo a disposizione solo metodi ed eventi, ma tutti riferiti all’oggetto Userform, mentre a noi serve un altro procedimento che veicoli la nostra finestra di dialogo. Se diamo uno sguardo al nostro progetto guardando nella finestra di sinistra noteremo la comparsa dell’oggetto Userform: Fig. 4 Vediamo che la Form è presente, ma abbiamo appena visto che deve essere veicolata per poter renderla visibile, un sistema per ottenere questo è il seguente: dal menù file seguiamo questo percorso Inserisci > Modulo Fig. 5 E nella finestra di progetto ci comparirà la nuova operazione eseguita Fig. 6 A questo punto clicchiamo sulla voce “Modulo1” e nella finestra di sinistra digitiamo il seguente codice Sub Mostra() Userform1.Show End sub Associamo ora la nostra macro ad un pulsante sul foglio di lavoro (vedi Lezione 2) e premendo sul pulsante comparirà a video la nostra Userform. Ora abbiamo creato la nostra finestra di dialogo e siamo riusciti a portarla a video, fatte le nostre operazioni sulla form la possiamo “chiudere” usando il comando Unload. Il comando Unload và messo all’interno della Userform, associato ad un pulsante di uscita dalla stessa, la sintassi è la seguente: Unload Me Vediamo ora la finestra della casella degli strumenti, noterete che l’etichetta del tab riporta il nome di controlli e sono rappresentati dalle varie icone presenti nel box, vediamo cosa rappresentano e come si usano, per farvi comprendere meglio quali siano i controlli li ho raggruppati in questa immagine con il relativo nome e una breve descrizione Fig. 6 Fig. 7
  3. La Funzione MsgBox La funzione MsgBox() ci permette di mostrare a video un box che riporterà un avviso permettendo così all’utente di scegliere l’operazione più idonea da eseguire, questo comando ci è utile quando stiamo per mandare in esecuzione una determinata procedura e vogliamo ottenere il consenso dall’utente. Inoltre la possiamo usare nella gestione degli errori, ci può avvisare e impedire l’esecuzione di una routine che porterebbe il programma alla generazione di un errore con conseguente blocco dell’esecuzione del nostro progetto, oppure può chiederci una ulteriore conferma per operazioni “delicate” - tipo cancellazione di file - in sostanza è una funzione che ci permette di comunicare da vicino con l’applicazione che stiamo usando. Nella Lezione 3 abbiamo visto marginalmente l’uso di Msgbox , in questa lezione cercheremo di approfondire le sue potenzialità e il suo uso, non ha una sintassi particolarmente difficile ma il suo uso “avanzato” ci permette di controllare le varie procedure e gestire tutti gli eventi che abbiamo istanziato nel nostro programma, in sostanza è una funzione di VBA abbastanza semplice da usare che riporta a video un messaggio con un’icona e dei pulsanti predefiniti, a cui si risponde premendo su uno di essi. La sintassi è la seguente: MsgBox(prompt[, buttons] [, title] [,helpfile ,context]) oppure italianizzando il commando MsgBox(Messaggio[, Pulsanti] [, Titolo] [, Fileaiuto , Contesto]) Dove Prompt o Messaggio : indica il messaggio che sarà visualizzato nelle finestra di dialogo. buttons o Pulsanti : indica il valore numerico dei pulsanti da visualizzare nella finestra di dialogo. Title o Titolo : Indica il titolo della finestra di dialogo e va scritto fra virgolette helpfile, FileAiuto e context o Contesto : sono relativi alla guida dell’applicazione ma non sono indispensabili Ricordiamoci che non abbiamo nessun controllo della posizione in cui verrà visualizzato il Box sullo schermo, vediamo ora qualche esempio: Sub box1() MsgBox "Ciao a tutti" End Sub Questo codice ci riporta a video un messaggio come questo Fig. 1 Come potete vedere abbiamo omesso alcune espressioni nella sintassi appena esposta, ma il nostro box ci appare con il testo che abbiamo inserito, e con la barra del titolo di default [Microsoft Excel], inoltre è possibile anche far apparire il box usando il valore di Variabili oppure possiamo anche usare anche una forma più evoluta e personalizzare il nostro messaggio di avviso come meglio crediamo, vediamone un esempio Sub box2() MsgBox "Ciao a tutti", vbCritical + vbOKOnly, "Funzione MsgBox Semplice" End Sub Che ci riporta a video un messaggio come questo: Fig. 2 Notiamo subito che è cambiato il titolo nella barra della finestra ed è comparsa un’icona rossa con una X bianca, possiamo anche cambiare tipo di icona in questo modo: Sub box3() MsgBox "Ciao a tutti", vbQuestion + vbOKOnly, "Funzione MsgBox Semplice" End Sub E ci verrà riportato a video un messaggio come questo Fig. 3 Vedendo i codici esposti e i vari box che ci sono apparsi possiamo dire che: Prompt: è il messaggio che verrà visualizzato, nel nostro caso è “Ciao a tutti” buttons : è il tipo di pulsante e relativa icona, nel nostro caso è rappresentato dal codice [vbCritical + vbOKOnly] title : è il titolo della finestra, nel nostro caso è "Funzione MsgBox Semplice" Ora però possiamo anche fare un altro “passo avanti” nell’uso di questa funzione, a volte è difficile ricordare tutti i comandi e potremmo usarla anche in un altro modo. Abbiamo detto poco sopra che buttons indica il valore numerico dei pulsanti da visualizzare nella finestra di dialogo, ma finora non abbiamo esposto valori numerici, abbiamo solo rappresentato i pulsanti con delle “parole chiave” tipo: [vbCritical + vbOkOnly, oppure vbQuestion + vbOkOnly ] vediamo questo aspetto modificando il codice finora usato in questo modo : Sub box4() MsgBox "Ciao a tutti", 0 + 16, "Funzione MsgBox Avanzata" ' End Sub L’esecuzione di questo codice ci riporta questo avviso Fig. 4 Come possiamo vedere l’avviso cambia solo nel titolo che abbiamo modificato in “Funzione MsgBox Avanzata” ma il resto del Box è uguale, eppure il codice è rappresentato in maniera diversa, possiamo vedere che non compaiono più le parole chiave usate in precedenza ma abbiamo inserito dei valori numerici separati da virgole e seguiti dal titolo della finestra. A mio avviso usarla in questo modo è molto più semplice da ricordare e avremmo meno codice da scrivere. Esponiamo ora con una tabella come vengono interpretati i valori da VBA, che ci aiuterà nell’interpretazione di quanto finora esposto. L’argomento buttons indica il valore numerico dei pulsanti da visualizzare nella finestra del Box e sono così rappresentati Fig. 5 Sempre a questo argomento possiamo associare un’icona da visualizzare nel Box identificata da un valore numerico seguendo questa tabella: Fig. 6 Abbiamo detto poco sopra che la funzione MsgBox restituisce un valore, questo valore rappresenta il pulsante che abbiamo premuto, infatti come facciamo a sapere quale pulsante, e di conseguenza, quale scelta ha fatto l’utente? Ora dobbiamo fare una piccola parentesi, nelle lezioni precedenti abbiamo sempre esposto MsgBox come un semplice avviso, invece possiamo usarla anche quando dobbiamo prendere delle decisioni [vedi il ciclo IF], in pratica si sta dimostrando l’estrema versatilità di questa funzione, unica cosa è fondamentale sapere quale tasto è stato premuto dall’utente per consentire o negare l’esecuzione di una procedura. A questo punto non diventa solo una semplice funzione che rimanda un avviso, ma prende campo un aspetto più importante, cioè può permettere l’esecuzione di una procedura oppure indicarci quale operazione stiamo per eseguire e richiedere un’ulteriore conferma. Vediamo ora con una tabella quali sono i valori che vengono restituiti da MsgBox e poi con qualche riga di codice ne vediamo il suo uso all’interno di una procedura Fig. 7 In base alla tabella sopra esposta possiamo dire che se l’utente preme il tasto Ok il valore restituito sarà 1, mentre se preme il pulsante Yes il valore restituito sarà 6, di conseguenza possiamo usare la funzione MsgBox anche in altri contesti diversi dal semplice avviso, ma usarla anche per operare delle scelte ed usando le Variabili – come abbiamo detto all’inizio – per ottimizzare sia la funzione ma soprattutto l’uso che ne viene fatto. Vediamo qualche esempio di codice Sub prova() Dim Risp As Integer Risp = MsgBox("Prova funzione MsgBox", 1 + 64, "Funzione MsgBox Avanzata") If Risp = 1 Then MsgBox "Hai schiacciato il pulsante Ok", 1+48, "Funzione MsgBox Avanzata" Else Exit Sub End If End Sub Con il codice sopra esposto ci compare una finestra come questa Fig. 8 E ciccando sul pulsante Ok ci comparirà un messaggio del genere Fig. 9 Credo che sia abbastanza eloquente come solo sostituendo le condizioni da verificare e le procedure da eseguire possiamo utilizzare questa funzione con scopi ben diversi dal solo avviso, ma possiamo integrarla con le scelte che andiamo ad operare nel proseguo del nostro programma, costituendo così un’ossatura stabile e logica del nostro codice sia per quanto riguarda la gestione degli errori che richiedendo conferma all’utente di quanto si appresta a fare e in base alle scelte che effettua indirizzare il flusso del programma nella direzione appropriata
  4. Range, Cells e ciclo With Abbiamo visto nella seconda lezione come è strutturato un foglio di calcolo o cartella, abbiamo detto che è costituito da celle, intervalli e fogli, inoltre un insieme di celle è rappresentato da righe e colonne, ricordando che la maggior parte dei compiti che svolgiamo in un foglio di calcolo è quella di introdurre informazioni, tagliare e copiare dati o applicare opzioni di formattazione e tante altre funzioni che coinvolgono celle, righe o colonne, questo insieme è definito Range. Un Range può essere rappresentato da una singola cella o più celle da una colonna, una riga o una selezione di celle, il sistema più facile per identificarlo è proprio il comando Range che ha questa sintassi Object.Range(nome) Object : è un riferimento all’oggetto Worksheet che contiene il Range, se viene omesso VBA assume che si riferisca all’ActiveSheets (il foglio che abbiamo attivo) Nome : è un riferimento al Range o il nome del Range inserito come testo, infatti questo comando lavora anche con Range che hanno un nome, vediamo qualche esempio Worksheets("Foglio1").Range("A1").Value = 123 Oppure possiamo rappresentarlo come un insieme di celle in questo modo Worksheets("Foglio1").Range("A1:C5").Value = 123 Possiamo usarlo anche con un nome assegnato agendo in questo modo: Selezioniamo un insieme di celle e dal Menu Inserisci - Nome - Definisci, come da immagine sotto Fig. 1 E ci comparirà un box come il seguente Fig. 2 Se abbiamo selezionato prima le nostre celle troveremo il loro riferimento nel campo “Riferito a:” oppure possiamo cliccare sull’icona evidenziata dalla freccia rossa e procedere alla loro selezione, fatto questo dobbiamo solo inserire il nome dell’intervallo e cliccando su “Aggiungi” lo stesso comparirà nel box centrale così: Fig. 3 A questo punto possiamo modificare il nostro listato in questo modo: Worksheets("Foglio1").Range("pippo").Value = 123 Possiamo riepilogare che con il primo codice abbiamo riempito la cella A1 col valore 123, mentre col secondo abbiamo riempito un insieme di celle (dalla A1 alla C5) col valore 123, mentre assegnando un nome ad un intervallo di celle abbiamo riempito tutto l’intervallo col valore 123. Possiamo però dire anche che se siamo certi di operare nel foglio attivo posso omettere il riferimento Object e quanto abbiamo finora visto lo possiamo scrivere anche in questo modo Range("A1").Value = 123 (per la sola cella A1) Range("A1:C5").Value = 123 (per un intervallo di celle) Range("pippo").Value = 123 (utilizzando un nome di un intervallo di celle) Sempre sulla falsa riga di quanto appena citato possiamo ulteriormente semplificare il listato usando riferimenti assoluti in questo modo [A1] = 123 (per la sola cella A1) [A1:C5] = 123 (per un intervallo di celle) [pippo] = 123 (utilizzando un nome di un intervallo di celle) Come abbiamo potuto vedere il comando Range è estremamente flessibile e lo useremo spesso per poter interagire con Excel da VBA ora vediamo come comportarci quando dobbiamo leggere in un foglio e scrivere in un altro. Molte volte abbiamo la necessità di scrivere in un foglio i nostri dati e poterli salvare in un altro foglio per successive consultazioni, useremo sempre l’enunciato Range, ma gli abbineremo anche altre funzioni come Cells e il ciclo With esponiamo ora brevemente la sintassi e l’utilizzo di questi due comandi Cells Anche se possiamo usare il comando Range per riattivare una singola cella il comando Cells esegue lo stesso compito ma con maggior flessibilità, quando dobbiamo scrivere o leggere dati in un foglio di calcolo direttamente da VBA con l’enunciato Range siamo sempre vincolati ad una locazione ben precisa che abbiamo appena visto e denominata dal riferimento di cella, ma non sempre sappiamo dove dobbiamo leggere e scrivere, in sostanza è abbastanza difficile usare il comando Range quando dobbiamo copiare un insieme di dati scritti in varie celle estese su righe o colonne. A questo problema si può ovviare usando il comando Cells, che ha questa sintassi Object.Cells(riga,colonna) Per quanto riguarda il comando Object tralasciamo ulteriori spiegazioni in quanto vale quanto sopra esposto per il comando Range , noterete però che il riferimento al Range (nome) è espresso in coordinate di riga e colonna, questo ci permette di identificare una singola cella o un intervallo dalla loro posizione di riga e colonna, facciamo qualche esempio di identificazione di celle. A1 = Cells (1,1) B5 = Cells (5,2) D3 = Cells (3,4) Vediamo ora il ciclo With e poi sintetizziamo il tutto e uniamo i vari comandi Ciclo With VBA ci fornisce questa speciale struttura With …. End With che ci permette di fare riferimento alle proprietà o metodi che appartengono allo stesso oggetto senza dover specificare ogni volta il riferimento completo all’oggetto, bella come esposizione tecnica ma poco chiara vero? Esponiamo la sintassi del ciclo With e poi semplifichiamo il concetto con degli esempi, la sintassi è: With Oggetto Istruzioni End With Chiarifichiamo ora il tutto, nella lezione due abbiamo parlato di Metodi e Proprietà e anche di Oggetti, abbiamo esposto l'oggetto Workbook (che è la cartella di lavoro cioè il nostro file), l'oggetto Worksheet (che è il foglio di lavoro : Foglio1, Foglio2 ecc...) e l'oggetto Range ( intervallo di celle, A1: B12, C1:D12, ecc...) nella definizione del ciclo With abbiamo detto che ci permette di omettere il riferimento completo all’oggetto (Workbook, Worksheet) quando le proprietà o i metodi che usiamo si riferiscono allo stesso oggetto, infatti basta dichiararlo una sola volta all’inizio della procedura With (vedi sintassi) così la nostra procedura risparmia il tempo che necessita per risolvere il riferimento all’oggetto per ogni proprietà o metodo all’interno dell’istruzione With. Vediamo un esempio e capirete subito come funziona, prendiamo come esempio i dati presenti in un foglio come in figura Fig. 4 Supponiamo di trovarci nel Foglio1 e vogliamo scrivere i nostri dati nel Foglio2, per compiere questa operazione senza l’utilizzo del ciclo With dobbiamo utilizzare un listato del genere: Worksheets("Foglio2").Range("B1").Value = Worksheets("Foglio1").Range("B1").Value Oppure come abbiamo visto poco sopra in questo modo Worksheets("Foglio2").Range("B1").Value = [b1].Value Sheets("Foglio2").[b1].Value = [b1].Value Ma così copiamo una singola cella, dobbiamo utilizzare un ciclo come abbiamo visto nella lezione 5 in questo modo Sub scrivi() riga = 1 Do Until Sheets("Foglio1").Cells(riga, 2) = Empty Sheets("Foglio2").Cells(riga, 2).Value = Sheets("Foglio1").Cells(riga, 2).Value riga = riga + 1 Loop End Sub Dobbiamo utilizzare una sintassi del genere in quanto dobbiamo incrementare il nostro contatore per poter scorrere tutti i dati presenti nel foglio di origine (nel nostro caso il Foglio1) e al tempo stesso incrementare la riga del foglio di destinazione, comunque già in questo listato abbiamo potuto vedere l’utilizzo del comando Cells, credo che sia chiaro come và utilizzato e a cosa serve, in ogni caso possiamo dire che con il comando Cells identifichiamo una cella ben precisa, il nostro problema sta solo nel fatto che dobbiamo dichiarare sempre il riferimento completo sia del foglio di origine che del foglio di destinazione (in presenza di un ciclo) però possiamo ovviare a tutto questo utilizzando il ciclo With in questo modo. Sub scrivi_with() j = 1 Do Until Sheets("Foglio1").Cells(j, 2) = Empty With Sheets("Foglio2") .Cells(j, 2) = Sheets("Foglio1").Cells(j, 2).Value End With j = j + 1 Loop End Sub Apparentemente sembrano uguali, ma col ciclo With abbiamo evitato la dichiarazione dell’oggetto nel ciclo Do Loop, o meglio lo abbiamo fatto una sola volta con notevole risparmio in termini di ricerca dell’oggetto da parte di VBA e semplificando il listato in base a quanto finora citato relativo agli oggetti possiamo anche scriverlo così Sub scrivi_with() j = 1 Do Until Cells(j, 2) = Empty With Sheets("Foglio2") .Cells(j, 2) = Cells(j, 2).Value End With j = j + 1 Loop End Sub A questo punto credo che le principali basi per poter operare siano state esposte ora non ci rimane che addentrarci nelle Userform e vedere come far interagire a fondo il VBA con Excel, inoltre nel proseguo esporremmo anche le funzioni che vengono più utilizzate (come MsgBox, Inputbox etc…) in maniera più avanzata di quanto finora visto nelle lezioni precedenti.
  5. VBA : I Cicli Ora che sappiamo come scegliere diverse azioni basandosi su delle condizioni predeterminate, siamo pronti a vedere come ripetere delle azioni un numero predeterminato di volte se si verifica, o non si verifica una particolare condizione nella nostra procedura. Uno degli svantaggi delle macro è la loro incapacità di ripetere le azioni a meno che le azioni desiderate non vengano registrate ripetutamente, VBA fornisce diverse strutture potenti e versatili per permetterci di ripetere facilmente le azioni e per controllare il modo in cui VBA effettua queste ripetizioni. Le strutture del programma che ripetono l'esecuzione di una o più istruzioni sono chiamate Cicli, alcune strutture per i cicli sono costruite in modo da venire eseguite un numero impostato di volte, e vengono chiamate cicli ad interazione fissa, mentre altri tipi di strutture per i cicli vengono impostate un numero variabile di volte sulla base di alcune condizioni impostate, proprio perchè il numero di ripetizioni di queste strutture non è definito questi cicli vengono chiamati cicli ad interazione indefinita. Sia nelle strutture ad interazione fissa che nelle strutture ad interazione indefinita, ci sono alcune espressioni che determinano quante volte il ciclo viene ripetuto, questa espressione viene chiamata determinante del ciclo, questa espressione in un ciclo ad interazione fissa è quasi sempre una espressione numerica, mentre per i cicli a interazione indefinita la determinante del ciclo è solitamente un'espressione logica che descrive la condizione sotto la quale il ciclo può continuare o interrompere la sua esecuzione, praticamente vengono usate delle espressioni logiche per la determinante dei cicli allo stesso modo in cui sono state usate per prendere delle decisioni in VBA che abbiamo visto nella lezione precedente. Ci sarebbero altri aspetti da spiegare su quanto esposto, ma li ritengo puramente teorici, pertanto possiamo andare avanti con l'esposizione delle parole chiave usate e con qualche esempio, nel proseguo della lezione ritorneremo su questo argomento di costruzione dei cicli e risulterà più facile capirne la logica di operare dopo averne visto qualche esempio. Ciclo For Next La più semplice struttura per i cicli è quella ad interazione fissa, VBA ne fornisce due diverse tipologie che vengono espresse così For ...Next e For ...Each ... Next entrambi i cicli vengono chiamati ciclo For perchè vengono eseguiti per uno specifico numero di volte. Il ciclo For ... Next ha la seguente sintassi For contatore = inizio To fine istruzioni Next contatore contatore viene rappresentato da una qualsiasi variabile numerica, inizio è anch'esso rappresentato da una variabile numerica e specifica il valore iniziale per la variabile contatore, fine è una espressione numerica che rappresenta il valore finale per la variabile contatore. Per default VBA incrementa la variabile contatore di 1 unità ogni volta che esegue le istruzioni di un ciclo, mentre la parola chiave Next indica a VBA che è stata raggiunta la fine del ciclo, inoltre la variabile contatore deve essere la stessa che abbiamo messo appena dopo l'enunciato For. Possiamo però anche specificare un valore diverso per l'incremento del contatore includendo la parola chiave Step [opzionale], in questo caso dobbiamo specificare l'incremento della variabile contatore, e la sintassi diventa così: For contatore = inizio To fine Step passo istruzioni Next contatore In questo caso l'espressione passo viene rappresentata da una espressione numerica e indica la quantità per incrementare la variabile contatore, vediamo qualche esempio Sub for_semplice() For I = 1 To 10 MsgBox (I) Next I End Sub L'esecuzione di questo codice ci porta a video la finestra di messaggio (MsgBox) per 10 volte con il valore della variabile I (contatore) e ci appare così Fig. 1 Se invece vogliamo usare la parola chiave Step e far apparire solo le espressioni dispari possiamo modificare il listato in questo modo Sub for_step() For I = 1 To 10 Step 2 MsgBox (I) Next I End Sub Vedremmo comparire il messaggio di avviso con i soli valori dispari della variabile Fig. 2 Cosa abbiamo fatto con Step, abbiamo modificato l'incremento della variabile da 1 unità (di default) a 2 unità, in pratica alla prima esecuzione del ciclo I vale 1 ma quando incontra la parola chiave Step viene incrementata di 2. Al primo ciclo viene stampato il valore 1, questo perchè I quando incontra la parola chiave Step vale ancora 1, per cambiare valore deve arrivare alla parola chiave Next (che abbiamo detto essere quella che avvisa di essere arrivati alla fine del ciclo e che incrementa la variabile). In ultima analisi l'enunciato For viene interpretato così : For I [Per I] = 1 To 10 [che và da 1 a 10] Step 2 [incrementa di 2], Esegui le istruzioni , Next I [incrementa il valore di I], Il ciclo For ..Next ha la flessibilità di poter incrementare e decrementare la variabile, possiamo modificare il listato da For I = 1 To 10 Step 2 a For I = 100 To 1 Step -2 pertanto le possibilità di impiego sono abbastanza vaste, possiamo eseguire somme, incrementare e decrementare il valore delle variabili, utilizzare la ciclicità per ogni bisogno che richieda il nostro programma fermo restando i principi di impiego esposti all'inizio. Esiste anche un'altra forma di ciclo ed è il ciclo For Each ..Next adesso è prematuro affrontare l'argomento, più avanti quando avremmo visto le matrici ed altri elementi ritorneremo sull'argomento comunque si esprime in questa forma For Each elemento In gruppo Istruzioni Next [elemento] molto brevemente possiamo descrivere così l'enunciato: elemento è una variabile usata per interare il ciclo (allo stesso modo che abbiamo visto sopra), gruppo è una collezione di oggetti o un vettore (matrice), questa tipo di ciclo ha meno opzioni del ciclo For Next, l'incremento del contatore non è rilevante in questo ciclo, perchè viene sempre eseguito tante volte quanti sono gli elementi presenti nel gruppo specificato, per il momento tralasciamolo e vediamo un altro metodo molto più versatile : il ciclo Do Loop Ciclo Do Loop Abbiamo parlato all'inizio di due tipi di cicli, quelli ad interazione fissa e quelli ad interazione indefinita, il ciclo Do Loop appartiene ai cicli ad interazione indefinita, VBA ci fornisce questa istruzione estremamente potente per costruire strutture cicliche indefinite nelle nostre funzioni o procedure. Essenzialmente è costituito da una singola istruzione: Do. Questa istruzione ha molte opzioni ed è talmente flessibile che ci fornisce quattro diverse possibilità per costruire dei cicli raggruppati in due diverse categorie di base, che sono i cicli controllati da un contatore e i cicli controllati da eventi, quale è la differenza? In un ciclo controllato da un contatore, le istruzioni del corpo del ciclo vengono eseguite finchè il valore è inferiore o superiore al limite specificato, in sostanza non varia molto dal ciclo For ..Next, eccetto che il programmatore è direttamente responsabile per l'inizializzazione della variabile contatore e per l'incrementazione o decrementazione del contatore. Potremmo usare il ciclo Do se il passo del contatore non è regolare, o se non c'è modo di determinare il limite finale se non dopo che il ciclo ha iniziato la sua esecuzione. Per esempio se vogliamo spostarci attraverso 15 righe di un foglio, alcune volte avanzando di una sola riga e altre volte avanzando di due righe, poichè il numero di righe da avanzare (cioè il passo del contatore) cambia, non possiamo usare il ciclo For ..Next ma dobbiamo usare il ciclo Do Per i cicli controllati da eventi, le istruzioni vengono eseguite quando la determinante del ciclo diventa vera o falsa sulla base di alcuni eventi che si verificano all'interno del corpo del ciclo. Per esempio potremmo scrivere un ciclo che viene eseguito indefinitamente fino a quando l'utente non inserisce un particolare valore in una finestra di dialogo input, e l'inserimento di questo particolare valore è l'evento che termina il ciclo, oppure possiamo eseguire delle operazioni sulle celle di un foglio fino a quando non si raggiunge la cella vuota di una colonna, anche in questo caso il raggiungimento della cella vuota è l'evento che termina il ciclo. Per ora abbiamo chiarito le due categorie di cicli, abbiamo capito che esistono cicli controllati da un contatore e cicli controllati da eventi, vediamo ora la sintassi Do istruzioni Loop Until condizione E qualche esempio. Sub ciclo1() Dim a As Integer [color=darkred]Do[/color] a = a + 1 MsgBox (a) [color=darkred]Loop Until a = 10[/color] End Sub Questo è un ciclo controllato da un contatore, noterete che c'è poca differenza dal ciclo For ..Next , infatti otteniamo lo stesso effetto, cioè portiamo a video un messaggio col valore della variabile finchè non arriva a 10, ma abbiamo visto poco sopra che abbiamo quattro diverse possibilità di costruire cicli divisi in due categorie, ora le categorie le abbiamo viste ( cicli controllati da un contatore e i cicli controllati da eventi) vediamo ora i quattro modi di costruire un ciclo, il listato sopra esposto è un metodo, vediamo ora gli altri e dopo li commentiamo assieme Sub ciclo2() Dim a As Integer [color=darkred]Do Until a = 10 [/color] a = a + 1 MsgBox (a) [color=darkred]Loop [/color] End Sub Sub ciclo3() Dim a As Integer [color=darkred]Do [/color] a = a + 1 MsgBox (a) [color=darkred]Loop While a <> 10[/color] End Sub Sub ciclo4() Dim a As Integer [color=darkred]Do While a <> 10[/color] a = a + 1 MsgBox (a) [color=darkred]Loop[/color] End Sub Come potete vedere la differenza sta nell'enunciato in rosso, il risultato non cambia ma le parole chiave e la loro collocazione si, vediamo come viene interpretato l'enunciato : Do Until a = 10 [Ripeti finchè a = 10], oppure Do While a <> 10 [Ripeti finchè a è diverso da 10], in questi 2 casi la differenza fondamentale è che viene verificata la condizione determinante prima che venga eseguito il ciclo, infatti se a fosse = a 20 il ciclo non verrebbe eseguito, gli altri 2 metodi Do ......Loop While a <> 10 e Do ...... Loop Until a = 10 vengono interpretati come spiegato sopra, ma la determinate del ciclo viene verificata alla fine del ciclo. In pratica la forma Do Loop While e Do Loop Until prima vengono eseguite le istruzioni presenti nel ciclo e poi quando raggiunge la parola chiave Loop viene verificata la condizione (vedi sintassi) se condizione è False (nel caso si usi Until VBA ritorna all'inizio del ciclo ed esegue nuovamente le istruzioni del ciclo, se invece usiamo la forma While la condizione da verificare deve essere True, mentre nelle altre 2 forme espresse Do Until ...Loop e Do While ...Loop la condizione invece viene verificata subito. Vediamo un esempio che semplifica e chiarifica quanto esposto. Supponiamo di far comparire a video un Inputbox per chiedere informazioni all'utente, e poi verificare se i dati immessi siano validi, in questo caso inseriamo nel nostro ciclo dobbiamo eseguire le istruzioni (far comparire il messaggio di Input) e all'inserimento dei dati da parte dell'utente verifichiamo la condizione, il listato si presenta così Sub esempio1() Dim pass As String Do pass = InputBox(prompt:="Inserisci password di accesso per Proseguire: ", Title:="Controllo accessi") Loop Until pass = "Alex" MsgBox "Password esatta : Accesso consentito", vbInformation + vbYes, "Verifica Password" End Sub Se proviamo questo codice vedremmo che il ciclo continua a ripetere le istruzioni finchè non viene digitata la password esatta, però se vogliamo uscire perchè non ricordiamo la password?, anche premendo sul tasto "Annulla" dell'Inputbox le istruzioni continuano ad essere ripetute lo stesso, allora è sempre meglio porre una condizione per evitare di proseguire, ma al tempo stesso controllare che l'esecuzione del ciclo avvenga correttamente, in pratica mettiamo l'utente in grado di uscire da un ciclo senza però che eviti di inserire la password richiesta. Per ovviare a questo modifichiamo il listato in questo modo. Sub esempio2() Dim pass As String Do pass = InputBox(prompt:="Inserisci password di accesso per Proseguire: ", Title:="Controllo accessi") [color=darkred]If pass <> "Alex" Then Exit Sub[/color] Loop Until pass = "Alex" MsgBox "Password esatta: Accesso consentito", vbInformation + vbYes, "Verifica Password" End Sub Inserendo la riga di codice in rosso, abbiamo posto una condizione, cioè Se pass è diverso da "Alex" esci dalla sub, attenzione, che esci dalla sub non vuol dire proseguire, ma semplicemente abbandoniamo questa routine che in ogni caso per poter proseguire dobbiamo inserire la password giusta, questa semplice metodica viene chiamata Uscita forzata dal ciclo. Anche con l'altro metodo cioè Do Until ...Loop e Do While ...Loop il risultato non cambia, pertanto non c'è una regola ben precisa su quale forma sia meglio usare, possiamo dire che a disposizione VBA ci mette queste forme, sta a noi usare quella che ci pare più logica o intuitiva per esprimere quello che vogliamo esegua il nostro codice. Se vi ricordate nella lezione precedente avevamo parlato della nidificazione del ciclo IF, anche nei cicli For ... Next e Do ...Loop è possibile eseguirla, visto che l'argomento lo abbiamo già toccato in questo contesto facciamo subito un esempio e dopo lo commenteremo assieme Sub scrivi_col_for() For riga = 12 To 35 For colonna = 7 To 18 Cells(riga, colonna).Value = riga Next colonna Next riga End Sub Cosa abbiamo fatto? se provate ad eseguire la macro vedrete che nell'area di lavoro abbiamo riempito tutte le celle con il numero della riga corrispondente. Vediamo il codice For riga = 12 To 35 il contatore del ciclo è rappresentato dalla variabile riga e gli diciamo [Per riga che và da 12 a 35] e subito dopo invece di far eseguire le istruzioni gli mettiamo un'altro enunciato For colonna = 7 To 18 in questo caso il contatore del ciclo è rappresentato dalla variabile colonna e lo interpretiamo così [Per colonna che và da 7 a 18], a questo punto abbiamo posto due condizioni una sotto l'altra e subito dopo abbiamo posto le istruzioni Cells(riga, colonna).Value = riga in questo enunciato la parola chiave Cells (che vedremmo nella prossima lezione) sta ad indicare una determinata cella del nostro foglio localizzata dai valori delle variabili riga e colonna, l'altra parola chiave Value indica il valore da inserire nelle coordinate rappresentate, tale valore lo abbiamo identificato con riga. Seguendo l'esecuzione del ciclo, prima viene eseguito il ciclo interno, e cominciamo dalla cella che si trova all'intersezione tra la colonna n° 7 e la riga n° 12 che sul nostro foglio è rappresentata da G12, al cui interno scriviamo il valore di riga (per cui 12), poi incontriamo la parola chiave Next colonna, a questo punto però non abbiamo ancora raggiunto la determinante del ciclo (rappresentato dal valore [18]) e VBA incrementa il contatore di 1 e ripete le istruzioni, così facendo andiamo a scorrere tutte le colonne e scriviamo al loro interno il valore della variabile riga. Una volta raggiunta la determinante del ciclo usciamo dal ciclo interno ma troviamo la parola chiave Next riga, per cui il contatore del ciclo esterno viene incrementato, passiamo alla riga successiva (la 13) e ripetiamo il ciclo interno come abbiamo descritto sopra. Il nostro listato ha fine quando viene raggiunta la determinate del ciclo esterno e a questo punto troveremo la nostra area di lavoro riempita con il valore della variabile riga estesa sulle colonne di ciascuna riga. Ora che abbiamo riempito l'area con il valore della riga tramite un ciclo For Next nidificato potremmo vedere un listato Do Loop per fare il contrario, cioè riempire l'area col valore della colonna. Sub scrivi_col_dolop() riga = 12: colonna = 7 Do Until riga = 35 Do While colonna <> 19 Cells(riga, colonna).Value = colonna colonna = colonna + 1 Loop riga = riga + 1: colonna = 7 Loop End Sub Notiamo subito una netta differenza tra i due cicli, infatti abbiamo dovuto dichiarare i valori iniziali delle variabili riga e colonna prima dell'inizio del ciclo (riga = 12: colonna = 7) in questa tipologia ciclica il VBA non riesce a determinare da dove deve iniziare, in quanto la sintassi di espressione è diversa, una volta indicati i valori di partenza troviamo la prima parola chiave Do Until riga = 35 [ripeti finchè il valore di riga non è uguale a 35] e subito dopo abbiamo posto l'altra condizione che costituisce il ciclo interno Do While colonna <> 19 facciamo attenzione a questo enunciato, abbiamo usato la parola chiave While e il codice viene interpretato così[ripeti mentre colonna è diversa da 19] ma perchè 19 dato che l'ultima colonna che dobbiamo riempire è la n° [18]?. Lo comprendiamo subito andando avanti con l'analisi del ciclo, possiamo saltare la spiegazione delle istruzioni Cells(riga, colonna).Value = colonna in quanto la loro funzione è uguale a quanto spiegato sopra per il ciclo For con la sola differenza che riempiamo le celle col valore della variabile colonna, mentre la soluzione al quesito posto sta nella riga sotto colonna = colonna + 1 questo è il nostro contatore, il metodo che usa Do ... Loop per incrementarlo e continuare nella sua esecuzione, infatti alla prima esecuzione colonna vale 7 e viene incrementata sempre di 1, poi quando trova la parola chiave Loop ritorna all'altra parola chiave Do (dove ha iniziato il ciclo) ed esegue ancora le istruzioni, ma nella determinante del ciclo abbiamo messo 19 (un valore in più di [18]) semplicemente perchè quando incrementiamo il valore della variabile colonna con la dicitura colonna = colonna + 1 alla parola chiave Loop la determinate del ciclo sarebbe soddisfatta se mettessimo [18] e di conseguenza la nostra area verrebbe riempita fino alla colonna 17 Provate a modificare il valore nell'esempio allegato e comprenderete come agisce il ciclo, inoltre quando si lavora con i cicli e per un motivo qualsiasi ci viene rimandato un errore oppure non viene eseguito quello che volevamo, possiamo usare un piccolo espediente per vedere come agisce il ciclo e quale valore attribuisce alle variabili usate, infatti basta usare la parola chiave Msgbox e possiamo vedere a video il valore della variabile e correggere l'errore. Ecco un esempio di utilizzo Sub scrivi_col_dolop() riga = 12: colonna = 7 [color=darkred]MsgBox riga[/color] Do Until riga = 35 Do While colonna <> 19 [color=darkred]MsgBox colonna[/color] Cells(riga, colonna).Value = colonna colonna = colonna + 1 Loop riga = riga + 1: colonna = 7 Loop End Sub Ovviamente il codice in rosso è solo un aiuto molto semplice per trovare un errore, esistono altri metodi da poter utilizzare direttamente nell'editor di VBA, ma questo fa comprendere meglio come "gira" il nostro programma.
  6. VBA : Prendere decisioni - Input - If - Select Case Finora abbiamo visto delle procedure che sono in grado di portare a termine i compiti assegnati, ma però non sono in grado di prendere delle decisioni che permettano di eseguire diverse azioni in circostanze differenti, operazione che risultano necessarie in molte situazioni. A volte è necessario che sia la procedura stessa ad offrire la possibilità di poter scegliere quale azione intraprendere al verificarsi di un determinato evento, per esempio possiamo scrivere una procedura che controlli una colonna in un foglio di lavoro per verificare se tutti i numeri sono compresi tra 1 e 10, inoltre la procedura potrebbe poi esaminare ogni elemento della colonna separatamente ed eseguire azioni particolari se incontra un elemento non compreso nell'intervallo specificato. Funzione InputBox Se vogliamo che l'utente possa operare delle scelte su come usare la procedura possiamo usare la funzione Msgbox che abbiamo già visto nella lezione precedente oppure la funzione InputBox, la quale ci permette di ottenere un input dall'utente, la sintassi generale è la seguente: InputBox (Messaggio) [,Titolo, Default, XPos, YPos, File Aiuto, Contesto]) Messaggio è una stringa usata per indicare all'utente quale informazione deve inserire, ed è l'unico argomento richiesto, tutti gli altri sono opzionali. Titolo è una stringa usata come titolo per la finestra di dialogo, Default è una stringa per fornire un valore di Default per l'input dell'utente XPos e YPos sono espressioni numeriche che forniscono le coordinate dove deve apparire la finestra di dialogo, XPos è la distanza orizzontale dal lato sinistro della finestra e YPos è la distanza verticale dal lato superiore della finestra, sono argomenti opzionali, ma fate attenzione se li usate perchè se specificate delle posizioni troppo grandi per questi argomenti si corre il rischio di non far apparire la finestra sullo schermo FileAiuto è una stringa che contiene il nome di un file della guida di Windows e Contesto è un'espressione numerica che specifica l'argomento nel file della guida relativo alla finestra di dialogo che state visualizzando.FileAiuto e Contesto sono opzionali, ma se specificate FileAiuto dovete specificare anche Contesto, e quando specificate un file della guida per una finestra di dialogo di input, VBA aggiunge automaticamente un pulsante della Guida (?) alla finestra di dialogo. Vediamo ora un esempio Sub funzione_input() Prova_input = InputBox(prompt:="Inserisci il nome di un file: ", Title:="Crea un nuovo file", Default:="Newfile") End Sub E otteniamo un finestra dei questo tipo Fig. 1 credo che sia abbastanza semplice ed intuitivo il listato esposto, infatti vediamo che quando digitato nel codice appare nella finestra di dialogo, ora possiamo passare all'argomento appena accennato all'inizio cioè prendere delle decisioni, naturalmente le nostre procedure non possono veramente "Prendere delle decisioni" allo stesso modo di un essere umano, ma bensì possono scegliere tra diversi percorsi di azioni predefinite, basandosi su semplici condizioni e prendendo delle decisioni al solo verificarsi di determinati eventi. Possiamo dire che usiamo le istruzioni di scelta di VBA, definite in una condizione oppure in un insieme di condizioni per cui VBA esegue un blocco di codice della nostra procedura oppure un altro blocco di codice. Ciclo IF Poichè le istruzioni per l'esecuzione di scelte modificano il flusso di esecuzione del programma, vengono spesso chiamate istruzioni di controllo di flusso o di controllo di programma, ma sono più note tecnicamente agli addetti ai lavori come istruzioni condizionali e incondizionali. Un'istruzione condizionale è una struttura per l'esecuzione di scelte, che sceglie un blocco di istruzioni del codice del programma basandosi su una condizione o su un gruppo di condizioni predefinite, mentre un'istruzione incondizionale è un'istruzione che modifica semplicemente il flusso di esecuzione della procedura senza dipendere da nessuna condizione specifica. Vediamo in dettaglio questo concetto. Per eseguire un'istruzione condizionale usiamo la funzione If ed è rappresentata in due modi If Condizione Then Istruzioni End If Oppure a riga singola If Condizione Then Istruzioni Quando VBA incontra un'istruzione condizionale come If ....Then, prima valuta l'espressione logica che descrive le condizioni, in base alle quali deve essere eseguita una particolare azione, se l'espressione è True (cioè vera) le condizioni predefinite sono state soddisfatte e vengono eseguite le istruzioni indicate, mentre End If indica la fine del ciclo decisionale. Vediamo questa procedura con degli esempi Sub prova() Dim Alex As Integer Alex = "1" If Alex = "1" Then MsgBox ("Bravi") End Sub In pratica la funzione fa questa valutazione: se la variabile Alex è uguale a "1", [Valutazione delle condizioni], e la valutazione è True [cioè è vera], allora fai apparire un messaggio con la scritta "Bravi”, [esegui l'istruzione], possiamo anche specificare più di un'azione da intraprendere in base alle condizioni usando il seguente enunciato If Condizione Then Istruzioni Else Istruzioni per Else End If In pratica da quanto sopra esposto aggiungiamo altre istruzioni nel caso che la condizione non venga soddisfatta, lo possiamo capire meglio con questo esempio Sub prova1() Dim Alex As Integer Alex = "2" If Alex = "1" Then MsgBox ("Bravi") Else MsgBox ("Condizione non soddisfatta") End If End Sub Oppure usando l'enunciato a riga singola Sub prova() Dim Alex As Integer Alex = "2" If Alex = "1" Then MsgBox ("Bravi") Else MsgBox ("Condizione non soddisfatta") End Sub Finora abbiamo visto delle istruzioni condizionali capaci di scegliere un singolo blocco di istruzioni alternativo per l'esecuzione della procedura, in molti casi però abbiamo bisogno di fare delle scelte più complesse scegliendo fra tre o quattro o più blocchi di istruzioni da eseguire, possiamo in questo caso inserire delle istruzioni If ... Then o If ... Then .. Else all'interno di altre istruzioni If ... Then o If ... Then .. Else, questa operazione si chiama "Nidificare" le istruzioni (nidificare significa mettere un tipo di struttura di controllo del flusso all'interno di un'altra), per usare questa sintassi è meglio usare il formato a blocchi, per una maggiore chiarezza e semplicità di lettura, l'enunciato è espresso in questa forma If Condizione Then Istruzioni Else If Condizione1 Then Istruzioni1 Else Istruzioni 2 End If End If Vediamo con un esempio come nidificare più istruzioni ed usiamo anche la funzione InputBox che abbiamo visto all'inizio Sub nidifica() Dim Alex Alex = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa") [color=darkred]If Pianeta > 20 Then MsgBox "Troppo caldo, vedrai che bolletta"[/color] Else If Alex > 18 Then MsgBox "Temperatura giusta" Else MsgBox "Temperatura troppo bassa, ti prendi un raffreddore" End If [color=darkred]End If[/color] End Sub Eseguendo questa macro otteniamo questo: Fig. 2 Fig. 3 Fig. 4 Fig. 5 Fig. 6 Fig. 7 Vediamo nel dettaglio casa abbiamo fatto, per comprendere meglio la nidificazione usiamo anche i colori, all'inizio abbiamo dichiarato la variabile alex ed abbiamo omesso di specificare il tipo di dati (ricordate che nella lezione 3 abbiamo detto che non dichiarando il tipo di dati la variabile assumeva per default il tipo Variant, in questo esempio è di scarsa importanza il tipo di dati), poi tramite la funzione InputBox abbiamo richiesto un dato dall'utente e di seguito abbiamo elencato le condizioni. La prima If Alex > 20 Then confronta il valore della variabile alex e avendole assegnato il valore 30 tramite InputBox viene soddisfatta la prima condizione che abbiamo post, cioè [se alex è maggiore di 20, porta a video il messaggio "Troppo caldo, vedrai che bolletta"] a questo punto che la condizione è stata verificata e soddisfatta l'esecuzione continua dopo la parola chiave End If, in questo caso segue la procedura di colore rosso e ci riporta a fine codice. Se nell'InputBox inseriamo un valore diverso (ad esempio 20) la prima condizione If Alex > 20 Then non viene soddisfatta ed allora passiamo alle istruzioni Else in questo blocco di istruzioni abbiamo posto 2 condizioni, la prima che viene verificata è If Alex > 18 Then [se Alex è maggiore di 18, porta a video il messaggio "Temperatura giusta"], nel nostro caso avendo inserito il valore 20 viene soddisfatta questa condizione in quanto è maggiore di 18, nello stesso blocco Else abbiamo anche posto un'altra condizione senza nessun valore, che significa, semplicemente che se il valore che introduciamo con InputBox non soddisfa la condizione If Alex > 18 Then allora il flusso del programma esegue le istruzioni di questa istruzione, infatti se inseriamo il valore 15 ci viene riportato a video il messaggio "Temperatura troppo bassa, ti prendi un raffreddore". Ma perchè queste scelte avvengono così? perchè le istruzioni Else sono contenute completamente all'interno dell'istruzione più esterna, e quando viene verificato il valore della variabile Alex viene mandato in esecuzione il blocco di codice quando il valore della variabile è True ne consegue che inserendo il valore 30 Alex diventa True alla prima condizione ed esegue il flusso di codice di colore rosso, invece se assegniamo a Alex il valore 20 diventa True alla prima istruzione delle condizioni nidificate nel blocco Else, ogni altro valore assegnato [da 1 a 18] alla variabile Alex viene eseguita l'ultima istruzione del blocco Else. Possiamo semplificare il listato della nidificazione usando un'abbreviazione che si presenta con If ... Then .. ElseIf e la possiamo rappresentare con il seguente enunciato If Condizione Then Istruzioni ElseIf Condizione1 Then Istruzioni1 Else Istruzioni 2 End If Consideriamo questo enunciato come un'abbreviazione, il concetto sopra esposto non varia, la nostra macro diventa così Sub nidifica_abbreviato() Dim Alex Alex = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa") If Alex > 20 Then MsgBox "Troppo caldo, vedrai che bolletta" ElseIf Alex > 18 Then MsgBox "Temperatura giusta" Else MsgBox "Temperatura troppo bassa, ti prendi un raffreddore" End If End Sub Abbiamo detto all'inizio che ci sono delle istruzioni condizionali e incondizionali, quelle che abbiamo visto finora sono istruzioni condizionali, mentre quelle incondizionali sono rappresentate dalla parola chiave Goto, quando VBA incontra l'istruzione Goto inizia immediatamente l'esecuzione delle istruzioni indicate da questo comando. Su questo comando non c'è molto da spiegare, praticamente permette di effettuare un "salto" da un punto all'altro del codice, generalmente viene usato per richiamare un funzione ripetitiva nel programma oppure per terminare la procedure stessa, la sintassi è: Goto nome_etichetta Per il momento non approfondiamo l'argomento, essendo un comando anche poco usato, ma lo tratteremo nella prossima lezione abbinandolo all'uscita forzata dai cicli al verificarsi di determinate condizioni, ora per completare il ciclo decisionale è opportuno parlare di un altro comando per compiere questa funzione : Select Case Funzione Select Case Le procedure che abbiamo visto finora sono moto utili con un numero ristretto di scelte da effettuare, ma presentano un problema quando ci sono molte condizioni da verificare, tale problema è di natura interpretativa in quanto diventa difficile leggere ed interpretare il listato del codice. VBA ci offre però un'istruzione condizionale da usare quando dobbiamo scegliere tra un gran numero di possibili scelte. L'istruzione Select Case funziona allo stesso modo di più istruzioni IF indipendenti ma è più facile da eseguire ed interpretare, usando la parola chiave Select Case con più istruzioni Case, dove ogni istruzione Case verifica la presenza di una condizione e se saranno soddisfatte le condizioni, verrà eseguito il codice di un solo blocco Case, inoltre un blocco Case può contenere nessuna, una o più istruzioni, pertanto da questa breve introduzione possiamo affermare che in presenza di varie scelte da effettuare risulta un metodo molto utile e versatile oltre che facilmente leggibile. L'istruzione Select Case ha questa sintassi Select Case espressione Case elencoespressione1 Istruzioni1 Case elencoespressione2 Istruzioni2 etc... Case elencoespressione n [Case Else IstruzioniElse] End Select Come già citato il concetto e l'utilizzo è uguale a più istruzioni IF, Select Case in più offre la possibilità di poter operare varie scelte e anche di utilizzare un operatore per specificare un intervallo di valori nell'elenco espressioni, tale operatore è To ed è espresso in questa forma: espressione1 To espressione2, per esempio possiamo specificare un intervallo di numeri da 1 a 10 in un elenco Case usando la seguente dicitura Case 1 To 10 è inoltre possibile usare degli operatori di confronto per selezionare dei blocchi di istruzioni a seconda se espressione è maggiore, minore o uguale di espressione, la sintassi è la seguente: Is operatore_di_confronto espressione, che semplificato prende questa forma Case Is < 10 Vediamo ora con un esempio pratico di semplificare ulteriormente quanto esposto e trasformiamo la routine utilizzata con l'operatore IF con Select Case Sub Selec_cast() Dim Alex Alex = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa") Select Case Alex Case Is > 25 MsgBox "Troppo caldo, vedrai che bolletta" Case 21 To 23 MsgBox "Bello caldo, si stà bene" Case 17 To 20 MsgBox "Temperatura giusta" Case > 15 MsgBox "Raffredore assicurato" Case Else MsgBox "Troppo freddo si ghiaccia" End Select End Sub Diamo una breve spiegazione a conclusione di questa lezione, sul listato appena esposto, avrete notato che è molto intuitivo, ma vediamo assieme come vengono interpretate le varie condizioni. Abbiamo dichiarato una variabile [Alex] ed abbiamo assegnato alla stessa un valore fornito dall'utente tramite la funzione InputBox, all'inizio del ciclo Select Case notiamo che è presente una sola variabile [Alex], come abbiamo citato nella lezione sulle variabili il risultato di un'espressione contenente una singola variabile è il valore memorizzato nella variabile stessa, di conseguenza VBA confronta il valore memorizzato nella variabile Alex con le condizioni specificate in ogni blocco Case dell'istruzione Select Case. Innanzi tutto VBA controlla il valore della variabile Alex partendo dalla prima clausola Case, se assegniamo alla variabile il valore 28 viene subito soddisfatta la prima condizione [Case Is > 25 = è maggiore di 25 ?] in questo caso si, la condizione diventa True e vengono eseguite le istruzioni di quel blocco Case, allo stesso modo se la variabile assume il valore 22, la prima condizione non viene soddisfatta [non è maggiore di 25] e VBA passa alla seconda [il valore è compreso tra 21 e 23?], Si, pertanto la condizione diventa True al secondo blocco Case ed esegue le relative istruzioni. In buona sostanza possiamo mettere diverse condizioni, sia singole che intervalli, nell'enunciato Else vengono invece inserite le istruzioni nel caso nessuna delle condizioni elencate venga soddisfatta, in questo caso vengono eseguite le istruzioni presenti nel blocco Else
  7. Variabili e operatori matematici In questa lezione spiegheremo i tipi di dati che il VBA può manipolare ed elaborare, ma prima di addentrarci in questo argomento è bene capire come VBA memorizza tipi diversi di informazioni, e in che modo riesce a distinguerli tra loro, abbiamo visto nella prima lezione un elenco dei vari tipi di dati, li riportiamo sommariamente per facilitare la spiegazione dell'enunciato che seguirà, i dati possono essere di tipo:Booleano, Byte, Date, String, Integer, Single, Long, Double, Currency, Variant. Questi dati vengono memorizzati da VBA per poterli utilizzare, ma come, utilizzandoli sotto forma di variabile. Vediamo ora cos'è una variabile, come si crea e come si usa Variabili Possiamo dire che VBA memorizza i vari tipi di dati in un'area di memoria del computer usata per contenere ogni tipo di dati, immaginiamo che una variabile sia come una casella in cui si può inserire un dato di qualsiasi tipo e salvarlo per impiegarlo successivamente. Il nome della variabile è l'etichetta che identifica la casella e il contenuto della casella è il valore della variabile, la particolarità di una variabile è di poter cambiare il suo valore durante l'esecuzione della macro, mentre il nome rimane inalterato. Possiamo quindi sintetizzare che una variabile VBA è il nome assegnato ad una specifica locazione di memoria del computer, e possiamo usare il nome della variabile per riferirci a qualsiasi dato contenuto in quella determinata locazione di memoria. Il nome di una variabile deve essere scelto seguendo poche regole • Deve cominciare con una lettera dell'alfabeto • Dopo la prima lettera può contenere qualsiasi combinazione di numeri, lettere • Il nome di una variabile non può contenere spazi, punti o caratteri speciali quali =, +, -, / e simili. • Il nome della variabile non deve corrispondere a parole chiave di VBA • Il nome di una variabile deve essere unico, cioè non può essere duplicato all'interno di un modulo Vediamo ora come si crea una variabile, è abbastanza semplice, da quanto abbiamo esposto finora basta solo dargli un nome ed assegnarli un valore, vediamone un esempio. alex = 10 Questo enunciato memorizza il valore 10 nella locazione di memoria denominata alex, se si tratta del primo enunciato VBA crea la variabile, riserva una locazione di memoria per contenere il dato della variabile e poi memorizza il valore 10 in questa nuova locazione di memoria specificato dal nome della variabile. Se la variabile alex esiste già VBA memorizza il nuovo valore nella locazione di memoria a cui fa riferimento la variabile alex Questa è definita una "dichiarazione implicita", oppure "dichiarazione al volo", risulta molto comoda ma può presentare degli inconvenienti, infatti usando il metodo implicito la variabile creata da VBA è di tipo Variant (tutti i tipi di dati), inoltre se in seguito digitiamo il nome sbagliato (es. Alex), a seconda del punto in cui il nome sbagliato compare nel codice il VBA può generare un errore di runtime, oppure possiamo anche usare la sintassi corretta, ma così andremmo a distruggere il valore memorizzato precedentemente. Allora come possiamo ovviare a questi inconvenienti? Dichiarando le variabili. La dichiarazione delle variabili è definita "Dichiarazione esplicita" e presenta i seguenti vantaggi • Rende più veloce l'esecuzione del codice • Aiuta ad evitare errori di digitazione • Il codice risulta più facile da leggere • Normalizza l'uso delle maiuscole nel nome delle variabili, per esempio se dichiariamo la variabile come Alex e in seguito digitiamo alex, VBA trasforma automaticamente alex in Alex. Per dichiarare esplicitamente una variabile si usa la parola chiave Dim in questo modo Dim nome_variabile che nel nostro esempio diventa Dim alex A questo punto abbiamo chiarito alcuni aspetti delle variabili, abbiamo visto che dichiarandole ne ricaviamo notevoli benefici, ma l'errore umano nella digitazione del codice è sempre in agguato, per tutelarsi ulteriormente possiamo inserire un'altra parola chiave Option Explicit, se aggiungiamo questa parola chiave nell'area delle dichiarazioni di un modulo, cioè all'inizio del modulo prima di qualsiasi altra dichiarazione o listato, il VBA ci richiede di dichiarare tutte le variabili tramite l'enunciato Dim prima di usarle, in pratica l'enunciato Option Explicit proibisce di dichiarare implicitamente variabili in ogni punto del modulo, possiamo dire che con l'istruzione Option Explicit abbiamo aggiunto un altro pezzettino al nostro listato per garantirne una perfetta esecuzione. Abbiamo anche detto che una dichiarazione implicita contiene dati di tipo Variant, però il nostro obbiettivo è quello di abbinare le potenzialità di VBA per utilizzare o manipolare vari tipi di dati presenti nel nostro foglio di Excel, se per esempio volessimo eseguire una somma tra i dati contenuti in due variabili avremmo sicuramente una incompatibilità nei dati e quasi certamente ci verrà rimandato un errore. Per ovviare a questo ultimo inconveniente usiamo un'altra parola chiave nella dichiarazione della variabile e aggiungiamo anche il tipo di dati che andrà a contenere, la parola chiave è As e l'enunciato si presenta in questo modo: Dim nome_variabile As tipo che nel nostro esempio diventa così Dim alex As Integer Cosa abbiamo fatto, semplicemente abbiamo creato una variabile di nome alex e abbiamo dichiarato che è di tipo numerico, è inoltre possibile dichiarare più variabili usando queste sintassi Dim Alex As Integer, Dim Andrea As String, Dim Mattia As Date, Dim Ale As Double, Dim Vik as Long, oppure in un unico blocco Dim Alex As Integer Dim Andrea As String Dim Mattia As Date Dim Ale As Double Dim Vik As Long Vediamo un esempio Sub variabile() Dim alex As String alex = "Ciao a tutti" MsgBox alex End Sub E otteniamo un messaggio del genere Fig. 1 In questo modo abbiamo dichiarato la variabile all'interno della routine o sub "variabile" e può essere usata solo in quella routine, infatti se usiamo questo codice Sub variabile() Dim alex As String alex = "Ciao a tutti" stampa_box End Sub Sub stampa_box() MsgBox alex End Sub E otteniamo un messaggio del genere Fig. 2 Non ci viene rimandato un errore, in quanto usiamo il comando del box, ma non vediamo nessuna scritta, cioè la variabile alex non viene riconosciuta e non appare nel nostro box. Abbiamo parlato poco sopra di dichiarazione delle variabili nell'area di dichiarazione del modulo, assieme alla parola chiave Option Explicit, abbiamo anche già visto i benefici di questa particolare procedura, ma se in quell'area aggiungessimo anche la dichiarazione della variabile cosa succederebbe? Semplicemente che la variabile sarebbe condivisa e utilizzabile da tutte le routine di quel modulo. Vediamo un esempio con questo codice. Option Explicit Dim alex As String Sub variabile_2() alex = "Ciao a tutti" mostra_box mostra_box1 End Sub Private Sub mostra_box() MsgBox alex MsgBox "questa è la sub mostra_box" End Sub Sub mostra_box1() MsgBox alex MsgBox "questa è la sub mostra_box1" End Sub Se associamo questa macro ad un pulsante verrà eseguita e mostrato il contenuto della variabile, possiamo però raffinare il codice con un comando che poco sotto spiegheremo e modifichiamo il listato così Option Explicit Dim alex As String Sub variabile_2() alex = "Ciao a tutti" mostra_box mostra_box1 End Sub Private Sub mostra_box() MsgBox alex & " " & "questa è la sub mostra_box" End Sub Sub mostra_box1() MsgBox alex & " " & "questa è la sub mostra_box1" End Sub E otteniamo i due box in questo modo Fig. 3 Fig. 4 Avrete notato che nella routine principale sono stati inseriti i nomi delle altre due routine cioè mostra_box e mostra_box1, in questa forma la macro riconosce che quella è una chiamata ad un'altra macro e la esegue, inoltre noterete anche una differenza nelle due routine che utilizzano la funzione MsgBox, infatti la prima è preceduta dalla funzione Private, che viene usata quando vogliamo utilizzare una routine di quel modulo e solo di quello, al tempo stesso questa ruotine non ci compare nella finestra di assegnazione delle macro. E' molto utile l'uso della funzione Private quando facciamo programmi con listati lunghi e usiamo diversi moduli, ne facilita l'interpretazione del codice e il debug in caso di errore. Il listato nella finestra del codice appare così Fig. 5 Penso che ora sia chiaro come vanno dichiarate le variabili, e come usarle, questa parte sarà risultata un po' noiosa ma è necessario che sia chiara ed esauriente in quanto è una funzione che verrà utilizzata molto spesso nella stesura di qualsiasi programma. Facciamo ora una piccola parentesi con un'altra istruzione, molto semplice ma estremamente utile: gli Operatori. Quando si scrive del codice di programmazione in VBA è possibile eseguire delle operazioni sulle variabili usando degli operatori, vediamo di che tipo sono e come vanno usati Operatori matematici Somma (+) Prodotto (*) Sottrazione (-) Divisione (/) Operatori su stringhe Concatenazione & Operatori Logici And, Or, NOT Attenzione che gli operatori sono stati racchiusi tra parentesi al solo scopo di evidenziarli, ma vanno usati senza parentesi. Scriviamo questo codice in un modulo VBA Sub Prova() a = "Auguro a tutti" b = "gli utenti del Pianeta" c = "Buon Natale e Felice Anno Nuovo" > MsgBox a & b & c End Sub Fig. 6 Otteniamo quanto vedete nella figura, ma se osservate attentamente noterete che ci sono delle frasi attaccate (tuttigli e PianetaBuon), modifichiamo allora il nostro codice in questo modo Sub Prova1() a = "Auguro a tutti" b = "gli utenti del Pianeta" c = "Buon Natale e Felice Anno Nuovo"MsgBox a & " " & b & " " & c End Sub Con questo ulteriore concatenamento abbiamo inserito uno spazio vuoto tra una frase e l'altra, infatti la sintassi " " sta ad indicare uno spazio vuoto e di conseguenza la nostra scritta ci appare così Fig. 7 Con questi operatori possiamo anche fare operazioni matematiche usando le variabili, se prendiamo questo codice, ricordando che le variabili Alex, Ale e Vik sono state dichiarate come Integer nella barra delle dichiarazioni quindi condivisibili in tutto il modulo Sub somma() Dim operator As Integer alex = 10 Vik = 20 Ale = 30 operator = Ale - Vik + alex MsgBox "Il risultato della tua operazione è" & " " & operator End Sub Questo codice equivale a: Prendi il valore della variabile Ale, sottrai il valore della variabile Vik e somma il valore della variabile Alex eseguendo questa macro ci verrà riportato questo avviso Fig. 8 Il listato nella finestra del codice è il seguente Fig. 9 Finora abbiamo sempre utilizzato il Box di messaggio con la funzione MsgBox nei nostri esempi, ma vediamo un po' in dettaglio come possiamo personalizzarlo usando le stesse macro ma cambiando la sintassi da usare per il box, ecco qualche codice Sub prova_box1() MsgBox "Buon Natale a tutti", vbExclamation End Sub Fig. 10 Sub prova_box2() Dim auguri As String auguri = MsgBox("Buon Natale a tutti", vbInformation + vbYesNo) End Sub Fig. 11 Sub prova_box3() mt = mt & "Buon Natale a tutti gli utenti" & Chr(13) mt = mt & "del Pianeta da tutto lo staff" & Chr(13) mt = mt & "Schiaccia un pulsante" & Chr(13) rs = MsgBox(prompt:=mt, Title:="Natale sul Pianeta con VBA", Buttons:=vbYesNo + vbQuestion) End Sub Fig. 12 Sub prova_box4() MsgBox "Buona Pasqua a tutti", vbCritical + vbOKOnly, "Natale sul Pianeta con VBA " End Sub Fig. 13 come potete vedere nel primo box ci viene rimandato un avviso di attenzione e nel quarto un avviso di errore, con un pulsante solo di convalida, serve prevalentemente quando dobbiamo gestire degli errori, cioè quando nel nostro codice inseriamo un listato in cui si debbano eseguire delle operazioni in base a certe condizioni, usando i codici sopra esposti possiamo stabilire a priori che se le condizioni sono state soddisfatte verrà eseguita l'operazione richiesta nel codice, in caso contrario possiamo usare la sintassi descritta per avvisare che la condizione da verificare non è andata a buon fine e al tempo stesso abbiamo fermato l'esecuzione del codice e spostato il controllo della routine per evitare la generazione di un errore. Nel secondo box invece possiamo operare delle scelte, l'avviso che compare ci riporta la caratteristica I a fumetto informativa che ci chiede conferma della scelta che stiamo per fare, la possiamo interpretare ed usare in questo modo "Sei sicuro di quello che hai scelto? vuoi procedere?" possiamo abbinare ai due pulsanti due diverse azioni, premendo sul tasto Si concediamo di eseguire l'operazione richiesta, mentre se premiamo sul pulsante No otterremo l'effetto descritto poco sopra per i box uno e quattro. Il terzo box è uguale al secondo con la sola differenza che abbiamo personalizzato la barra del titolo, e abbiamo usato un'altra istruzione Chr(13) che rimanda a capo, corrisponde al codice Return Carriage, possiamo così creare box personalizzati cambiando il titolo da usare in più parti del programma.
  8. Gestione degli errori - Metodi e proprietà Continuiamo il nostro percorso nell'apprendimento e conoscenza delle basi del linguaggio VBA, ma prima di addentrarci nell'argomento vorrei aprire una piccola parentesi che ci servirà comunque nel proseguo del nostro corso per presentarvi questo linguaggio che in seguito amplieremo, per ora ci limiteremo ad affrontare passo passo i problemi che potete incontrare nella personalizzazione dei vostri file Excel e in questa lezione parleremo del debug dell'applicazione ossia del controllo degli errori nell'esecuzione del codice.Iniziamo ora un percorso che toccherà i vari aspetti e problematiche che potete trovare affrontando di primo impatto il VBA ed il suo editor, cercherò di portarvi a conoscenza dei vari problemi che potete incontrare e come risolverli. Un altro aspetto del VBA è il suo editor ed affrontare la gestione degli errori, è molto frequente, anche per chi conosce bene il VBA, commettere degli errori, per la maggior parte sono dovuti ad errori di digitazione, o ad errori di distrazione, vediamo come dobbiamo comportarci in questi casi, nella lezione precedente abbiamo visto come entrare nell'editor, non abbiamo ancora conosciuto come gestire un errore. Ora ci aiuteremo con degli esempi, per esporvi il percorso da seguire per la risoluzione degli errori all'interno dell'editor, lo scopo di questa lezione è proprio quello di mettervi in condizione di usare l'editor di VBA e riuscire ad interpretare i suoi messaggi e gli errori che vi può rimandare. Per qualsiasi dubbio potete chiedere chiarimenti nell'apposita sezione, detto questo ora ritorniamo al Visual Basic Editor per spiegare come comportarsi ed agire nei casi in cui si presenti un errore inaspettato, cerchiamo ora con qualche piccolo esempio di capire come aggirare l'errore, facciamo un esempio di codice e posizioniamo il cursore alla fine dell'ultima riga di una ruotine qualsiasi che abbiamo scritto e premiamo due volte Invio, si creerà uno spazio dopo l'ultima riga ed in tale posizione proviamo ad inserire il seguente codice: Sub prova() Sheets("Foglio11").Range("F5").Select End Sub il cui significato è: vai nel Foglio 11 di questa cartella e seleziona (Select) la cella F5 Range("F5"). Tornando ad Excel (basta cliccare sulla prima icona col simbolo di Excel in alto a sinistra) e mandando in esecuzione la macro (premere ALT+F8, selezionare il nome della macro e poi Esegui) succede che ci compare un avviso come quello sotto riportato Fig. 1 Come si può intuire dal testo si tratta di un errore generato dal codice, se premiamo sul pulsante Debug ci verrà automaticamente aperto l'editor di VBA e verremo riportati nella routine (o Sub) che lo ha causato Fig. 2 Nella figura sopra riportata potrete notare che la riga di codice che ha causato l'errore è già evidenziata in giallo, questo ci facilita notevolmente le cose, abbiamo già individuato l'errore e possiamo così intervenire e correggere il codice, tuttavia l'errore ha bloccato l'esecuzione della macro e per poter continuare ad operare dobbiamo ripristinare l'editor (cioè sbloccarlo) e rimediare all'errore. Per eseguire questa operazione basta premere sul pulsante blu in alto nella barra degli strumenti contrassegnato dalla freccia rossa, il quale interrompe il debug del codice e ripristina l'uso dell'editor. Spieghiamo ora la natura dell'errore volontariamente provocato: nella nostra cartella di lavoro, l'errore è stato causato per il semplice fatto che non esiste all'interno della stessa un foglio denominato Foglio11, per cui VBA ha evidenziato questa situazione con quel codice un po' sibillino ed interrompendo l'esecuzione della macro, in pratica non ha trovato il percorso che gli abbiamo indicato Programmazione ad Oggetti: Metodi e Proprietà Continuiamo con l'esposizione dei vari metodi e funzioni che possiamo usare tramite il VBA, tenendo ben presente che il linguaggio VBA è orientato agli oggetti. Ma cosa significa questa espressione? Si riferisce ad una tecnica di programmazione ormai invalsa in questi ultimi anni, tutto il mondo intorno a noi è pieno di oggetti: la tastiera, il mouse, lo schermo e così via, quello che contraddistingue un oggetto è una serie di caratteristiche o Proprietà. Ad esempio il mouse è dotato di una rotellina e di due tasti, un oggetto oltre alle proprietà possiede anche dei Metodi ossia delle funzioni attraverso i quali esercitare delle azioni. Nell'esempio appena citato, (quello del mouse) tenendo premuto il tasto sinistro e facendo scorrere il mouse si seleziona una o più parole di una riga di testo. Riferendoci alla nostra cartella di lavoro possiamo dire che essa è costituita da oggetti di varia natura, come gli oggetti grafici o i controlli (finestre di dialogo, pulsanti ecc.) incollati su un foglio, ma non è questa la peculiarità di un foglio elettronico la cui ossatura è costituita, partendo dal livello più basso, da: - celle - intervalli - fogli - cartelle di lavoro Se osserviamo questo insieme di oggetti come un albero genealogico il capostipite, o il culmine, spetta all'oggetto, denominato Application, che rappresenta, tutti gli Oggetti di Excel. Si tratta appunto di Excel stesso. Proseguendo nella discesa genealogica troveremo i seguenti oggetti : - L'oggetto Workbook : è la cartella di lavoro (cioè il nostro file) - L'oggetto Worksheet : è il foglio di lavoro (Foglio1, Foglio2 ecc...) - L'oggetto Range : è un intervallo di celle (A1: B12, C1: D12, ecc...) Sintatticamente possiamo affermare che ciascun oggetto fa parte di una famiglia o classe e l'accesso al singolo membro di ciascuna classe si effettua attraverso metodi, "pluralistici", ai quali corrispondono insiemi di oggetti omogenei quali: Workbooks, Worksheet, Range e Cells, inoltre i membri più elevati si possono omettere nel caso che il soggetto sia attivo; vedremo meglio questo passaggio fra poche righe. Fin qui abbiamo delineato i componenti principali cercando di esporre come vengono interpretati dal Visual Basic applicato al foglio elettronico, ma l'obiettivo vero è quello di focalizzare gli oggetti che formano l'ossatura, il nucleo di uno spreadsheet (foglio di lavoro), al cui centro, vi sono intervalli e celle con il loro contenuto di dati da elaborare o formule di legame; il loro inquadramento nel mondo Visual Basic è fondamentale e aiuterà a capire meglio tutto il resto, vediamo di interpretare quanto appena affermato usando il Visual Basic. Con queste sintassi Workbooks("Lezione2.xls") e Worksheets("Foglio1") si individuano rispettivamente la cartella e il foglio di lavoro (notare i loro nomi virgolettati entro le parentesi), ma dobbiamo però tenere presente che un elemento può anche venire individuato tramite un indice, il quale può essere o il numero di ordine o il nome fra virgolette, per capire meglio il concetto di indice possiamo dire che la sintassi Workbooks(2) e Workbooks("Lezione2.xls") puntano entrambe alla stessa cartella [Lezione2.xls] a patto che questa sia la seconda fra quelle aperte contemporaneamente da Excel. Infatti se abbiamo solo la cartella Lezione2.xls aperta, la sintassi esatta diventa Workbooks(1) A questo punto è abbastanza chiaro che l'indice che usiamo fra parentesi nell'oggetto Workbooks varia ed è strettamente legato al numero di cartelle aperte nel momento dell'esecuzione di questa istruzione, pertanto possiamo far notare che è possibile scrivere questa istruzione in tre diversi modi: - Application.Workbooks(1).Worksheets(1).Range("A1:B10") - Application.Workbooks("Lezione2.xls").Worksheets(1).Range("A1:B10") - Application.Workbooks("Lezione2.xls").Worksheets("Foglio1".Range("A1:B10") Ricordate che poco sopra abbiamo però affermato che i membri più elevati si possono omettere quando sono attivi, per cui: - Se abbiamo Excel aperto - Se la cartella Lezione2.xls è aperta - Se infine ci troviamo nel Foglio1 Possiamo ridurre tutto il listato ad un semplice Range("A1:B10") In caso contrario credo che sia abbastanza chiaro come agire usando gli indici per individuare il nostro intervallo (o Range). Prestiamo inoltre attenzione alle proprietà "pluralistiche" che poco sopra abbiamo citato: le prime volte è facile scordarsi del plurale, scrivendo Workbook("Lezione2.xls") anziché Workbooks ("Lezione2.xls") oppure Worksheet("Foglio1") invece di Worksheets ("Foglio1"). Vediamo qualche esempio di codice da applicare a quanto esposto finora, ma soprattutto vediamo come automatizzare l'esecuzione di routine creando un pulsante, ad esempio apriamo la nostra cartella ("Lezione2.xls") e rientriamo nel Visual Basic Editor. Questa volta scriveremo noi una macro direttamente senza affidarci all'aiuto del Registratore di macro utilizzato nella precedente lezione. Ponendoci al di sotto dell'ultima riga della macro precedente (basta porre il cursore alla fine di End Sub e premere una o due volte Invio), scriviamo il seguente codice Sub Nascondi_Foglio() Worksheets(2).Visible = False MsgBox "Il Foglio 2 è sparito" End Sub Commentiamo questo codice: - la routine inizia con Sub (seguito dal nome della routine, le macro sono tutte sub-routine) e termina con End Sub - l'oggetto Worksheets(2) ossia il Foglio 2, è seguito da una sua proprietà che si evidenzia con .visible, si richiama perciò la proprietà visible che consente al foglio di essere visibile o meno a seconda del fatto che tale proprietà sia dichiarata vera o falsa (in questo caso = False indica che il foglio sarà nascosto). - MsgBox "Il Foglio 2 è sparito" è invece una funzione di VBA che permette di mostrare all'utente un messaggio che nella sua forma più semplice riporta un messaggio di avviso per l'utente (il testo racchiuso fra virgolette) ed un bottone di OK necessario per la sua chiusura. Torniamo ora ad Excel e facciamo click col destro del mouse sulla barra degli strumenti, ci comparirà un box con delle voci, scegliamo Moduli Fig. 3 Ci comparirà un nuova barra flottante che possiamo ancorare alle altre barre degli strumenti semplicemente trascinandocela. Fig. 4 Premiamo sul pulsante evidenziato dal riquadro rosso e poi spostandoci sul foglio di lavoro teniamo premuto il pulsante di sinistra del mouse, trasciniamolo fino a raggiungere le dimensioni desiderate ed al rilascio ci comparirà il nostro pulsante. Contestualmente si aprirà anche la finestra per assegnare la macro al pulsante appena creato Fig. 5 Stessa operazione e identico risultato si può ottenere inserendo un'immagine sul foglio (si dovrà attivare la barra degli strumenti Disegno) e quindi tramite il solito menu contestuale ottenuto cliccando col destro sull'immagine, assegnargli la macro, Il pulsante ottenuto sarà simile al seguente: Fig. 6 Possiamo ridimensionare il pulsante, editarne il testo, cambiarne i caratteri ecc ... facendo click sopra al pulsante stesso col pulsante destro del mouse e scegliere, tra le voci del menù contestuale che compare, quella di cui abbiamo bisogno. Se invece vogliamo spostare il pulsante, facciamo ancora click col destro del mouse, sparirà il menù contestuale e rimarrà evidenziato il pulsante Fig. 7 Possiamo allora spostarlo a piacimento e ridimensionarlo trascinandolo negli angoli. Possiamo ora mandare in esecuzione la macro stessa semplicemente cliccando sul pulsante appena creato, adesso il foglio è sparito, come facciamo a farlo riapparire? Basta creare una nuova macro che assoceremo ad un altro pulsante, con le stesse modalità di costruzione della precedente: Sub Mostra_Foglio() Worksheets(2).Visible = True MsgBox "Il Foglio 2 è Ricomparso" End Sub I commenti sono superflui perchè il codice è esattamente identico al precedente solo che la proprietà visible è stata ora posta a True (Vero) ed in tal caso il Foglio 2 riappare, esaminate attentamente i codici e quanto esposto, e nella prossima lezione ci addentreremo più profondamente nel Visual Basic. Come avete avuto modo di vedere abbiamo accennato anche a qualche esempio di codice, è molto importante riuscire a capire i legami fra i vari membri che legano la struttura del nostro file, ma è altrettanto importante non correre subito ad esempi e file "preconfezionati", è comprensibile la noia che le prime lezioni possano far nascere, ma per i neofiti che si avvicinano a questo linguaggio, sono fondamentali.
  9. Ambiente di sviluppo e generatore di macro Molto spesso vediamo in rete che si parla di Excel "avanzato" è una terminologia che implica l'uso di formule e funzioni evolute ma anche di personalizzare Excel programmandolo a nostro piacimento. Questa possibilità esiste in quanto al suo interno Excel contiene un linguaggio di programmazione denominato "Visual Basic for Application" in sintesi VBA, è un linguaggio molto simile al vecchio Basic o Quick Basic e abbastanza simile al moderno Visual Basic, in pratica tramite codice programmabile possiamo far compiere ad Excel operazioni che non è possibile effettuare con l'uso tradizionale, questa procedura è attuabile inserendo delle Macro. Una macro è un programma composto da un insieme di istruzioni che permettono di eseguire un compito ripetitivo, per iniziare possiamo definirle così, più avanti vedremmo che possiamo usarle per fare tante altre cose, adesso fermiamoci a questa definizione un po' semplicistica tanto per poter comprenderne meglio il loro utilizzo. Registratore di macro Cominciamo con un esempio pratico, se tutti i giorni voglio aprire un file che si chiama "Lezione1" e scrivere nella cella A1 del Foglio 1 "Inizio, ore 08,00" e nella cella A1 del Foglio 2 "Fine ore 12,00 " potremmo automatizzare questa procedura usando una macro. Per poter mandare in esecuzione una macro dobbiamo verificare il grado di protezione che abbiamo impostato in Excel, lo possiamo vedere attraverso questo percorso Strumenti - Macro - Protezione e ci comparirà una maschera come quella sotto riportata Fig. 1 Impostando il livello di protezione su medio, come vedete in figura, vi verrà mostrato un messaggio di avviso ogni volta che andrete ad aprire file che conterranno macro, e vi permetterà di scegliere se eseguirle o meno. Il messaggio che vi apparirà è il seguente Fig. 2 Dobbiamo inoltre ricordare di fare attenzione, le macro possono contenere codice dannoso o anche un'applicazione virale, pertanto fate attenzione nell'aprire file che vi riporteranno il messaggio sopra esposto, aprite file contenenti macro solo se siete certi della fonte. Fatta questa premessa iniziamo a costruire la nostra prima macro, possiamo utilizzare il Registratore di Macro presente in Excel, che ci permette di poter operare "manualmente" sul nostro file e tutte le nostre operazioni verranno convertite in codice attraverso questa funzione, che si trova nel menu Strumenti - Macro - Registra nuova macro Fig. 3 Eseguita questa operazione ci comparirà una maschera come questa sotto riportata Fig. 4 Vediamo i vari campi che compaiono in questo box Nome macro: è il nome che vogliamo dare alla nostra macro, Excel riporta per default "Macro1", potete scrivere il nome che volete assegnare Tasto di scelta rapida: serve per eseguire la macro direttamente dalla tastiera; inserendo Z nell'apposito campo, per eseguire la macro usare la combinazione di tasti CTRL+Z Memorizza macro in: consiglio di lasciare così come appare in figura Descrizione: per default mostra il nome dell'autore autore e la data di creazione Premiamo ora sul tasto OK e procediamo alla creazione della macro, ci troviamo col cursore nella cella A1 del foglio1 e scriviamo la frase "Inizio, ore 08,00" senza le virgolette e poi premiamo il tasto Invio. Portiamoci ora nel Foglio 2 e nella cella A1 e scriviamo la frase "Fine ore 12,00" sempre senza le virgolette e premiamo ancora Invio, ritorniamo poi al Foglio1 e possiamo anche interrompere la registrazione della nostra macro in questo modo: Strumenti - Macro - Interrompi registrazione Fig. 5 A questo punto la nostra macro è stata creata, la procedura di fine registrazione può essere eseguita nel modo descritto oppure al momento della registrazione può comparirvi anche un box come il seguente Fig. 6 Vi rimarrà sullo schermo, potete spostarlo come volete, e per fermare la registrazione basta premere sul pulsante quadrato che vedete in figura, a questo punto possiamo verificare se funziona, cancelliamo quello che abbiamo scritto nei due fogli e proviamo a mandarla in esecuzione, la possiamo eseguire dal menu Strumenti - Macro - Macro Fig. 7 E si apre una maschera come la seguente Fig. 8 In questo box troverete tutte le macro che registrerete o scriverete direttamente all'interno dell'editor, basta solo premere sul pulsante Esegui , e manderete in esecuzione la macro e nei 2 fogli troverete il testo che prima avevate cancellato. Potete eseguirla anche utilizzando il tasto di scelta rapida che avevamo impostato in precedenza (CTRL+Z), abbiamo creato la macro e mandata in esecuzione, ma vediamo come è potuto succedere, inoltriamoci ora nell'editor di VBA e vediamo come è fatto. Dal menu Strumenti - Macro - Visual Basic Editor oppure premendo la combinazione di tasti ALT+F11 entreremo nell'editor e ci verrà mostrata una schermata così Fig. 9 Sulla sinistra compare la finestra del progetto, se espandiamo la cartella "Moduli" e clicchiamo sulla voce "Modulo1" nella finestra di destra ci apparirà il codice convertito automaticamente per eseguire l'istruzione. Per il momento non addentriamoci in spiegazioni tecniche sul significato del codice, lo affronteremo meglio nelle prossime lezioni quando avremmo appreso i concetti basilari della programmazione VBA, per il momento notate che il codice è racchiuso tra 2 comandi di Inizio e fine delle istruzioni cioè Sub Macro1() .... End Sub mentre tutte le righe precedute dall'apice singolo (') stanno ad indicare i commenti, nel vecchio linguaggio Basic corrisponde alla funzione REM
  10. Premessa In questi ultimi anni c'è stata "un'esplosione" di Internet e istituzioni e mass media hanno mostrato sempre più frequentemente storie di "fuorilegge" dell'Informatica, riportando notizie di minacce alla sicurezza e inviolabilità della rete eseguite da persone che si sono infiltrate nelle banche dati di governi, banche o altre istituzioni. In questi articoli gli autori fanno trasparire lo sgomento e la paura davanti a queste "incursioni" evidenziando prevalentemente che rappresentano un pericolo per la società che poggia saldamente le sue istituzioni sui computer, e definendo questa pirateria informatica opera di Hacker E' indubbio che Internet sta cambiando e sta affiorando una nuova realtà: chi è in grado di capire la tecnologia che muove tutto questo o che ha una profonda conoscenza in questo campo e sa come sfruttarla, detiene il controllo, oggi avere accesso alle informazioni significa avere accesso al potere. E' questa la preoccupazione più grande per le varie istituzioni, l'impossibilità di controllare queste persone e di regolarne il traffico, di conseguenza c'è tutto l'interesse a mantenere un'opinione pubblica anti-Hacker, per giustificare leggi severe di controllo di Internet, il mezzo che minaccia di togliere l'attuale sicurezza. Mass media e istituzioni hanno quindi "etichettato" gli Hackers e il mondo dell'underground definendoli pericolosi perchè trascendono le regole e i valori che loro hanno imposto, di conseguenza hanno presentato un'immagine pubblica negativa di questa categoria definendoli dei "criminali". In poco tempo questo "marchio" è diventato uno status, quando si parla di Hacker si parla di danno, di intrusione e di pirateria, di furto delle informazioni e di identità, però se qualcuno, con tecniche più o meno raffinate o per bravura scopre un difetto in un sistema e lo sfrutta a suo vantaggio o per arrecare danno ad altri, ebbene questa persona NON è un Hacker. C'è però da tener presente una cosa: anche in Internet, come nel mondo esterno, ci sono i buoni e i cattivi, i ladri e i poliziotti, i burloni e i cretini, ci sono i saggi, i rivoluzionari , le persone gentili e quelle maleducate, ne consegue che ci sono anche quelli che approfittano della grande quantità di persone che vi accedono ogni giorno per compiere in modo nascosto atti di vandalismo o veri e propri crimini, e vengono definiti Hackers, nossignori, queste persone sono Cracker cosa ben diversa dell'essere Hacker La parola Hacker porta alla mente, nell'immaginario collettivo, concetti negativi che non sono propri della sua figura reale, un Hacker NON produce virus, NON entra nelle banche dati per motivi illegali, NON ruba il numero della vostra carta di credito, anzi di solito lavora perché queste cose NON accadano. Quando un Hacker fa un'incursione in un sistema protetto segue un'etica, la ricerca e la divulgazione della conoscenza, dell'informazione, e come abbiamo accennato poco sopra,forse è per questa ragione che tendono ad accomunarli con i criminali, per sviare l'opinione pubblica dal loro vero scopo. Si parla di pharming e di phishing e quelli che lo fanno sono Hacker; ti fregano la banda larga e sono Hacker, vendono informazioni segrete e si tratta sempre degli Hacker. In pratica si parla di Hacker e si indica una categoria che in realtà conviene mantenere immersa nel mistero perchè l'Hacker fa comodo al sistema delle vendite. Vediamo di fare luce su questa categoria. Chi è un Hacker e cosa fa Un Hacker è una persona al top nel suo campo, conosce i linguaggi di programmazione, esplora un sistema in ogni minimo particolare sempre alla ricerca di bugs, ossia errori nel sistema, che spesso fanno si che possa avere accesso al sistema.. Sono Hacker quelli che hanno scritto il sistema operativo Gnu/Linux, gratuito e libero, sono Hacker coloro che hanno sviluppato la vecchia Arpanet in quella che oggi tutti chiamiamo Internet. Ricordiamoci, però che non si e' Hacker solo nel campo informatico, l'hacking deve infatti essere inteso come stile di vita, un modo di essere, non solo come qualcosa di strettamente tecnico. Si può essere Hacker in qualsiasi campo della scienza o dell'arte. "Il mio unico crimine è la curiosità." : The Mentor (The Hacker's Manifest, 1986) Io non ho particolari talenti. Sono solo appassionatamente curioso." Albert Einstein, scienziato" Queste alcune citazioni, una di un "informatico" e l'altra di uno scienziato, ma avrete notato un denominatore comune in queste loro frasi celebri : La curiosità. Ciò che contraddistingue un Hacker, è il fine per cui compie determinate azioni, la curiosità e la smania di conoscenza ne sono la vera essenza e tutto questo avviene in assoluto silenzio per una propria soddisfazione personale. Però conoscere equivale a cambiare. Il mondo ha bisogno di gente che vada controcorrente, che apra nuove strade, che ci regali nuove possibilità, l'Hacker intravede percorsi che altri non hanno provato a cercare, purtroppo questo e' un lavoro che si paga sulla propria pelle, che costa fatica e soprattutto che avviene nell'ombra Quando usiamo un Pc non pensiamo agli Hacker, ma non dobbiamo dimenticare che dietro ad ogni messaggio di posta elettronica che inviamo, dietro ad ogni connessione alla rete c'è il lavoro di un pugno di persone anonime che hanno voluto sperimentare, se quello che abbiamo ora è abbastanza evoluto lo dobbiamo al loro lavoro sia che abbiano voluto cimentarsi con tecniche legali o illegali, a seconda del periodo storico, ma a loro dobbiamo gratitudine. Se oggi possiamo vivere la Rete e incontrare al suo interno persone "particolari" , non lo dobbiamo certamente a Microsoft, o a qualche grande Software House, ma agli Hacker E' forse plausibile la ghettizzazione del loro appellativo a "Pirata Informatico" per il solo fatto di aver passato tante notti insonni, tante ore di esperimenti, che hanno contribuito a costruire la Rete, ci hanno messo qualcosa di loro, della propria vita e del proprio tempo. Ma una domanda ora sorge spontanea : Cosa rimane dopo il passaggio di un Hacker ? La risposta è molto semplice, vengono evidenziati i bugs che affliggono i sistemi visitati, alcuni amministratori di sistema fanno più esperienza e imparano certi concetti di sicurezza finora ignoti e anche i grandi produttori di software per la difesa del sistema guadagnano, così come i vari consulenti in materia di sicurezza informatica. In sostanza si aprono nuove porte, nuovi mercati e si cercano nuove soluzioni a problemi tecnici e spesso si inventano strumenti che dopo poco tempo diventano indispensabili per tutti. E questi sarebbero i "Pirati Informatici" che tanto temiamo? Ci siamo già dimenticati del caso Sony e del rootkit che allegava nei sui DRM? Però l'Hacker è un criminale, sembra strano che ingegneri informatici e tecnici superpagati dalle varie case costruttrici non si siano accorti di niente. "…..Una casuale scoperta ha portato alla luce tutti i dettagli di quello che può essere considerato un vero e proprio rootkit, ovvero un gruppo di tool che agisce, all'oscuro dell'utente, nei meandri del sistema operativo…" Così esordisce Marco Giuliani in un suo articolo su Hardware Upgrade quando ha reso pubblica la scoperta fatta da Mark Russinovich però per l'opinione pubblica il vero pericolo sono gli Hacker. Ma quando si spengono i modem i veri protagonisti rimangono nell'ombra, gli artigiani dell'informatica perdono di interesse, fino a quando …… una come me non prova a far parlare uno di loro, a dargli lo spazio di raccontare la sua storia, quello che ha fatto e come lo ha fatto. Ha accettato di partecipare a questo articolo King-Lion Admin di Eurohackers Team con lui affronteremo altre tematiche, conosceremo da vicino un Hacker, come agisce, che tecniche usa e in "contrapposizione" sentiremo anche Alessandro Recchia (aka Erreale) admin di Pianeta Pc e betatester della Agnitum.esperto di sicurezza informatica . Insomma ci aspetta un bel dialogo La programmazione strumento di attacco e di difesa Finora abbiamo visto la filosofia dell'essere Hacker, l'atteggiamento e l'attitudine, ma le capacità sono fondamentali , il pensiero non sostituisce la competenza, e c'è un insieme di capacità basilari che bisogna avere prima di poter pensare di essere Hacker. Naturalmente conoscere vari linguaggi di programmazione è la capacità fondamentale per un Hacker, ma a questo punto lascio la parola a King-Lion Alex: King puoi illustrarci che valore ha la programmazione e quali linguaggi è meglio conoscere? King-Lion : Per poter trovare dei bugs in un programma o scrivere un exploit per sfruttare qualche falla bisogna studiarne il codice sorgente di conseguenza conoscere vari linguaggi di programmazione è essenziale. Alex : Quali linguaggi è meglio conoscere King-Lion : Io ritengo che per iniziarsi all'hacking al giorno d'oggi sono due i linguaggi di programmazione fondamentali da apprendere, il Php e Sql. Alex : Perché proprio quelli? King-Lion: Ormai tutto il web è dinamico, difficilmente incontreremo dei siti web statici, come hai accennato un hacker svolge gran parte del suo lavoro come bug hunter, cioè va alla ricerca di bugs all'interno di strutture web. Possiamo dunque dire che il 65% delle strutture sono in php, 15% html e 20% in altri linguaggi come asp, di conseguenza conoscere il Php è fondamentale per iniziare e la combinazione tra Php e Sql a mio parere è un'ottima "arma" nelle mani di aspiranti hacker. Naturalmente ci sono altri linguaggi di programmazione da conoscere come il Perl e il C/C++ indispensabili per la creazione della maggior parte degli exploit. Alex : Ho capito come sia importante conoscere il php… ma l'Sql? Perche e importante conoscerlo? King-Lion : Il php essendo un linguaggio dinamico, cosi come l'asp si "appoggia" su un database (Sql). Alex: Si ma …..come funziona la combinazione tra php ed sql? King-Lion : Se abbiamo un sito in php che poggia su un database Sql (85% dei casi), nel database è racchiusa una query del tipo: INSERT INTO `tabella_database` VALUES (1, 'admin', 'password', 'admin@sito.it', 'altre info); Richiamando dunque la pagina che si poggia su quella tabella del database ad esempio: sito.it/pagina.php?id=1 otterremo come risultato che il database ci risponde con le informazioni pre-impostate dalla pagina php ( $query = "SELECT * FROM utenti WHERE id = ".$_GET['id'].""; ) SELECT * FROM utenti WHERE id = 1 Username: admin Info: amministratore del sito. Dunque un hacker, o anche un programmatore che conosce bene il linguaggio mysql potrebbe richiedere al sito di darci invece che le informazioni pre-impostate dalla pagina php, altre informazioni, come la password e la email, che sono sempre presenti nel database, con un semplice comando. -1 UNION SELECT 0,pass,0,0,email FROM utenti WHERE id=1 Ossia in pratica abbiamo chiesto al dabase mediante URL di fornirci soltanto la password e l'email dell'utente con id 1 (solitamente l'admin), gli 0 invece stanno ad indicare che quei capi non ci interessano e che si possono escludere. Dunque da ciò si ottiene che una buona conoscenza di linguaggi di programmazione come Sql e Php risultano indispensabili agli aspiranti hackers! Da quanto appena citato da King-Lion si evidenzia come sia indispensabile proteggersi, ultimamente leggo in vari forum come sia indispensabile dotare il sistema di software anti-intrusione come i Firewall, gli Hips o gli IDS, su questo argomento sentiamo il parere di Alessandro Recchia Alex : Alessandro ci esponi il tuo punto di vista in merito? Erreale : L'installazione, la configurazione e l'uso di un firewall è senza dubbio fondamentale per proteggere un sistema informatico, indipendentemente dal fatto che ci si trovi di fronte ad un'unica postazione o ad una grossa rete costituita da svariate postazioni. Oggi ci sono firewall software, molti dei quali anche gratuiti, che hanno raggiunto un livello di qualità e controllo del sistema davvero molto buono. Alcuni integrano anche soluzioni Hips e/o motori anti-virus e anti-spyware Alex : Ma allora se questi ottimi prodotti "all in one" sono così validi, perché su tantissimi forum si trovano svariati post di utenti alle prese con intrusioni informatiche o malware? Erreale : A mio avviso la situazione è allarmante. Ormai gli utenti medi si sono talmente adagiati sul fatto di avere installato sulla propria macchina l'ultima suite "anti-tutto" che hanno dimenticato, o ancor peggio non hanno mai considerato un aspetto fondamentale: la prevenzione. Windows, come qualsiasi altro sistema operativo, è molto complesso e delicato. Senza le opportune configurazioni o personalizzazioni non possiamo affermare di avere un totale controllo della nostra macchina. Pensare di essere al sicuro solo perché si è installato l'ultimo ritrovato nel campo degli Hips o dei firewall è come pensare di essere al sicuro nella nostra abitazione solo perché abbiamo installato l'ultimo tipo di porta blindata in commercio, senza aver irrobustito anche le finestre o le pareti di cartapesta che ci circondano. Se fossi un ladro perché dovrei faticare a scardinare una porta di duecento chili, quando con una spallata potrei tranquillamente sfondare il muro esterno nel retro dell'abitazione? E che succederebbe se la nostra amatissima porta blindata avesse un difetto di progettazione? O se venisse scoperto che grazie ad un bug la si può aprire con un cotton fioc? La sicurezza è forte quanto l'anello più debole della catena che la costituisce e poco può un firewall, per quanto configurato, se una macchina è un colabrodo di suo. Alex : Cosa dobbiamo fare per avere un minimo di sicurezza? Erreale : Come prima cosa iniziamo a non usare l'account amministratore per accedere alla macchina e tanto meno ad internet. Creiamo quindi un utente con poteri limitati (user). L'uso di un'utente di questo tipo elimina un buon 50% dei fastidi provocati da virus, spyware e exploit in rete. L'uso di questa politica è alla base della tanto acclamata sicurezza dei sistemi Linux, ad esempio. E poi aggiornare, aggiornare e ancora aggiornare, il sistema L'aggiornamento del sistema con le ultime patch e fix rilasciate da Microsoft è essenziale. Il secondo martedì del mese, Microsoft rilascia i suoi bollettini di sicurezza e le relative patch che vanno a correggere le relative falle. Troppo spesso ho visto persone dormire sonni tranquilli solo per la presenza del firewall e dei suoi continui popup che avvertivano dell'intrusione bloccata senza che queste persone capissero l'importanza di un sistema aggiornato. Le intrusioni avvengono negli ultimi tempi soprattutto con lo sfruttamento di falle non aggiornate dagli utenti, ed in questo caso il firewall non può fare nulla. Gromozon ci dovrebbe aver insegnato qualcosa!! L'infezione da Gromozon si è diffusa tanto velocemente anche perché venivano sfruttate 5/6 falle nei sistemi Windows, falle per le quali erano già state rilasciate le patch mesi prima. Evidentemente gli utenti infetti avevano ritenuto di essere al sicuro dietro al loro "fiammante" firewall da 70$ di licenza. Nulla di più sbagliato. Alex : Che altro possiamo fare per aumentare il livello di sicurezza? Erreale : Eliminiamo i servizi superflui. Windows carica un'enorme mole di servizi. E' normale che sia così. Windows, essendo "dedicato" ad un pubblico eterogeneo di utilizzatori, ha previsto l'avvio automatico di svariati servizi per andare in contro ai più svariati usi. Tali servizi sono nella maggior parte dei casi inutili per un utilizzo casalingo. Nel mio pc con XP SP2 connesso 24 ore su 24 alla rete con router ho ridotto il numero di servizi in avvio automatico a 9, compreso quello del firewall e dell'antivirus, in confronto alla trentina che di default invece si avviano. Meno servizi, meno porte aperte verso l'esterno. Minor numero di porte aperte, minor possibilità di offrire il fianco a possibili attacchi. Senza considerare che eliminando servizi superflui il vostro sistema ne gioverà anche in termini di prestazioni. Alex : Qualcosa di più tecnico ? Erreale : Utilizzare le aree di sicurezza di Internet Explorer per negare l'uso di ActiveX e Javascript ai siti non fidati. Negli ultimi tempi la maggior parte dei malware e degli exploit hanno utilizzato i controlli ActiveX e Javascript per diffondersi. Browser alternativi come Firefox e Opera sono più sicuri anche perché impossibilitati ad eseguire codice ActiveX. Usare le GPO. Le Group Policy, conosciute anche come Criteri di Gruppo, sono uno strumento molto potente per la configurazione e gestione del sistema. E' possibile configurare ogni aspetto del funzionamento dei computer connessi alla rete. Alex : Quello che hai proposto è un hardening del sistema, perché tutto questo? Erreale : Perché la sicurezza va ricercata per gradi e deve comprendere vari aspetti del sistema. Un sistema configurato correttamente e dotato di un buon firewall diventa estremamente difficile da perforare. Configurare il sistema agendo come detto su più fronti consente di ridurre enormemente la superficie di attacco di una possibile intrusione. Se poi a questo aggiungiamo un buon Hips, beh…si può tranquillamente affermare di avere un sistema ben protetto. Alex : Molti consigliano di usare il firewall di Windows, tu che ne pensi? Erreale : Indubbiamente ha dei limiti. Limiti che sono stati migliorati nel firewall implementato in Vista. Il fatto di aver inserito un firewall, seppur semplice, nelle versioni da XP in poi è comunque un punto a favore di Microsoft. Meglio un firewall semplice che non averlo. Alex : Quale abbinata di software di difesa consigli? Erreale : Non esiste il software perfetto per tutti. Ogni persona è diversa. C'è chi preferisce avere un prodotto semplice, magari dotato di auto-configurazione e che non assilli ogni 2 secondi con allarmi e popup, C'è chi invece, come il sottoscritto, avere un prodotto robusto, altamente configurabile e che arrivi al controllo del più piccolo dettaglio. E' vero, questo ultimo tipo di prodotti richiedono uno sforzo iniziale di configurazione ed apprendimento, ma una volta conclusa la fase di learning un prodotto come questo ripaga degli sforzi profusi, con un livello di sicurezza di primo livello. In linea di massima diciamo che comunque non dovrebbero mancare un antivirus, un firewall ed un Hips, e senza voler essere ripetitivo anche un buon sistema hardenizzato. Alex : Ho letto che una macchina hardenizzata è destinata ad utente esperto, tu che ne pensi? Erreale : Come ogni discorso credo non possa essere preso così com'è in maniera assoluta… Mi spiego meglio. Forse è il concetto stesso di hardenizzazione che andrebbe chiarito. Ovvio che un utente alle prime armi troverà il percorso che porta all'irrobustimento dell'intero sistema un po' più ostico rispetto ad un utente che lavora sul pc da tempo. Ritengo però che sia fondamentale far capire a chiunque l'importanza che riveste un sistema personalizzato in questo modo. Ogni sistema degno di tale nome e che voglia assicurare una certa affidabilità/sicurezza deve essere gestito in sicurezza, quindi essere hardenizzato…. Alex : Ma cosa intendi per hardening? Erreale : E' un processo preposto alla riduzione della possibile superficie di attacco. Durante le operazione di irrobustimento si crea un utente con privilegi ridotti, si disabilitano servizi superflui, si disabilitano alcuni ActiveX che potrebbero essere utilizzati per exploit e infezioni. Si configurano le zone di sicurezza, compresa una quinta zona invisibile denominata Local Machine Zone (My Computer). Si possono disabilitare estensioni di scripting che potrebbero essere potenzialmente pericolose, come: WFS, VBE, JSE, VBS. Si possono rendere invisibili le Administrative shares, ovvero le condivisioni destinate all'amministrazione del sistema. In ultimo si può agire sulle GPO e sul registro di sistema per hardenizzare lo stack TCP. Lo stack TCP/IP è il responsabile del trasporto di pacchetti di dati da una sorgente (identificata da un indirizzo IP) ad una destinazione (identificata da un altro indirizzo IP). Se necessario, questo livello del protocollo si occupa di spezzettare i pacchetti troppo grandi in pacchetti di dimensione adatta alla rete da utilizzare. Sostanzialmente tutte le applicazioni che fanno uso di Internet e tutte le applicazioni tradizionali che si riferiscono a LAN utilizzano IP, benché teoricamente siano possibili altre soluzioni. Il protocollo IP è per impostazione predefinita privo di protezione, ma con l'uso e la configurazione di vari parametri nel registro di Windows è possibile portare benefici alla protezione della rete da attacchi di tipo Denial of Service, inclusi attacchi SYS, ICMP e SNMP. Le chiavi del Registro di sistema possono essere configurate per: -Attivare la protezione dagli attacchi di tipo SYN quando viene rilevato un attacco -Impostare valori limite utilizzati per determinare ciò che costituisce un attacco. Riassumendo, l'hardening di una macchina di un utente esperto sarà un processo molto restrittivo, mentre quello di una macchina applicativa in una zona "sicura" sarà evidentemente meno restrittivo sulla libertà di movimento dell'applicativo specifico Alex : Meno restrittivo equivale a meno sicuro? Erreale : Dipende dal contesto. Meno restrittivo significa concedere al sistema e alle applicazioni installate, firewall compreso, maggiore spazio di lavoro. Anche un firewall, infatti, può essere configurato in maniera più o meno restrittiva. Generalmente i firewall moderni sono in grado di auto configurarsi. L'auto configurazione proposta dal firewall è meno restrittiva di quella che potrebbe creare un utente, proprio perché il firewall "non sa" a quale tipo di utenza è rivolta la configurazione e di conseguenza deve aprire un maggior numero di porte. Facciamo qualche esempio….in fase di auto configurazione aprirà per il browser le porte 80, 443, 20, 21, 8080, 8088 e 3128, mentre il setup che può fare un utente dipenderà dall'uso che questo farà del browser. Generalmente è necessario aprire le sole porte 80 e 443. Per rispondere alla tua domanda.. un Sistema ben hardenizzato è quello in cui l'utente può fare solo quello che deve fare .. e può farlo senza rendersi conto di tale restrizione (se non nel caso in cui tenti di violarla, ovviamente) Altro aspetto importante relativo alla sicurezza sono i nostri indirizzi di posta, negli ultimi tempi c'è un'invasione di spam e phishing che possono eludere le nostre protezioni con varie tecniche e entrare o addirittura rubarci l'account di posta. Come possiamo proteggersi di fronte a queste insidie? Alex : Come possiamo proteggerci dallo spam? King-Lion : Per mettere al riparo gli indirizzi di posta dallo spam basta seguire alcune semplici e piccole regole. mai fornire pubblicamente la propria email, su forum o blog, esistono dei bot che scandagliano le pagine web mondiali alla ricerca di indirizzi mail, che salvano e rinchiudono in un proprio database. Se proprio non possiamo fare a meno di fornire la nostra email, possiamo usare il supporto delle immagini inserendo ad esempio una gif jpg png o altro con la nostra email, (come quella che ho visto nel tuo blog Alex), in questo modo non sarà tracciabile dal bot. Inoltre è meglio usare dei client di posta che hanno il filtraggio delle email, cioè che in automatico riconoscono se non tutte, gran parte delle mail spazzatura. Alex : Tu Alessandro come la pensi? Erreale : La protezione degli account di posta e del relativo client è importante tanto quella della protezione e dell'irrobustimento del browser e delle sue impostazioni. I malware (worm, trojan o virus) hanno da sempre utilizzato la posta elettronica per diffondersi. In effetti è un sistema veloce e sicuro per infettare quanti più sistemi possibili. Le raccomandazioni per la difesa degli account di posta vanno dalle più semplici, e forse perché scontate, non messe in atto, a quelle più tecniche. A parte i vari malware che possono arrivare attraverso la posta elettronica esiste un fenomeno sempre più in voga e che spesso si associa, lavorando in sinergia, con i malware o il phishing: lo spam! Secondo alcune stime ufficiali si è raggiunta la percentuale record di spam circolante pari al 92%. Ovvero 9 mail su 10 sono spam! C'è da dire che molto spesso una buona percentuale di queste mail viene già filtrata dai server dell'ISP, con la conseguenza che gli utenti percepiscono una minore percentuale di spam rispetto a quello effettivamente circolante nella rete. Abbiamo detto che una buona percentuale è filtrata a monte. E quella non filtrata? Beh…quella…la ritrovate puntualmente, tutti i giorni nelle vostre caselle di posta. Alex : Ma allora che facciamo? Erreale : Per combattere, o ancor meglio prevenire il fenomeno spam ci sono molte cose che un utente può fare. -Evitare di diffondere ai 4 venti il proprio indirizzo di posta. Molti siti richiedono in fase di registrazione l'inserimento della casella di posta. Se pensiamo di registrarci ad un sito sicuro e nel quale pensiamo di accedervi spesso anche in futuro possiamo tranquillamente inserire i nostri dati. Se invece ci stiamo registrando ad un servizio del quale non si hanno informazioni sulla "rispettabilità" o magari ci interessa iscriversi su un sito temporaneamente, beh…in quel caso sarebbe opportuno usare i vari servizi di email usa e getta che si possono trovare in rete. Alcuni di questi servizi possono creare email che si "autodistruggono" con tempi variabili da pochi minuti a qualche ora. Alex : Puoi fare un esempio con qualche client di posta? Erreale : Per esempio Outlook Express consente di scegliere in quale area collocare la posta in arrivo: nell'area Internet o nell'area siti con restrizioni. La scelta dell'area dipende dalla pericolosità attribuita al contenuto attivo, come ad esempio controlli e script ActiveX e applicazioni Java, rispetto alla possibilità di visualizzare il contenuto nel proprio computer. Per ogni area, inoltre, è possibile impostare un livello di protezione Alto, Medio, Basso o Personalizzato. Per modificare le impostazioni delle aree di protezione di Outlook Express, selezionare il menu Strumenti selezionare Opzioni e quindi la scheda Protezione (Nota: se si modificano le impostazioni per l'area Internet o l'area Siti con restrizioni, saranno modificate anche le impostazioni per Internet Explorer e vice versa.) Impostare il client di posta in questo modo corrisponde a navigare con il browser con l'area siti con restrizioni al massimo della sicurezza. Una mail con il client così impostato non sarà in grado di eseguire contenuti attivi: javascript, applet java, activex ecc ecc Ultima raccomandazione: non leggere le email in formato html, ma solo in formato testo Alex : Abbiamo accennato al Phishing, come possiamo difenderci? King-Lion : Il Phishing è la tecnica più usata nel web, ma anche la più vecchia. Tale tecnica può essere sfruttata in molteplici modi, anche Online, telefonicamente dal vivo. I consigli per difendersi dal phishing online sono tre: 1) disabilitare i javascript dal proprio browser di navigazione 2) controllare sempre gli url su cui facciamo i login 3) ricordarsi che nessun provider chiederà mai i vostri dati di autentificazione, in quanto possono reperirli dal loro database. Difendersi dal phing telefonicamente e molto più semplice, basta ricordare che nessun provider, potrà mai agire in modo ufficioso, ma solo ufficiale. Quindi se venite contattati da qualcuno spacciandosi ad esempio per la polizia postale, dategli poco conto, perchè non possono fare nulla per telefono, ma dovete attendere al vostro domicilio un documento ufficiale, come una convocazione o una querela/denuncia. Molto più rari sono infine i casi di phishing in cui un individuo si presenta faccia a faccia con voi. In tal caso parliamo più che altro di ingegneria sociale, e l'unico consiglio che posso darvi e quello di chiedere sempre i documenti, ed accertarvi sempre che quel determinato funzionario lavori realmente dove egli ha specificato, magari con una telefonata al suo ufficio Alex : Quale software aggiuntivo possiamo installare per aumentare il livello di sicurezza? Erreale : Un HIPS ovvero Host Intrusion Prevention System sono programmi completamente dedicati al controllo delle attività, dei processi e delle applicazioni che si attivano via via in un pc. Alex : Che funzioni ha un HIPS e come si comporta? Erreale : Un HIPS mantiene costantemente un controllo pressoché completo su tutte le funzioni e i processi di un sistema, sia nel complesso che nella loro particolarità: consente il controllo di ogni singola applicazione e la possibilità di definire divieti, autorizzazioni, funzioni di protezione e controllo individuali e particolari in rapporto all'accesso alla memoria fisica, al livello profondo del sistema, al livello basso della tastiera, alle DLL. Controlla e nello stesso tempo permette di creare regole sia per ogni singola applicazione che per l'interazione che questa può avere o deve avere o non avere con altri servizi, processi e funzioni del sistema. In questa maniera assicura una doppia protezione particolareggiata, passiva rispetto a intrusioni esterne e anche attiva con la possibilità di creare regole ancora più ristrette per specie di applicazioni e per singole applicazioni. Alex : Da come lo descrivi sembra destinato a utenti avanzati, com'è la sua configurazione? Erreale : Come nel caso dei firewall, anche nell'ambiente degli HIPS si possono trovare prodotti più o meno ostici da configurare. Esistono Hips con funzioni di analisi comportamentale preimpostate e che non richiedono complicate azioni di setup. Ci sono Hips che invece non hanno regole preimpostate e che demandano completamente all'utente finale le decisioni da prendere in caso di allert. Indipendentemente dal tipo di Hips, questi prodotti si sono rilevati fondamentali in un'ottica di difesa stratificata. Test indipendenti hanno dimostrato come questi programmi, opportunamente istruiti dall'utente, siano stati in grado di respingere attacchi di nuovi virus, trojan o rootkit, ancor prima che le software house produttrici i software antivirus avessero rilasciato firme virali adeguate." Conclusioni Abbiamo iniziato con la chiarificazione del termine Hacker, dal punto di vista storico – filosofico e penso sia stata chiarita anche la loro posizione rispetto ad un uso improprio di tale termine che è sempre stato usato, abbiamo inoltre sentito un loro esponente King-Lion e ci ha mostrato come sia abbastanza vulnerabile il nostro sistema per un esperto di programmazione. Al tempo stesso ho percepito anche una grande "speranza" che ci ha trasmesso Erreale nel proteggere il nostro sistema, è vero che la vulnerabilità esiste, ma è anche vero che esistono i rimedi, di questo dobbiamo esserne consapevoli, ma soprattutto quello che di fondo ho visto crescere in questo dibattito è che la più grande difesa che possiamo adottare è la Cultura Informatica. Io credo che sentendo le opposte fazioni la prima e più grande arma che possiamo adottare sia proprio quella, non dobbiamo fermarci al solito detto "a chi vuoi che interessi il mio Pc" o nasconderci dietro una finta sicurezza perché abbiamo installato l'ultima Suite "Anti – Tutto". La sicurezza và costruita un po' alla volta, dotando il nostro sistema dei software adeguati che abbiamo discusso in questo articolo, aggiornando il sistema e usando prudenza, il termine giusto sarebbe "stratificata", cioè agendo per strati dal livello applicativo più alto fino a quello più basso, con le giuste configurazioni e usando un po' di curiosità in quello che non si conosce. E' certamente con la passione e la curiosità che si può accrescere la cultura informatica, essere sempre informati delle patch emesse e seguire tutti i consigli che vi abbiamo esposto. Ringrazio King-Lion e Alessandro Recchia per essere intervenuti in questo articolo e anche Marco Giuliani, che per impellenti motivi di lavoro non ha potuto partecipare a questo dibattito, ma che sicuramente parteciperà nel prossimo articolo in cui tratteremo nello specifico le configurazioni da adottare e come effettuarle .
  11. <h3 align="center">Introduzione al Firewall</h3> Oggi la realtà informatica è una realtà che ha avuto una fortissima espansione trovando applicazione, sviluppo e sostegno in quasi tutte le realtà casalinghe ma soprattutto in quelle produttive. Sono proprio quest'ultime che hanno intravisto nell'office automation e nell'informatizzazione dei loro processi produttivi un abbassamento ed una standardizzazione della loro produzione con un chiaro e forte abbassamento dei costi di gestione, in particolare a livello amministrativo. Da notare è come al giorno d'oggi, anche le piccole realtà aziendali che non fanno parte della cosiddetta fascia industriale stiano informatizzando le loro amministrazioni e i loro uffici e investendo annualmente dei capitali solo per la sicurezza dei loro dati sensibili, e delle loro piccole infrastrutture informatiche. In quest'ottica è facile capire che la tematica della sicurezza giochi un ruolo fondamentale nelle produzioni e nelle gestioni informatizzate perché permette di aumentare i guadagni ma soprattutto di prevenire le perdite che possono derivare da malfunzionamenti, problemi generici oppure dal furto di dati strettamente riservati e utili alla concorrenza come spesso mi è capitato durante le mie esperienze nel mondo del lavoro informatico. Su questa tematica possiamo approfondire che la sicurezza informatica è essenziale per le aziende e di come le stesse molto spesso abbiano richiesto soluzioni particolari che rispecchiano determinate caratteristiche e esigenze stabilite dall'utente finale che ne usufruisce e in quest'ottica possiamo dire che la sicurezza può essere divisa in due grandi famiglie Sicurezza Client-Side Sicurezza Server-Side Dietro a queste due grandi famiglie si nascondo processi, metodologie, tipologie di approccio e soluzioni differenti che possono essere semplici oppure estremamente complesse, ed in base alla complessità varia anche il costo che il sistema ha in sé anche se nelle realtà aziendali il costo viene messo spesso al secondo posto dietro l'efficienza e affidabilità di una procedura di sicurezza aziendale. In questa tesi per il mio esame di stato parlerò di un componente silenzioso, comune e ormai noto a tutti gli utenti che lavorano con dati informatici di una certa rilevanza: Il Firewall. Il firewall è ormai un componente basilare in una infrastruttura sistemistica, e nonostante molto spesso sia considerato uno strumento perimetrale o per la sicurezza server-side, esso risulta invece il fido e utile compagno di viaggio per le aziende che intendono proteggere le loro reti perché il firewall può rappresentare l'unico punto di accesso verso l'esterno e come tale, se implementato opportunamente, risulta basilare per proteggere una rete e per evitare la violazione delle policies aziendali anche dall'interno. Questo in termini di guadagno rappresenta un fattore discriminante per una azienda, perché molto spesso la violazione delle policies, e la violazione dei dati avviene proprio a parte degli utenti aziendali che utilizzano le risorse messe a disposizione dalla stessa in maniera errata mettendo a rischio l'incolumità della rete; ed è proprio in questo contesto che esporrò il funzionamento di un firewall e una procedura pratica che ho messo in atto durante questi anni di esperienza nel mondo del lavoro per venire incontro alle esigenze di molte aziende. Le caratteristiche di un firewall che funzioni in maniera efficiente devono essere : Sicurezza Affidabilità Scalabilità Possibilità di updates e integrazione delle nuove tecnologie Contenimento dei costi <h3 align="center">Cos'è un Firewall : terminologia</h3> Innanzitutto, prima di cominciare ad esporre l'argomento, cominciare con l'introdurre alcuni termini comuni per chi naviga in Internet o lavora nel campo sistemistico; ma che risultano molto spesso concepiti erroneamente e senza sapere cosa in realtà essi vogliano dire in gergo tecnico. Terminologia Antivirus : software che permette di rilevare e prevenire l'installazione di codice maligno o files nocivi all'interno di un computer. Un antivirus rappresenta la punta del'iceberg di un sistema sicuro, sia dal lato client che dal lato server. Un antivirus è composto da diversi moduli: Modulo di confronto contenuto con le firme Modulo euristico per rilevamento virus in base al loro comportamento o intestazione(per ovviare alla mancanza di firme aggiornate) Modulo per gli aggiornamenti Modulo di scansione della memoria Alcuni antivirus più evoluti integrano anche moduli per bloccare temporaneamente(ed eventualmente concedere o negare definitivamente) la scrittura di valori nel registro(per i prodotti Microsoft) o in apposite aree di sistema(per tutti i sistemi operativi in commercio). Firewall : dall'inglese muro tagliafuoco ma in italiano detto anche parafuoco; è un componente sistemistico perimetrale passivo, che divide in due o più tronconi la rete: Area Trusted, cioè sicura - LAN Area Untrusted cioè la rete Esterna che rappresenta tutto ciò che è ritenuto non attendibile o sicuro - Internet Zona Delimitarizzata - DMZ AntiSpam : software che è in grado di filtrare i contenuti di un messaggio di posta elettronica in base al loro contenuto o alla loro provenienza. Questi strumenti non sono ancora evoluti come dovrebbero, però certi applicativi permettono una versatilità grazie alla creazione di regole personalizzate che li rendono utili per proteggere account aziendali dallo spam e dal pericolo di incursioni di codici malevoli tramite contenuti contrassegnati come sicuri tramite il vicolo della posta elettronica. Personal Firewall : software che solitamente viene usato a livello client-side, e che svolge più o meno completamente tutte le funzioni che svolge un firewall di rete. I Personal firewall tuttavia lavorano stand-alone e non a livello di infrastruttura e si frappongono tra un client e l'esterno indiscriminatamente, permettendo di bloccare anche determinati processi attraverso l'utilizzo regole personalizzate o predefinite per autorizzare certe applicazioni e anche la loro destinazione verso le zone insicure in maniera flessibile e precisa a cura dell'utente utilizzatore o amministratore del client. Caratteristica dei personal firewall è anche il controllo di ogni processo di sistema che voglia uscire verso l'esterno o lanci una connessione verso l'esterno. IDS ( Intrusion Detection System) : componente software(spesso accoppiato ad un firewall hardware nelle reti aziendali) che permette di rilevare i tentativi di attacco ad una rete analizzando non solo l'intestazione dei pacchetti che attraversano un ipotetico gateway, ma anche analizzando il loro contenuto per identificare anche tentativi di attuazione di exploit come SQL Inejction, attacchi DoS e port-scan ai client interni. Gli IDS rappresentano anche un'ottima alternativa per bloccare i pericoli provenienti dall'interno da parte degli utenti "fidati" che possono aprire varchi nella rete utilizzando programmi semi-automatici inappropriati o insicuri. Indirizzo IP : indirizzo logico introdotto con la suite di protocolli TCP/IP composto da quattro ottetti di un byte ciascuno, che formano un indirizzo complessivo di quattro byte(192.168.0.1). Un indirizzo IP identifica univocamente un pc in una rete, perché due pc non possono avere lo stesso indirizzo logico Subnet Mask : definita comunemente maschera di sottorete, è un parametro fondamentale nella configurazione dei parametri di rete di un PC perché indica al computer se deve instradare i pacchetti verso il gateway per raggiungere la destinazione oppure no. Solitamente è composta come un indirizzo IP in termini di lunghezza. Gateway : indirizzo IP solitamente assegnato al punto di accesso che permette ai computer di una rete di uscire dalla stessa e accedere alle risorse esterne. Molto spesso il gateway è un router, un server oppure il firewall. DNS (Domain Name Solve) : solitamente il DNS è quel dispositivo, è un computer in genere, che si incarica di risolvere i nomi host (es:: www.google.it) in indirizzi IP comprensibili per il computer. Nei parametri di configurazione di una computer, l'indirizzo DNS non è altro un indirizzo IP che punta al computer che si utilizzerà per risolvere i nomi in indirizzi IP. Hacker : è una persona che si impegna nell'affrontare sfide intellettuali per aggirare o superare creativamente le limitazioni che gli vengono imposte, non limitatamente ai suoi ambiti d'interesse ma in tutti gli aspetti della sua vita. In campo informatico è colui che si diverte a violare i sistemi non per fare danni, ma per mettere alla prova se stesso e le sue capacità senza fare danni alle sue "vittime". Cracker : è colui che entra abusivamente in sistemi altrui allo scopo di danneggiarli, lasciare un segno del proprio passaggio, utilizzarli come teste di ponte per altri attacchi oppure per sfruttare la loro capacità di calcolo o l'ampiezza di banda di rete o per carpire informazioni utili che possono fargli trarre profitto. In genere un cracker crea danni alle sue "vittime" Lamer : è colui che sfruttando sistemi automatici, o semi-automatici, creati da hacker o cracker esperti(comunque persone che conoscono l'informatica), riesce a violare i sistemi senza avere particolari conoscenze o abilità informatiche. In gergo lamer significa perdente. Ora che ho chiarito anche alcuni termini comuni che riprenderò successivamente, comincerò ad entrare nel vivo dell'argomento che ho deciso di trattare : Il Firewall di rete Tipologie Come ho accennato precedentemente il firewall di rete è un sistema oppure un insieme di sistemi, passivi che solitamente dividono la rete in due o più parti: Zona Trusted - - LAN Zona Untrusted - - Internet Eventuale DMZ Eventuale rete Wireless Il firewall rappresenta un componente indispensabile per proteggere la propria rete, anche se però comporta delle spese e dei problemi perché se esso non viene configurato correttamente e implementato in maniera corretta può rappresentare un problema all'infrastruttura e diminuire quindi la sicurezza e le prestazione della stessa. Ritornando alla teoria generale di base, i firewall di rete possono essere di diversi tipi, per esempio: Packet Filter Stateful Inspection Application Layer Firewall In entrambi tutti questi casi, il firewall rappresenta generalmente il punto di passaggio del traffico dalla LAN verso l'esterno o viceversa, e può essere segmentato da un ulteriore firewall se l'azienda vuole disporre una DMZ e quindi avere un gruppo di regole precise sia per l'area delimitirazzata(DMZ) che per l'area locale(LAN). Firewall Packet Filter Il packet Filter Firewall è una categoria di firewall molto più complicata rispetto agli altri. Questo tipo di firewall lavora a livello dell'Internet Protocol dello schema TCP/IP. Il Packet Filter Firewall quando riceve un pacchetto di dati lo compara con una serie di criteri prima di inoltrarlo o di rimandarlo al mittente. A seconda delle regole, il firewall può ignorare i pacchetti di dati, inoltrarli al sistema o rimandarli al mittente. I parametri che solitamente il packet Filter Firewall controlla nell'header del pacchetto sono l'indirizzo IP di origine e destinazione, numero della porta TCP/UDP di origine e destinazione e protocollo usato. Solitamente i Packet Filter Firewall usano un processo chiamato Network Address Translation (NAT) che permette di reindirizzare correttamente i pacchetti di rete in uscita dal sistema verso internet. Questo permette di nascondere la struttura della rete interna di una LAN, mascherando il pacchetto uscente come se provenisse da un host differente dal computer mittente della rete interna. Di solito il pacchetto nasconde dunque l'indirizzo ip assegnato al pc nella rete interna e assume l'indirizzo ip della connessione ad Internet. Il packet Filter Firewall è la scelta migliore perché molto veloce e, proprio grazie a questa velocità e "superficialità" del controllo, non grava sulla connessione di rete e non la rallenta. Non è fondamentalmente legato al sistema operativo ma può essere configurato per funzionare su tutta la LAN, se messo alla fonte della connessione ad Internet. Quindi per esempio, una e-mail contenente un virus può tranquillamente passare attraverso il firewall, se è consentito il traffico POP/SMTP. Non ha grandi possibilità di gestione dei dati all'interno del pacchetto dati, non prende decisioni in base al contenuto del pacchetto. Tutto ciò si trasforma in mancanza di scalabilità e piena efficienza per controlli approfonditi sulle attività interne alla LAN. Vantaggi Efficienza Scalabilità Costo di acquisto contenuto Svantaggi impossibilità di updates e di integrazione di nuove tecnologie Superficialità della protezione <h3 align="center">Firewall Stateful Inspection</h3> I firewall hardware solitamente sono simili ai Packet filter Firewall, in quanto lavorano principalmente con la tecnica del Packet filtering. Possono usare anche un'altra tecnica chiamata Stateful Packet Inspection (SPI). La SPI permette un controllo non solo dell'header del pacchetto dati, bensì permette anche di analizzarne il contenuto, per catturare più informazioni rispetto ai semplici indirizzi di origine e destinazione. Un firewall che utilizza questo tipo di tecnologia può analizzare lo stato della connessione e compilare le informazioni ottenute su una tabella così le operazioni di filtraggio dei pacchetti sono basate non solo su impostazioni definite dall'amministratore, ma anche sulla base di regole adottate con pacchetti simili scansionati già precedentemente dal firewall. Per il resto, i pregi e i difetti sono sostanzialmente quelli del packet filter firewall e quindi anche questa tipologia di firewall risulta minima in una infrastruttura adeguatamente protetta anche se questi tipi di firewall non rappresentano una soluzione applicabile per controllare tutta la LAN. Vantaggi Affidabilità Efficienza Scalabilità Costi di mantenimento minori Costo di acquisto contenuto Svantaggi Impossibilità di updates e di integrazione di nuove tecnologie Difficoltà di amministrazione Superficialità della protezione Application Layer Firewall Questa tipologia di firewall è forse la più evoluta che esiste sul mercato, e viene chiamata in gergo firewall L7 perché è una tipologia di firewall che lavora allo strato numero sette della pila ISO/OSI. Questa famiglia di firewall, come ho detto precedentemente, è una tipologia particolare perché appartiene ai cosiddetti firewall-proxy di rete perché molto spesso consiste nell'impostare una macchina che colleghi la LAN all'esterno, consentendo solamente i protocolli conosciuti ed installati dall'amministratore, concedendo solamente i tipi di applicativi stabiliti nelle policies aziendali, oltre alle destinazioni verso l'esterno considerate sicure che saranno dichiarate in una lista definita white-list che si contrappone alle black-list che solitamente vengono catalogate per contenuto proibito(per esempio pornografia, warez, erotismo, pubblicità, hacking ecc ecc). La particolarità di questi firewall proxy è di riuscire ad analizzare tutta l'intestazione applicativa dei pacchetti TCP, e di riuscire ad implementare i controlli dei firewall già descritti, ponendosi non solo come barriera tra una LAN e Internet, ma di riuscire a schermare tutti i client della LAN durante la loro navigazione sul World Wide Web. Questi firewall permettono di proteggere dal pericolo maggiore della navigazione Internet: il contenuto attivo delle pagine WEB, e di poter inoltre prevenire attacchi applicativi come SQL Inejction grazie alla possibilità di integrare degli IDS visto che questi tipi di firewall sono computer dedicati solitamente. Questo sicuramente è il firewall di rete che ho potuto constatare come il più richiesto dalle aziende di medie dimensioni; dove si necessiti di un controllo e soprattutto di un filtraggio dell'uso delle risorse pubbliche come Internet che viene fatto da dipendenti aziendali. Vantaggi Sicurezza Efficienza Affidabilità Scalabilità Possibilità di updates e integrazione di nuove tecnologie di detection Svantaggi Costo Difficoltà di amministrazione Costi di mantenimento maggiori Grosse potenze di calcolo richieste <h3 align="center">Introduzione alle Metodologie di Implementazione di un Firewall</h3> Ora che abbiamo descritto le tre grandi tipologie di firewall esistenti, per completare la parte teorica bisogna descrivere le varie tipologie di implementazione dei firewall, perché i firewall possono essere implementati in maniere particolari rendendolo utile oppure il collo di bottiglia della rete da proteggere. Le tipologie di implementazione vengono basate su due tipologie di approccio fondamentale che vengono impostate dall'amministratore: Tutto ciò che non è specificato è negato Tutto ciò che non è specificato è concesso Il primo tipo di approccio ha il vantaggio di aumentare la sicurezza, ma lo svantaggio di rendere il firewall meno versatile e di poter creare problemi agli utenti nel caso essi debbano effettuare particolari operazioni che non sono state descritte nelle policies aziendali. La seconda metodologia di approccio è una metodologia che ha come vantaggio quello di essere più versatile verso gli utenti e quindi di richiedere meno modifiche da parte dell'amministratore nel caso i servizi aziendali debbano essere scalati per esigenza. Tuttavia questa metodologia è meno sicura e quindi espone l'infrastruttura a pericoli maggiori nel caso dell'errore informatico più comune e grave: l'errore umano. Sicuramente la scelta dipende dall'amministratore, anche se solitamente, per evitare problemi futuri derivanti da viste o errori nelle policies aziendali, viene utilizzato un approccio che consiste nel far bloccare al firewall tutto ciò che non è stato specificato nelle sue tabelle di configurazione. <h3 align="center">Tipologie di Implementazione dei Firewall di Rete</h3> Firewall come Filtro Una implementazione del firewall di rete è quella di utilizzarlo come filtro, e forse è una delle funzioni ormai implementate nella maggior parte dei firewall di rete scalabili e dei Persona Firewall evoluti. Questa tipologia di implementazione è spesso considerata come primo punto di una infrastruttura di rete perché permette di sfruttare il NAT e quindi far filtrare qualsiasi connessione al firewall e mascherarla come a nome dello stesso denominando tutta la procedura come transparent firewalling implementato di default nel mondo open-source da sistemi come OpenBSD e FreeBSD. " Questa metodologia è oramai richiesta basilarmente nelle medio-grandi realtà aziendali, perché permette di mascherare tutti gli usi fatti di Internet dall'interno verso l'esterno" " Questo tipo di firewall è in grado di effettuare un'analisi state full a livello di connessione(quindi del protocollo IP di interconnessione implementato nella suite TCP/IP)" <h3 align="center">Firewall come Gateway</h3> Questa metodologia di implementazione del firewall consiste nello sfruttare il firewall come unico punto di accesso verso l'esterno da parte di tutte le N sotto-reti o aree demilitarizzate presenti nell'infrastruttura LAN da proteggere. Questo accorgimento consiste nel porre il firewall come unico punto di accesso vero l'esterno per la rete, o sotto-rete da proteggere, e ponendo il suo indirizzo IP come indirizzo di gateway su tutti i computer dell'area da esso protetta. In questo caso il firewall avrà N interfacce, cioè N schede di rete o porte ognuna configurata per appartenere alla propria sotto-rete o area di appartenenza che dovrà proteggere. Guardando la figura qui a fianco come esempio, il firewall che protegge la rete interna avrà due interfacce di rete, una configurata con i parametri di configurazione(Indirizzo IP, Subnet Mask e Gateway) simili a quelli dei client della rete da proteggere; mentre la seconda interfaccia di rete sarà configurata similarmente all'interfaccia esterna alla quale è collegata: cioè alla DMZ alla quale appartengono i server Web e FTP. Il firewall che sta a monte dell'accesso Internet avrà due interfacce di rete: una configurata per appartenere alla DMZ e una che gestirà la zona esterna verso Internet. In casi particolari un firewall potrà avere anche N interfacce ovvero ognuna per ogni sotto-rete che deve interconnettere. Questa metodologia di implementazione del firewall presuppone che il firewall svolga anche delle funzioni di routing perché dovrà decidere che percorso far fare, ai pacchetti nel caso un computer debba andare fuori dalla propria sotto-rete o area di appartenenza. Spesso questo tipo di firewall viene rappresentato da un computer dedicato, ma non necessariamente perché tutto ciò potrebbe anche essere creato con dispositivi hardware appositi come i firewall hardware PIX della CISCO. Grazie a questa tecnica ogni firewall non sarà più passivo perché svolgendo funzioni di routing dovrà controllare e instradare tutte le connessioni verso l'esterno e inoltrando le stesse ufficialmente a suo nome tramite la tecnica del natting, e poi eventualmente decidere quali connessioni tenere e quali bloccare. Con questa metodologia potremmo predisporre un'insieme di regole apposite per i client della rete interna che saranno fatte rispettare dal firewall che protegge quell'area, mentre un altro firewall si occuperà delle regole dedicate alla DMZ che saranno ovviamente più specifiche e diverse, sempre riferendoci al caso espresso nella figura sottostante. " Questo accorgimento consiste nel porre il firewall come indirizzo di gateway della LAN, cioè della zona che esso dovrà proteggere" <h3 align="center">Firewall come estensione della propria LAN</h3> Questa non è una vera e propria tipologia di implementazione di firewall, ma un particolare utilizzo che si può fare di strumenti come un firewall di rete. Questa funzione è molto richiesta da parte di moltissime aziende al giorno d'oggi, ed è una funzione che si ritrova implementabile in sempre più firewall di rete evoluti e che permette la possibilità di gestire le VPN (Virtual Private Network). Una VPN permette di estendere la propria rete LAN verso altre reti private, o stabilite, utilizzando come dorsale una rete pubblica, e quindi intrinsecamente insicura. E' proprio per questo motivo che si utilizzano dei firewall di rete per fare queste estensioni delle reti perché essi sono in grado di gestire in maniera più specifica e in maggior misura gli utenti abilitati all'accesso dall'esterno oltre ai consoni e basilari username e password. Un'altra cosa interessante di questa tipologia di implementazione dei firewall di rete è l'aiuto e l'apporto importante che da la crittografia dei dati che rende così possibile la comunicazione sicura tra due reti private che sfruttano come canale la rete pubblica di Internet che come già detto è intrinsecamente insicura. Tutto ciò avviene perché i dati trasmessi da una rete privata all'altra vengono automaticamente criptati e decriptati dai firewall che hanno la medesima chiave di crittografia che permette a loro di cifrare e decifrare automaticamente le transazioni appartenenti alla VPN rendendo così la trasmissione sicura in modo trasparente senza che l'utente utilizzatore se ne accorga. La funzione VPN è possibile anche tra la propria rete locale e un singolo computer (un portatile) in Internet ed è sufficiente installare nel portatile un apposito software che si occupi di crittografare / de-crittografare i dati provenienti dal firewall utilizzando la medesima chiave di crittografia. I vantaggi di questa tecnologia sono ovvi, perché essa mette a disposizione diversi vantaggi come: Riduzione drastica dei costi per i collegamenti aziendali. Maggiore sicurezza nella trasmissione dei dati Accesso sicuro da parte di utenti di portatili o di PC collegati tramite Internet alla propria rete aziendale " Una VPN, cioè una Virtual Private Network, permette di estendere la propria rete privata verso altre reti private utilizzando come dorsale una rete pubblica e quindi intrinsecamente insicura " " Un'altra cosa interessante di questa tipologia di implementazione dei firewall di rete è l'aiuto, e l'apporto importante che da la crittografia dei dati che rende possibile la comunicazione sicura "
  12. bisogna vedere cosa intendi per "molto complessi". Una macro sicuramente velocizza notevolmente il lavoro e garantisce una forte stabilità nell'automatismo di determinati processi. Importante è scrivere un codice lineare
  13. prova a togliere la spunta a "applica a tutte le diapositive" da transizione (clik col Dx sulla 1° diapositiva e nel menù di Dx trovi in basso il box che ti ho descritto
  14. riporta l'errore che ti viene mostrato per intero. e controlla da esplora risorse - opzioni cartella - tipi di file , scorri la lista fino al file xls e controlla che sia associato a excel
  15. prova a scaricare questo file che ho trovato tempo fa in rete. vedi se ti và bene http://www.mediafire.com/?fmoenhmyocm PS. per eseguire il download devi concedere Java