Excel VBA Lezione 17. Generare numeri casuali

Documenti analoghi
Visual basic base Lezione 13. Ancora su ListBox e cicli

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Visual basic base Lezione 10. Le istruzioni condizionali

Visual basic base Lezione 03. Gli eventi

Excel 2007 avanzato Lezione 08

VBA Principali Comandi

Visual basic base Lezione 11. Le istruzioni condizionali: un esempio pratico

Algoritmi e dintorni: La radice quadrata Prof. Ettore Limoli. Formule iterative

VISUAL BASIC FOR APPLICATION

MINIMANUALE VBA PER CREARE MACRO NEI FOGLI EXCEL

Excel & VBA. Excel e Visual Basic for Application

13 Le funzioni di ricerca e riferimento

28/02/2014 Copyright V. Moriggia

Codice Gray. (versione Marzo 2007)

Corso sul PACCHETTO OFFICE. Modulo Access

Questo corso di formazione è stato creato da 5 organizzazioni che si occupano di diritti delle persone con disabilità intellettive in cinque diversi

Visual Basic For Application Guida Pratica per Esempi

5 Array Cicli iterativi Contenuto di cella 28/02/2014 Copyright V. Moriggia 1

È giunto il momento di imparare a rappresentare visivamente i nostri dati: un buon grafico alle volte è più eloquente di pagine e pagine di dati.

Come creare un modulo per Joomla?

Excel & VBA. Excel e Visual Basic for Application

Appunti di informatica. Lezione 4 anno accademico Mario Verdicchio

Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Word Formattazione del testo. Samuele Mazzolini

usare le funzioni aritmetiche e logiche di base come. Volgiamo costruire un foglio elettronico in cui registriamo i voti presi

Excel memorizza il riferimento alla cella A1 sotto forma di distanza dalla cella contenente la formula.

Esercitazione. Excel: le macro. C.1 Registrazione di macro

(ED IMPARARE LE REGOLE DELLE OPERAZIONI)

LA CODIFICA DELL INFORMAZIONE. Introduzione ai sistemi informatici D. Sciuto, G. Buonanno, L. Mari, McGraw-Hill Cap.2

Access 2007 Colonna di ricerca

5 - Istruzioni condizionali

IMPOSTAZIONI DI EXCEL. Per rendere disponibile l ambiente di sviluppo di Visual Basic for Application in Excel:

02/12/2012 LABORATORIO DI INFORMATICA. Formule e Funzioni. Utilizzare una funzione

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Almerico Murli - Le variabili strutturate (array) VARIABILI STRUTTURATE (ARRAY)

Allocazione Dinamica della Memoria

I Circuiti combinatori: LOGISIM

Appunti di informatica. Lezione 10 anno accademico Mario Verdicchio

3. Le routine evento in Access 2000/2003

1 Esercizi di Matlab. L operatore : permette di estrarre sottomatrici da una matrice assegnata. Vediamo alcuni esempi.

Excel 3. Master Universitario di II livello in MANAGER NELLE AMMINISTRAZIONI PUBBLICHE A.A Prof.ssa Bice Cavallo

Sviluppare un programma in FORTRAN

9In questa sezione. Ordinare e filtrare i dati. Dopo aver aggiunto dati ai fogli di lavoro, potresti voler

Le Strutture di controllo Del Linguaggio C. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

Definizione di metodi in Java

MODULO 4: LE STRUTTURE ITERATIVE: FOR, WHILE E DO LOOP UNTIL

Linguaggio C - sezione dichiarativa: costanti e variabili

Laboratorio di Python

Rimuovere la password dalle protezioni di foglio e cartella in Excel

Caratteri e stringhe

Cloud GDrive, Dropbox

Fortran in pillole : prima parte

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica

VARIABILI, ASSEGNAZIONE, DECISIONI

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Individuazione di sottoproblemi

Creare maschere personalizzate

Funzioni, Stack e Visibilità delle Variabili in C

Appunti di informatica. Lezione 3 anno accademico Mario Verdicchio

ESERCITAZIONE N.8. Il calcolatore ad orologio di Gauss. L aritmetica dell orologio di Gauss. Operazioni e calcoli in Z n

ZonabitOrario COME IMPORTARE LE CATTEDRE DA SISSI AXIOS COME CARICARE L ORARIO NEL REGISTRO ELETTRONICO AXIOS

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Ricerca obiettivo. Pag. 1

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

La ricerca dicotomica

Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Access. P a r t e t e r z a

Basi di Dati: Corso di laboratorio

LE STRUTTURE DATI PARTE 2: RECORD. Prof. G. Ciaschetti

3 Foglio di calcolo I

Insert > Object > Chart

Automazione Excel con Visual Basic (base)

Laboratorio di Programmazione: Linguaggio C Lezione 9 del 27 novembre 2013

Utilizzo del linguaggio Basic utilizzando l interfaccia di Excel Silvia Patacchini

Tutorial Calcolatrice

Laboratorio Informatica

Transcript:

Tutorial 1: La tombola Generare numeri casuali Generare numeri casuali Nei moduli precedenti del corso ci siamo occupati delle basi di VBA, da questa lezione in avanti vi proponiamo dei mini progetti in cui potrete applicare quanto imparato oltre a scoprire funzioni, oggetti, metodi, nuovi. Tutto quello che imparerete poterete poi riapplicarlo nei vostri progetti personali. Abbiamo pensato di proporvi tre tutorial in cui realizzeremo tre semplici progetti In modo da affrontare molti dei piccoli problemi che vi si possono presentare lavorando con VBA. Cominceremo realizzando una tombola. Avrete a disposizione una cartella con 15 numeri che vanno da 1 a 90, generati casualmente, con un pulsante potrete estrarre i numeri da un ipotetico sacchetto di 90 numeri. Se sulla vostra cartella c è il numero estratto, questo sarà evidenziato automaticamente. La prima volta che su un riga della cartella saranno evidenziati due numeri, avrete fatto ambo. Se i numeri sono tre, terno, se cinque, cinquina. Se 15 tombola. Per evitare di complicare troppo le cose, procederemo passo per passo. In questa lezione impareremo a generare numeri casuali, quindi a verificare che non si ripetano. Poi li scriveremo nella colonna A del nostro file, in modo che i numeri estratti siano sempre visibili. Cominciamo subito. Create un file nuovo e aggiungete un pulsante che chiameremo cmdestrai. Fate doppio clic su di esso e completate la routine sub che gestisce il clic sul pulsante come segue Private Sub cmdestrai_click() Randomize intnumestratto = Round(Rnd() * 89) + 1 ActiveCell = intnumestratto End Sub Alessandra Salvaggio Merlin Wizard DMC 2007 Tutti i diritti riservati 1

All inizio del foglio di codice dichiarate la variabile intnumeestratto con tipo integer (Figura 1). Figura 1 Per ora ci limitiamo a generare un numero casuale compreso fra 1 e 90 e a scriverlo nella cella attiva. Vediamo di capire come abbiamo fatto. La funzione Rnd() restituisce un numero casuale compreso fra 0 e 1. Per ottenere un numero maggiore di 1 e compreso fra altri due numeri occorre utilizzare questa formula Int((limiteSuperiore limiteinferiore + 1) * Rnd + limiteinferiore) Che nel nostro caso diventa Int((90 1+1) * Rnd + 1) Ossia Int(90 * Rnd + 1) Con la funzione Int prendiamo solo la parte intera del numero. L istruzione Randomize serve per inizializzare il generatore di numeri casuali. Fin qui tutto bene, ma ora dobbiamo correggere la nostra routine in modo che i numeri estratti siano univoci, cioè che ogni volta che estraiamo un numero sia sicuramente diverso. Occorrerà lavorare un po. Intanto correggete la routine che gestisce l evento clic sul pulsante come segue Private Sub cmdestrainumero_click() Dim blnestratto As Boolean Dim blntrovato As Boolean Dim y As Integer Randomize If intestrazioni < 90 Then Do Until blnestratto = True Or intestrazioni = 90 Alessandra Salvaggio Merlin Wizard DMC 2007 Tutti i diritti riservati 2

blntrovato = False intnumestratto = Int((90 1 + 1) * Rnd + 1) For y = 0 To intestrazioni If IntNumeriEstratti(y) = intnumestratto Then blntrovato = True Exit For Next If blntrovato = False Then intestrazioni = intestrazioni + 1 IntNumeriEstratti(intEstrazioni) = intnumestratto Range("A" & intestrazioni) = intnumestratto blnestratto = True Loop Else MsgBox "hai già estratto tutti i numeri" End Sub All inizio del foglio di codice dichiarate anche le variabili Dim IntNumeriEstratti(90) As Integer Dim intnumestratto As Integer Dim intestrazioni As Integer Il codice non è eccessivamente lungo, ma presenta diverse novità. Analizziamole una per una. Cominciamo proprio dalla dichiarazione delle variabili. La prima delle variabili che vi ho indicato usa una sintassi che non abbiamo ancora incontrato, infatti, dopo il nome della variabile, fra parentesi abbiamo posto un numero intero. Dim IntNumeriEstratti(90) As Integer Si tratta di un Array, ossia una variabile che può contenere più di un valore. Ogni valore occupa una posizione numerata da 0 in avanti, nel nostro caso ci sono 91 valori possibili da 0 a 90 appunto. In questo array memorizzeremo via via i numeri che andremo a estrarre, così ad ogni nuova estrazione potremo verificare se il numero estratto è già stato Alessandra Salvaggio Merlin Wizard DMC 2007 Tutti i diritti riservati 3

estratto (e quindi occorre scartarlo e ripetere l estrazione) o è nuovo (e quindi possiamo accettarlo. Vedremo più avanti come fare praticamente. Nella variabile intestrazioni andremo a memorizzare il numero di estrazioni andate a buon fine, cioè quelle in cui il numero risulta non ripetuto. Il numero massimo di estrazioni deve essere 90. Infatti, una nuova estrazione viene effettuata solo se il numero il numero di estrazioni già effettuate è minore di 90 (If intestrazioni < 90) in caso contrario viene mostrato un messaggio all utente che lo informa che le estrazioni possibili sono già state tutte effettuate (Else: MsgBox "hai già estratto tutti i numeri"). Passiamo ora a vedere come viene effettuata l estrazione. Il tutto avviene in un ciclo Do Until loop che abbiamo imparato ad usare nella lezione di ieri. Usiamo la variabile blnestratto per verificare che l estrazione sia avvenuta. Il ciclo viene ripetuto fino a che questa variabile non assume valore True o fino a quando le estrazioni sono 90. All interno del ciclo Do Until loop usaiamo la variabile blntrovato per verificare se il numero estratto è nuovo o ripetuto. All inizio del loop cioè a ogni nuovo ciclo assegniamo a questa variabile il valore False. Se alla fine del ciclo (per ora lasciate un attimo da parte il ciclo For.. Next, ne parleremo più sotto), con una istruzione If verifichiamo se questa variabile è ancora falsa If blntrovato = False Then intestrazioni = intestrazioni + 1 IntNumeriEstratti(intEstrazioni) = intnumestratto Range("A" & intestrazioni) = intnumestratto blnestratto = True In caso positivo, cioè se la condizione si verifica, incrementiamo il numero delle estrazioni avvenute con successo (intestrazioni = intestrazioni + 1), accettiamo il numero estratto e lo memorizziamo fra quelli estratti (IntNumeriEstratti(intEstrazioni) = intnumestratto), scriviamo il numero in una nuova riga della colonna A ( Range("A" & intestrazioni) = intnumestratto), assegnamo alla variabile blntrovato il valore true (blnestratto = True ) in modo da interrompere il loop (non occorre estrarre altri numeri). Queste istruzione vi sono tutte note (quindi non c è bisogno di rispiegarle), tranne IntNumeriEstratti(intEstrazioni) = intnumestratto. Concentriamoci un po si di essa. Ricordate che IntNumeriestratti è un array che può contenere diversi valori. Quando abbiamo creato questo array ci siamo limitati a indicare quanti valori poteva memorizzare al suo interno. Ora andiamo a specificare quali sono questi Alessandra Salvaggio Merlin Wizard DMC 2007 Tutti i diritti riservati 4

valori. Li inseriamo uno alla volta, ogni volta che vengono estratti. Per indicare in quale posizione (indice) metterli usiamo il valore assunto da intestrazioni. Alla prima estrazione il valore sarà memorizzato in posizione 1, poi in posizione 2 e così via. Considerate che sia IntNumeriEstratti che intestrazioni sono state dichiarate all inizio del foglio di codice e non all interno della rountine cmdestrainumero. In questo caso conservano il loro valore fin che il file è aperto. Dunque ogni volta che si preme il pulsante cmdestrainumero possiamo leggere il loro valore. Facciamo ora un passo indietro e torniamo all istruzione For Next. All interno di questa istruzione andiamo a verificare se il numero è già stato estratto. For y = 0 To intestrazioni If IntNumeriEstratti(y) = intnumestratto Then blntrovato = True Exit For Next Vediamo un po come si effettua questa verifica. Dobbiamo andare a controllare tutti i numeri memorizzati nell array IntNumeriEstratti, quindi utilizziamo la variabile y per specificare il suo indice. Quando y vale 1 la verifica sarà fra il numero estratto e il valore che si trova in posizione 1 nell array e il numero estratto, quando vale 2 la verifica sarà fra il numero estratto e il valore che si trova in posizione 2 nell array e così via. Se il numero viene trovato blntrovato assume valore True e si interrompe la ricerca. L istruzione Exit For termina, infatti l esecuzione di un ciclo for. Avrete già capito che se blntrovato ha valore True, non si verifica la condizione dell istruzione If che abbiamo analizzato prima. Il numero dunque non è accettato, né memorizzato nell array. Il numero di estrazioni non viene incrementato. Si passa ad estrarre un nuovo numero che poi sarà verificato e così via. Array creati col contenuto Prima di concludere questa lezione, dobbiamo ricordare che è anche possibile specificare fin dall inizio i valori che deve contenere un array. Basta specificarli in fase di creazione del array stesso. Questa soluzione è utile quando i valori dell array non cambiano durante l esecuzione del codice. Facciamo un esempio semplice (domani torneremo alla nostra tombola) Su un foglio abbiamo inserito un pulsante cmddataoggi. Premendo questo pulsante vogliamo che Excel ci informi su quale è il giorno della settimana corrente. Alessandra Salvaggio Merlin Wizard DMC 2007 Tutti i diritti riservati 5

Completate come segue la routine che gestisce l evento clic sul pulsante cmddataoggi Private Sub cmddataoggi_click() Dim Data As Variant Dim giorno As Integer Dim GiornoSettimana As Variant Dim giorni As Variant giorni = Array("Lunedì", "Martedì", "Mercoledì", _ "Giovedì", "Venerdì", "Sabato", "Domenica") Data = Date giorno = Weekday(Data, vbmonday) GiornoSettimana = giorni(giorno 1) MsgBox "oggi è " & GiornoSettimana End Sub L array viene creato dalle istruzioni in grassetto. Dichiariamo la variabile che lo rappresenta, poi lo riempiamo dei valori che deve contenere. I valori vanno sempre separati da una virgola. Il resto del codice non è difficile. Memorizziamo nella variabile Data la data di sistema. La data di sistema ci viene restituita dalla funzione Date. Date restituisce un valore di tipo Variant, quindi, anche la variabile che la ospita deve essere definita in questo modo. Una volta creata la data, con la funzione W eekday andiamo a leggere il giorno della settimana corrispondente alla data corrente. Nella funzione Weekday abbiamo specificato, con la costante vbmonday che vogliamo che il giorno 1 della settimana sia Lunedì (altrimenti, per impostazione predefinita, il primo giorno della settimana è considerata la domenica). Una volta ricavato il numero del giorno (Lunedì = 1, Martedì = 2, ) Lo usiamo per specificare la posizione dell Array che volgiamo leggere. Al valore ricavato dobbiamo togliere 1, infatti la prima posizione di un array ha sempre valore 0. Alessandra Salvaggio Merlin Wizard DMC 2007 Tutti i diritti riservati 6