Elementi di Programmazione Tipi di Dati e Conversioni Istruzioni di controllo del flusso EP 11/12 - PB Lezione 3 1 Problemi con i tipi di dati Proviamo a leggere da inputBox un numero • Creiamo un bottone • Nel codice di gestione del click creiamo una inputBox e leggiamo un dato • Il dato lo convertiamo in una variabile “numero” di tipo integer • Scriviamo numero in una casella EP 11/12 - PB Lezione 3 2 Problemi con i tipi di dati (sol) Private Sub CommandButton1_Click() Dim numero As Integer Dim str_in As String str_in = InputBox("Dato") numero = CInt(str_in) Range("E5") = numero End Sub EP 11/12 - PB Lezione 3 3 Controllo delle conversioni di Tipo • Alcune funzioni che permettono di evitare errori di conversione IsNumeric(espr) True se espr è compatibile con un numero (decimale o intero) IsDate(espr) True se espr è compatibile con un formato data EP 11/12 - PB Lezione 3 4 Istruzioni di controllo del flusso • Nei linguaggi di programmazione imperativi (come VBA, C, Pascal) l’ordine di esecuzione è strettamente sequenziale. • Molto spesso questo modo di eseguire i programmi non è sufficiente per gestire tutte le necessità. • Esistono dei modi per variare questo ordine: – – – – Istruzioni condizionali Istruzioni cicliche Richiamo di sottoprogrammi/funzioni Esiste anche un quarto modo in disuso: istruzioni di salto EP 11/12 - PB Lezione 3 5 Istruzioni condizionali (1) • Ogni linguaggio di programmazione possiede un’istruzione che permette di scegliere fra due strade in base ad una condizione • L’istruzione VBA è: If condizione Then istruzioni quando condizione è vera Else istruzioni quando condizione è falsa End If EP 11/12 - PB Lezione 3 6 Istruzioni condizionali (2) • La seconda parte (ramo Else) è facoltativa, non è facoltativa l’istruzione End If. • Supponiamo di voler verificare se il valore della cella D3 è positivo scrivendo un opportuno messaggio nella cella F3: Private Sub CommandButton1_Click() If Range("D3") > 0 Then Range("F3") = "positivo" Else Range("F3") = "NON positivo" End If End Sub EP 11/12 - PB Lezione 3 7 Istruzioni condizionali (3) Nella forma più generale l’istruzione è: If condizione Then istruzioni ElseIf condizione Then istruzioni Else istruzioni End If EP 11/12 - PB Lezione 3 8 Istruzioni condizionali (4) • I rami ElseIf ed Else sono facoltativi. • Ci possono essere più rami ElseIf ma un sol ramo Else – Ciascun ramo può valutare una condizione diversa – Per evitare l’uso di molti rami ElseIf in ceri casi è preferibile usare l’istruzione Select Case • Le istruzioni If possono essere nidificate EP 11/12 - PB Lezione 3 9 Istruzioni condizionali (5) • Il codice che segue viene mandato in esecuzione per stabilire il contenuto della cella D3: Private Sub commento() If Range("D3") > 0 Then Range("F3").Value = "POSITIVO" Else If Range("D3") < 0 Then Range("F3") = "NEGATIVO" Else Range("F3") = "Nullo" End If End If End Sub EP 11/12 - PB Lezione 3 10 Istruzioni condizionali (6) Esempio complesso: determiniamo di che tipo sono le soluzioni (radici) di un’equazione di secondo grado a*(X^2) + b*X + c = 0 EP 11/12 - PB Lezione 3 11 Istruzioni condizionali (7) • Il codice che segue presume che nelle celle A5, B5 e C5 ci siano i coefficienti di una equazione di secondo grado. Nella cella D5, in base al valore di delta, scrive il numero di radici dell’equazione (si usa un bottone per attivare l’elaborazione) EP 11/12 - PB Lezione 3 12 Istruzioni condizionali (8) Private Sub Eq2Grado_Click() Delta = Range("B5") ^ 2 Delta = Delta - 4 * Range("A5") * Range("C5") If Delta > 0 Then Range("D5") = "2 radici reali" Else If Delta = 0 Then Range("D5") = "radici reali coincidenti" Else Range("D5") = "coniugate complesse" End If End If End Sub EP 11/12 - PB Lezione 3 13 Istruzioni condizionali CASE (1) Select Case espressione Case espressioneConfronto Istruzioni CaseElse Istruzioni End Select EP 11/12 - PB Lezione 3 14 Istruzioni condizionali CASE (2) • Le parti Case e CaseElse sono facoltative • Ci possono essere più rami Case ma di Case Else ve ne può essere uno solo • L’istruzione valuta una sola volta espressione e quindi valuta questo risultato con ogni espressioneConfronto fino a trovare la prima per la quale è vera – Al primo caso in cui Case è vero termina l’istruzione • Si comporta in modo differente dal C – Il ramo Case Else si utilizza per dare un risultato quando nessuna delle condizioni si è verificata – Può sostituire solo parzialmente If in quanto espressione è valutata solo una volta EP 11/12 - PB Lezione 3 15 Istruzioni condizionali CASE (3) – espressioneConfronto può essere • Un solo valore • Più valori separati da virgola • Un intervallo di valori (inizio To fine) • Operatori di confronto: – IS operatoreConfronto valore » Operatori confronto: >, <, >=, <=, =, <> EP 11/12 - PB Lezione 3 16 Istruzioni condizionali Equivalenza espressiva (1) Select Case par Case Is < 0 usoSelect = "negativo" Case 0 usoSelect = "ZERO“ Case 1, 2, 3, 4, 5, 6, 7, 8, 9 usoSelect = " una cifra" Case 10 To 99 usoSelect = "due cifre" Case Else usoSelect = "Più di due cifre" End Select EP 11/12 - PB If Not IsNumeric(par) Then Messaggi = "non è un numero" ElseIf par < 0 Then Messaggi = "Negativo" ElseIf par <= 9 Then Messaggi = "Una Cifra" ElseIf par < 100 Then Messaggi = "Due cifre" Else Messaggi = "piu' di 2 cifre" End If Lezione 3 17 Istruzioni condizionali Equivalenza espressiva (2) • L’esempio con Select non rispecchia l’esempio analogo fatto con l’istruzione If • Il primo ramo If If Not IsNumeric(par) Then Messaggi = "non è un numero“ – Non può essere reso con Select Case perché usa una espressione condizionale diversa da quella usata negli altri rami • Occorre usare un If con un Select Case in un ramo EP 11/12 - PB Lezione 3 18 Istruzioni condizionali Equivalenza espressiva (3) If Not IsNumeric(par) Then usoSelectEqv = "non è un numero" Else Select Case par Case Is < 0 usoSelectEqv = "negativo" Case 0 usoSelectEqv = "ZERO" Case 1, 2, 3, 4, 5, 6, 7, 8, 9 usoSelectEqv = "cifra" Case 10 To 99 usoSelectEqv = "due cifre" Case Else usoSelectEqv = "Più di due cifre" End Select End If EP 11/12 - PB Lezione 3 19 Esempio • Data una equazione di secondo grado stabile usando la regola dei segni di Cartesio il segno delle radici reali distinte – il cambiamento di segno fra due coefficienti consecutivi produce una radice positiva, la permanenza una radice negativa a*(X^2) + b*X + c = 0 EP 11/12 - PB Lezione 3 20 Esempio • • • • • • +++ - - +- + - +-++ ++- EP 11/12 - PB 2 permanenze -> 2 negative 2 permanenze -> 2 negative 2 variazioni -> 2 positive 2 variazioni -> 2 positive 1 var, 1 perm -> 1 pos, 1 neg 1 perm, 1 var -> 1 neg, 1 pos Lezione 3 21 Option Explicit Private Sub Radici_Click() Dim a As Double, b As Double Dim c As Double, delta As Double Dim permanenza As Integer a = Range("A5") b = Range("B5") c = Range("C5") delta = b ^ 2 - 4 * a * c If delta < 0 Then Range("D5") = "coniugate complesse" ElseIf delta = 0 Then Range("D5") = "coincidenti" Else Range("D5") = "2 distinte" 'segno delle radici permanenza = 0 If a * b > 0 Then permanenza = permanenza + 1 End If If b * c > 0 Then permanenza = permanenza + 1 End If If permanenza = 2 Then Range("F5") = "2 radici negative" ElseIf permanenza = 0 Then Range("F5") = "2 radici positive" Else Range("F5") = "1 radice positiva ed 1 negativa" End If End If End Sub EP 11/12 - PB Lezione 3 22