2016 Visual Basic For Application Guida Pratica per Esempi Ing. Nicola Cappuccio 02/04/2016
1. VBA - Visual Basic For Application... 2 1.1. Come creare una Macro... 2 Attivare l opzione di sviluppo in Excel 2013... 2 Creare una Macro di Nome Esempio... 2 1.2. Esempi... 3 Hello World in VBA... 3 I tipi in VBA... 5 Macro che copia il contenuto di una cella in un altra cella... 6 Macro che somma il contenuto della cella A1 con il contenuto della cella A2 e lo inserisce nella cella A3... 6 Esercizio 1: Calcolatrice... 6 Sub incremento e decremento... 6 Esercizio 2: Calcolo dei divisori di un numero... 7 1.3. Generazione di un numero casuale... 8 1.3.1. Casella di input dati... 8 1.3.2. Modificare lo sfondo di una cella... 8 1.3.3. Sub per indovinare il numero generato... 8 1.4. istruzione if Then.Else... 9 1.5. Ciclo For. Next... 10 1.5.1. Esempio: decrementa contatore... 10 1.5.2. Esempio: affonda cella... 11 1.5.3. Esempio: Colora cella con tasti Up Down... 12 1.5.4. Sub delay... 13 1.5.5. Application.Wait(Now + #12:00:01 AM#)... 13 Ing. Nicola Cappuccio 1
1. VBA - Visual Basic For Application 1.1. Come creare una Macro Attivare l opzione di sviluppo in Excel 2013 Creare una Macro di Nome Esempio Ing. Nicola Cappuccio 2
1.2. Esempi Hello World in VBA Sub HelloWorld() MsgBox ("Hello World!") Ing. Nicola Cappuccio 3
Ing. Nicola Cappuccio 4
I tipi in VBA Ing. Nicola Cappuccio 5
Macro che copia il contenuto di una cella in un altra cella Creare una macro come mostrato nel punto 2) ed inserire il seguente codice 'La macro copia il contenuto della cella A1 nella cella A2 Sub copia() Dim a, b As Integer a = Range("A1") Range("A2") = a Macro che somma il contenuto della cella A1 con il contenuto della cella A2 e lo inserisce nella cella A3 Sub somma() Dim a, b, c As Integer a = Range("A1") b = Range("A2") c = a + b Range("A3") = c Esercizio 1: Calcolatrice Creare una calcolatrice con le seguenti operazioni: +, -, *, /, Sqr( ) Sub incremento e decremento La Sub incremento incrementa il valore contenuto nella cella A1 La Sub decrementa decrementa il valore contenuto nella cella A1 Sub incrementa() Range("A1") = Range("A1") + 1 Sub dencrementa() Range("A1") = Range("A1") - 1 Ing. Nicola Cappuccio 6
Esercizio 2: Calcolo dei divisori di un numero La Macro divisori() calcola i divisori del Contenuto della cella A1 e li scrive nelle celle dalla A2 in poi in modo orizzontale. Sub divisori() Dim n As Long Dim i As Long Dim j As Long n = Cells(1, 1) j = 1 For i = 1 To n If n Mod i = 0 Then Cells(2, j) = i j = j + 1 End If Next i La Macro cancella() cancella il contenuto della celle presenti nelle righe A1, A2 Sub cancella() Rows("1:2").Select Selection.ClearContents Range("A1").Select Ing. Nicola Cappuccio 7
1.3. Generazione di un numero casuale Dim value As Integer value = CInt(Int((10 * Rnd()) + 1)) 1.3.1. Casella di input dati Dim a As Long a = InputBox("inserisci un numero da 1 a 10") 1.3.2. Modificare lo sfondo di una cella Cells(value, value).interior.color = RGB(200, 160, 35) 1.3.3. Sub per indovinare il numero generato Sub ingresso_dati() Dim a As Long Dim value As Integer value = CInt(Int((10 * Rnd()) + 1)) a = InputBox("inserisci un numero da 1 a 10") Cells(a, a) = a MsgBox (" numero casuale: " & value) If a = value Then Cells(value, value).interior.color = RGB(200, 160, 35) Ing. Nicola Cappuccio 8
sintassi 1.4. istruzione if Then.Else ' Multiple-line syntax: If condition Then [ statements ] ElseIf elseifcondition Then [ elseifstatements ] Else [ elsestatements ] ] End If ' Single-line syntax: If condition Then [ statements ] Else [ elsestatements ] Esempio: Sub selezione() delimitatore: inizio sub() Dim x, y As Integer x = InputBox("inserisci il valore di x: ") y = InputBox("inserisci il valore di y: ") If x = y Then MsgBox ("hai inserito du evalori uguali " & x) ElseIf x > y Then MsgBox (x & " è maggiore di " & y) Else MsgBox (y & " è maggiore di " & x) End If delimitatore: fine della sub() Ing. Nicola Cappuccio 9
1.5. Ciclo For. Next Sintassi For contatore = inizio To fine espressioni da ripetere Next contatore 1.5.1. Esempio: decrementa contatore Sub ciclo() For contatore = 1 To 5 MsgBox ("il valore di contatore è: " & contatore) Next contatore Ing. Nicola Cappuccio 10
1.5.2. Esempio: affonda cella Sub codice() Dim x, y As Integer Dim valore As Boolean Dim i, j As Integer Dim answere As Integer MsgBox ("abbatti la nave, inserisci le coordite valore min=1, valore Max=5") MsgBox ("giocatore 1") i = InputBox("inserisci il valore di i: ") j = InputBox("inserisci il valore di j: ") 'MsgBox (i & " " & j) label1: x = InputBox("inserisci il valore di x: ") y = InputBox("inserisci il valore di y: ") MsgBox (x & " " & y) valore = x And i And y And j 'MsgBox ("valore " & valore) If valore Then MsgBox ("nave affondata! ") Cells(i, j) = "AFFONDATA" 'Cells(x, y).interior.color = RGB(200, 160, 35) End End If answere = MsgBox("vuoi riprovare? ", vbyesno + vbquestion) If answere = vbyes Then MsgBox ("ok!") GoTo label1 ElseIf answere =vbno Then Range("A1:E5").Select Selection.Delete Range("A1").Select End End If Ing. Nicola Cappuccio 11
Sub clear_cells() Range("A1:E5").Select Selection.Delete Range("A1").Select 1.5.3. Esempio: Colora cella con tasti Up Down Sub colora_r_up() Dim R As Integer R = Cells(2, 1) R = R + 1 If R < 256 Then Cells(2, 1) = R Cells(4, 4).Interior.Color = RGB(R, Cells(2, 2), Cells(2, 3)) Else Cells(2, 1) = 255 End If Sub colora_r_down() Dim R As Integer R = Cells(2, 1) R = R - 1 If R > 0 Then Cells(2, 1) = R Cells(4, 4).Interior.Color = RGB(R, Cells(2, 2), Cells(2, 3)) Else Cells(2, 1) = 0 End If Ing. Nicola Cappuccio 12
1.5.4. Interrompere una macro in loop CTRL+pausa 1.5.5. Sub delay È una sub che può essere richiamata da qualsiasi altra sub. Ha lo scopo di fornire un ritardo durante l esecuzione di un altra macro. Accetta il parametro time definito come numero intero che definisce il tempo di ritardo. Sub delay(byval time As Long) For i = 1 To time i=i Next i 1.5.6. Application.Wait(Now + #12:00:01 AM#) Sub delay(byval secondi As Double) tempo = Application.Wait(Now + #12:00:01 AM#) * secondi Sub ritardo_sec() Dim ms As Double Sec = InputBox("inserisci il ritardo in secondi utilizzando il carattere virgola per indicare i decimi di secondo: ") delay (Sec) Applicazione: la macro arcobaleno colora in successione la cella D:4. L intervallo di tempo tra due sfumature successive è deciso tramite input da tastiera. Sub arcobaleno() Dim R, G, B, i As Integer Dim ritardo As Long R = 0 G = 0 Ing. Nicola Cappuccio 13
B = 0 ritardo = InputBox("ritardo ") For i = 1 To 255 delay (ritardo) R = i Cells(4, 4).Interior.Color = RGB(R, G, B) Next i For i = 1 To 255 delay (ritardo) G = i Cells(4, 4).Interior.Color = RGB(R, G, B) Next i For i = 1 To 255 delay (ritardo) B = i Cells(4, 4).Interior.Color = RGB(R, G, B) Next i Ing. Nicola Cappuccio 14