• Non ci sono risultati.

Brescianet.com Sito di supporto alla didattica

N/A
N/A
Protected

Academic year: 2022

Condividi "Brescianet.com Sito di supporto alla didattica"

Copied!
23
0
0

Testo completo

(1)

Pagina 1 di 1

Brescianet.com

Sito di supporto alla didattica

http://lnx.brescianet.com/ScuolaForum2013/

4F - 3° Modulo

http://lnx.brescianet.com/ScuolaForum2013/viewtopic.php?f=4&t=25

4F - 3° Modulo

da e01692

Appunti estemporanei sul 3° modulo

Re: 4F - 3° Modulo

da e01692

VBA => visual basic for application => linguaggio di prg per sviluppare applicazioni in ambito WIN e Office della microsoft

Il VBA usa gli eventi per lanciare degli script. Se tali eventi non avvengono il prg resta fermo.

Struttura di un pRG 1° parte

FASE DI INPUT // Dati variabili del problema 2° parte

ALGORITMO // Sequenza di comandi che risolvono un determinato problema 3° Parte

FASE DI OUTPUT // Visualizzazione dei risultati

Nella definizione delle maschere se sono nella modalità struttura posso modificarne l'aspetto Nella modalità "Visualizza" utilizzo la maschera

Il pannello delle proprietà mostra gli attributi dell'oggetto selezionato.

EVENTI => accadimenti che determinano l'esecuzione di uno script (programma) in un determinato linguaggio di prg

esempio di gestione degli eventi Private Sub btnSaluta_Click() .... programma in VBA

End Sub

Analizziamo la struttura:

sub => subroutine => sottoprogramma

BtnSaluta_click => nome della subroutine (nome oggetto + nome evento)

PRoprietà oggetto bottone

caption => proprietà che identifica la frase che appare sul bottone name => nome dell'oggetto (esempio btnSaluta)

esempio di sub che gestisce un click su un bottone:

Inviato: 28/02/2014, 11:26

Inviato: 01/03/2014, 8:02

(2)

Private Sub btnSaluta_Click() MsgBox "AVE students!"

End Sub

4F - 3° Modulo - 8/03/2014

da e01692

Private Sub BtnSaluta_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Me.BtnSaluta.Caption = "coordinate: " & X & ", " & Y End Sub

PROGRAMMA=> traduzione di un algoritmo in un qualsiasi linguaggio di programmazione. Il prg potrà essere eseguito su un pc

ALGORITMO => sequenza di comandi (umani!) per risolvere un problema con la parola formato identifico l'aspetto di un oggetto

I valori che appaiono dentro le parentesi dopo il nome sono i parametri (variabili) della sub.

sub Somma(X as integer, y as integer) Z=X+Y;

end sub

le variabili memoria di un prg

-- 1/3/2014 4Q => riprendere dalla concatenazione FORMATO => aspetti visivi di un oggetto

alcuni eventi sono dotati di proprietà (esempio mousemove). Le proprietà vengono scritte come parametri della funzione tra ()

Esempio

Sub NomeOggetto_NomeEvento(Parametridellevento) .... codice vba

End Sub

btnSaluta.caption="Ciao" => modifico l'etichetta del bottone "BtnSaluta"

"Ciao" & "Marco" => concateno 2 stringhe ==> "CiaoMarco"

Me.BtnSaluta.Caption = "X=" & X => concateno il valore del parametro X con la stringa "X="

btnSaluta.ForeColor=vbred => cambio il colore al bottone.

I colori in VBA sono composti dal nome del colore in inglese preceduto dalla sigla vb

Il VBA non è case sensitive!

esempio

Inviato: 08/03/2014, 8:02

(3)

Private Sub BtnSaluta_Click() MsgBox "AVE STUDENTS"

Me.BtnSaluta.ForeColor = vbYellow End Sub

Private Sub BtnSaluta_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Me.BtnSaluta.Caption = "X=" & X & ",Y=" & Y End Sub

-- 6/3/2014 4T

"X" => è una stringa (sequenza costante di simboli ascii)

X => è il nome di una variabile (memoria del programma). Non deve essere = al nome di un'istruzione del VBA

form_load => sub legata all'apertura della maschera. Contiene le istruzioni che inizializzano la maschera

form_unload => sub legata alla chiusura della maschera. Contiene le istruzioni che salvano dati volatili (in memoria, non sul disco fisso) della maschera

me indica il form corrente (in xls era il foglio corrente!)

me. => elenca gli oggetti e le proprietà del form corrente (tra cui il mio bottone

me.btnsaluta. => elenca tutte le proprietà del bottone me.btnsaluta.caption => etichetta del bottone

Me.BtnSaluta.Enabled = False => rende inusabile l'oggetto Me.BtnSaluta.Enabled = true=> rende usabile l'oggetto

Me.BtnSaluta.Enabled = Not Me.BtnSaluta.Enabled =>cambio lo stato CASELLE DI TESTO:

proprietà NAME =>nome oggetto (era presente anche nei bottoni)

value => proprietà predefinita per le caselle di testo => contiene il valore digitato. Può essere omessa poichè è la proprietà di default (predefinita) Me.BtnSaluta.Caption = Me.TxtNome.Value

equivale a:

Me.BtnSaluta.Caption = Me.TxtNome

' => carattere di commento => il vba ignora le scritte dopo tale sigla.

Utilizzato per descrivere le funzioni di una procedura o di una sequenza di istruzioni

docmd => oggetto equivalente ai menu di access

(4)

docmd.close => metodo (azione) che chiude la maschera corrente

docmd.maximize => metodo che apre a pieno schermo la maschera corrente docmd.quit => chiudo access in toto

docmd.minimize => metodo che iconizza la maschera corrente

docmd.restore => metodo che apre nella dimensione intermedia la maschera corrente

IF (condizioneA) THEN Codice VBA1

[Elseif (condizioneB) THEN]

[Codice VBA2]

[Elseif (condizioneC) THEN]

[Codice VBA3]

. . . [Else]

[Codice VBAN]

End if

--- 7/3/2014 4Q riprendere if

not => operatore di negazione (altro operatore oltre all'AND e all'OR quando ottengo l'elenco di un oggetto mediante il . vedo 2 tipi di icone

mattoncino verde => azione o metodo che quell'oggetto può svolgere. Esempio ordina

manina su una scheda => proprietà (caratteristica ) di quell'oggetto: esempio colore di sfondo

if (ElencoStudentiNonOrdinato) then OrdinoElenco

end if

FaccioLAppello

4F - 3° Modulo - 10/3/2014

da e01692

Domanda 1: valutare se un valore letto in una casella di testo è un numero e se si dire se è negativo, positivo, nullo - devo gestire anche il caso di

errore se scrivo una lettera

immagino che x contenga il valore

questa sequenza non ha alcun controllo dell'errore ma risolve la richiesta alla mia domanda

If X = 0 Then MsgBox "Zero"

ElseIf X > 0 Then MsgBox "Positivo"

Else

MsgBox "Negativo"

End If

Inviato: 10/03/2014, 8:08

(5)

oppure If X > 0 Then MsgBox "Positivo"

ElseIf X < 0 Then MsgBox "Negativo"

Else

MsgBox "Zero"

End If

oppure If X > 0 Then MsgBox "Positivo"

ElseIf X < 0 Then MsgBox "Negativo"

ElseIF X=0 THEN MsgBox "Zero"

End If

x="" => Assegno la stringa vuota ad x. La stringa vuota è una costante priva di caratteri ASCII

Operatori logici => usati per costruire condizioni complesse

condizioneA or CondizioneB => vera se una delle 2 le condizioni è vere condizioneA AND CondizioneB => vera se tutte e 2 le condizioni sono vere Not Condizione => negazione => se condizione è vera allora not condizione è falsa

una variabile è null se non ha mai ricevuto un valore per cui non conosco neppure il tipo di dato che potrebbe contenere

L'ULTIMO ElseIF X=0 THEN non serve se la x contiene sicuramente un numero Inseriamo il controllo dell'errore

ricordiamoci che la condizione IsNumeric(Me.TxtDato)

equivale a

IsNumeric(Me.TxtDato)=true soluzione:

If IsNull(Me.TxtDato) Or Me.TxtDato = "" Then MsgBox "Non hai scritto nulla!"

Else

If IsNumeric(Me.TxtDato) Then ' Eseguo l'algoritmo

x = Me.TxtDato If x = 0 Then MsgBox "Zero"

ElseIf x > 0 Then MsgBox "Positivo"

Else

MsgBox "Negativo"

End If Else

MsgBox "Non hai scritto numero"

End If

(6)

End If

Domanda 2: valutare se un numero è pari o dispari + controllo errore devo combinare

If IsNull(Me.TxtDato) Or Me.TxtDato = "" Then MsgBox "Non hai scritto nulla!"

Else

If IsNumeric(Me.TxtDato) Then ' Eseguo l'algoritmo

....

Else

MsgBox "Non hai scritto numero"

End If End If

algoritmo

if x mod 2 =0 then msgbox "Pari"

else

msgbox "Dispari"

end if

dove mod è l'operatore resto

A mod b => restituisce il resto della divisione tra A e B esempio

7 mod 5 => 2

mod è utilizzato nelle operazioni periodiche Dichiarazione variabili =>

dim x as byte => valore intero da 0 a 255

dim x as integer => valore intero da -2^15 a +2^15 (2 byte) dim x as long => valore intero da -2^31 a +2^31 (4 byte) dim x as single => precisione singola (4 byte)

dim x as double => precisione doppia (8 byte) dim x as date => variabile di tipo data/ora

dim x as string => stringa => sequenza di caratteri dim x as boolean => valore vero/falso

dim x as variant => indefinito equivale a dim x senza alcun tipo dim x as object => oggetto generico (vedremo)

Uso il tipo variant quando non conosco esattamente il tipo di dato che riceverò. Se indico il tipo ad una variabile e poi associo un dato

incompatibile con il tipo vba va in errore esempio

dim x as integer

x="ciao" => l'esecuzione si interrompe 8/3/2014 4Q

Esempio valutare se la stringa è maiuscola, minuscola , numero o altro (questa soluzione è errata! correggerla per lunedì prossimo

(7)

Dim x As String

If IsNull(Me.TxtDato) Or (Me.TxtDato = "") Then MsgBox "Non hai scritto nulla!"

Else

If Len(Me.TxtDato) = 1 Then

If Me.TxtDato <= "Z" And Me.TxtDato >= "A" Then MsgBox "Maiuscola"

ElseIf Me.TxtDato <= "z" And Me.TxtDato >= "a" Then MsgBox "Minuscola"

ElseIf Me.TxtDato <= "9" And Me.TxtDato >= "0" Then MsgBox "Numero"

Else

MsgBox "altro"

End If Else

MsgBox "Hai scritto + di 1 carattere!"

End If

End If

4F - 3° Modulo - 17/3/2014

da e01692

equivalente

If NOT (IsNull(Me.TxtDato) Or (Me.TxtDato = "")) Then If Len(Me.TxtDato) <> 1 Then

MsgBox "Hai scritto + di 1 carattere!"

Else

If Me.TxtDato <= "Z" And Me.TxtDato >= "A" Then MsgBox "Maiuscola"

ElseIf Me.TxtDato <= "9" And Me.TxtDato >= "0" Then MsgBox "Numero"

ElseIf Me.TxtDato <= "z" And Me.TxtDato >= "a" Then MsgBox "Minuscola"

Else

MsgBox "altro"

End If End If Else

MsgBox "Non hai scritto nulla!"

End If

risolvete vobis

asc(c) <=asc("Z") && asc(c) >=asc("A") => maiuscolo istruzione di input

nomevariabile=inputbox("Frase richiesta","titolo finestra","Valore predef") inputbox restituisce una stringa

Le variabili fuori le sub sono globali (esistono per tutta la durata dell'apertura del form). Questo consente alle singole SUB di passarsi valori acquisiti durante la loro esecuzione (vedi esempio nominativo).

Le variabili dichiarate dentro una sub sono locali ed esistono solo per la durata di esecuzione della sub - Tutti i valori acquisiti in tali variabili locali andranno perduti al termine dell'esecuzione della sub

Inviato: 17/03/2014, 8:06

(8)

esempio (regole di visibilita'):

dim x as long ' variabile globale sub LeggiNumero()

Dim y as long ' variabile locale y=inputbox("Dammi numero") x=y

end sub

sub ScriviNumero()

msgbox "X=" & X ' appare il valore letto

msgbox "Y=" & Y ' appare 0 poichè Y non essendo globale viene considerata come locale alla sub end sub

Le variabili non dichiarate ma usate vengono create al momento quindi la sub e quindi sono locali sub ScriviNumero()

msgbox "X=" & X ' appare il valore letto msgbox "X=" & Y 'non mostra alcun valore end sub

e' equivalente a sub ScriviNumero()

Dim y as variant ' senza tipo

msgbox "X=" & X ' appare il valore letto msgbox "X=" & Y 'non mostra alcun valore end sub

Dim y as variant equivale a Dim y

Dim x as long sub Pippo() dim x as long ...

end sub

in questo caso la variabile locale x in Pippo ricopre (shadowing) la variabile globale x e quindi Pippo() non è in grado di modificare quella globale

TEXTBOX o caselle di testo

me.txtOra.backcolor=vbblack => sfondo nero me.txtora=now()

me.txtora.value=now()

Eventi TIMER dell'oggetto form (maschera) => l'evento timer avviene ciclicamente ogni tot millisecondi. Tale valore è scritto nella proprietà me.TimerInterval del form.

se me.TimerInterval e' = a 0 allora l'evento timer non succede mai

Accodamento testo Me.txtTesto="AVE"

(9)

Me.txtTesto=Me.txttesto & "Studenti"

Me.txtTesto=Me.txttesto & "Chi "

Me.txtTesto=Me.txttesto & "Siete ?"

alla fine in Me.txtTesto ho "AVE StudentiChi Siete ?"

x=x+1 => incrementa di 1 la variabile x 14/3/2014 4Q

esempio 3 dire se un numero x è multiplo di 3 oppure di 7 if (x mod 3=0) or (x mod 7 = 0) then

... multiplo di 3 o 7 else

... non multiplo di 3 o 7 end if

esempio 4 dire se un numero x è multiplo di 3 ed anche di 7 if (x mod 3=0) and (x mod 7 = 0) then

... multiplo di 3 e 7 else

... non multiplo di 3 e 7 end if

Me.TimerInterval = IIf(Me.TimerInterval = 0, 1000, 0) equivale a

if (Me.TimerInterval = 0) then Me.TimerInterval = 1000 ' attivo l'ev else

Me.TimerInterval = 0 ' stoppo evento timer end if

quindi iif risulta + compatto rispetto all'if else (usata quando le sequenze di codice alternative sono + complesse oppure non ho un assegnamento)

Questo algoritmo non è valido se ho tanti numeri di cui voglio conoscere il minimo minimo tra A, B e C

if (A<B AND A<C) then ... A minimo

elseif (B<A AND B<C) then ... B minimo

else

... C minimo end if

svolgere eser IF entro il 29/3 4T 15/3/2014 4T

vbcrlf => simbolo relativo all'invio

soluzione IF1 (errata poichè nelle caselle di testo ho stringhe per cui il minimo tra:

"77" "221" "9" => il minimo è "221" (secondo l'ordinamento alfanumerico (Tab ASCII).

(10)

If (Me.Txt_A < Me.Txt_B And Me.Txt_A < Me.Txt_C) Then Me.Testo1 = "Il minimo e': " & Me.Txt_A

ElseIf (Me.Txt_B < Me.Txt_A And Me.Txt_B < Me.Txt_C) Then Me.Testo1 = "Il minimo e': " & Me.Txt_B

Else

Me.Testo1 = "Il minimo e': " & Me.Txt_C End If

occorre convertire Sub SoluzioneEsercizio1() Dim A As Long

Dim B As Long Dim C As Long A = CLng(Me.Txt_A) B = CLng(Me.Txt_B) C = CLng(Me.Txt_C) If (A < B And A < C) Then Me.Testo1 = "Il minimo e': " & A ElseIf (B < A And B < C) Then Me.Testo1 = "Il minimo e': " & B Else

Me.Testo1 = "Il minimo e': " & C End If

End Sub

nr gg tra 2 date clng(data1) - clng(data2)

finestra immediata => ctrl+g

rnd => genera un numero compreso tra [0,1) rnd *100 => [0,100)

rnd* A => [0,A) rnd* A + B => [B,A+B) rnd *(B-A) +A => [A,B)

randomize => istruzione che inizializza la funzione rnd generando ad ogni esecuzione sequenze diverse

n variabile globale

form_load oppure nella SoluzioneEsercizio11 n = 0

form_timer n=n+1

s=format(n,"00000") me.txt_A=left(s,1) me.txt_B=mid(s,2,1) me.txt_E=right(s,1)

(11)

per scrivere nella casella di output basta scrivere me.testo1="frase"

me.testo1=me.testo1 & "frase da accodare"

15/3/2014 4Q

sqr(x) => calcolo radici sqr(4) => 2

4F - 3° Modulo - 30/3/2014

da e01692

ME => CONTENITORE (MASCHERA)

ME.CONTROLS => INSIEME DEI CONTROLLI PRESENTI SUL FORM ME.CONTROLS.count => nr di controlli nella maschera contenitore 4T 22/3/2014

for i=1 to 5 msgbox i next equivale a:

for i=1 to 5 step 1 msgbox i

next

me.controls(i) => i-esimo controllo della maschera Me.Controls(0) => primo controllo della maschera Me.Controls(1) => secondo controllo della maschera Me.Controls(i).name => nome dell'i-esimo controllo

Me.Controls(i).forecolor => colore del testo dell'i-esimo controllo

Me.Controls(Me.Controls.count-1) => ultimo controllo della maschera

mostra il nome dell'i-esimo controllo con i che va da 0 a Me.Controls.count-1 ovvero mostra il nome di tutti i controlli

for i=0 to Me.Controls.count-1 msgbox me.controls(i).name next

Sintassi FOR

<costante>

[elemento opzionale]

for NomeVariabileContatore=<valore iniziale> to <valore finale> [step <incremento contatore>]

Codice VBA che viene ripetuto per ogni valore assunto dal contatore next

Inviato: 31/03/2014, 7:04

(12)

mostra i numeri da 1...10 for c=1 to 10

msgbox c next

mostra i numeri DISPARI <=10 for c=1 to 10 STEP 2

msgbox c next

MOSTRA IN ORDINE DECRESCENTE I NUMERI DA 10 A 1 For c = 10 To 1 Step -1

MsgBox c Next

for insiemistico

FOR EACH NomeVariabileChePrelevaDallInsieme IN NomeInsieme codiceVBA che lavora su NomeVariabileChePrelevaDallInsieme NEXT

for each X in me.controls msgbox x.name

Next

nascondere tutti i controlli che non siano bottoni dal for for each X in me.controls

if left(x.name,3)<>"btn" then ' non si tratta di un bottone x.visible=false

end if Next

equivalente a:

for i=0 to Me.Controls.count-1

if left(me.controls(i).name,3)<>"btn" then ' non si tratta di un bottone me.controls(i).visible=false

end if next

metti un colore rosso sull'etichetta di ogni bottone for each X in me.controls

if left(x.name,3)="btn" then ' non si tratta di un bottone x.forecolor=vbred

end if Next

nomecontrollo.visible => proprietà per nascondere/mostrare un controllo nomecontrollo.visible=false => nascondo il controllo

nomecontrollo.visible=true => mostro il controllo

nomecontrollo.ControlType => restituisce un numero che indica il tipo di controllo se non uso la regola del nome con un determinato prefisso l'esempio di prima diventa For i = 0 To Me.Controls.Count - 1

If Me.Controls(i).ControlType <> acCommandButton Then

(13)

' If Left(Me.Controls(i).Name, 3) <> "btn" Then ' non si tratta di un bottone Me.Controls(i).Visible = False

End If Next

oppure (non richiesta) for each X in me.controls

if x.ControlType <> acCommandButton then ' non si tratta di un bottone x.visible=false

end if Next ----

OGGETTI DI ACCESS

currentdb => file mdb / accdb che stiamo usando

currentdb.name => nome del file mdb / accdb che stiamo usando application => ms access

application.Name => nome dell'applicazione che utilizzo (access nel ns caso) ---- 22/3/2014 4Q

currentdb.TableDefs => insieme delle tabelle contenute nel file mdb/accdb currentdb.TableDefs(i) => i-esima tabella

currentdb.TableDefs("Studenti") => è l'oggetto che gestisce la tabella studenti

currentdb.TableDefs(i).name => nome i-esima tabella nel db corrente for each x in currentdb.tabledefs

msgbox x.name next

oppure

for I=0 to currentdb.tabledefs.count-1 msgbox currentdb.tabledefs(i).name next

gli oggetti di un insieme possono essere raggiunti o con l'indice currentdb.tabledefs(i)

questa modalità è adatta con il for progressivo oppure con il nome dell'oggetto

currentdb.tabledefs("Studenti")

l'assegnamento agli oggetti richiede l'istruzione set DOMANDA: elenco dei campi della tabella studenti (ricordarsi

set DB=currentDB) esempio

Dim T as TableDef partire da qui

set T = currentdb.tabledefs("Studenti") For Each f In t.Fields

MsgBox f.Name Next

oppure

(14)

Dim T as TableDef

set T = currentdb.tabledefs("Studenti") for I=0 to T.fields.count-1

msgbox T.fields(i).name next

Elenco delle query

querydefs => insieme delle query for I=0 to currentdb.querydefs.count-1 msgbox currentdb.querydefs(i).name next

4F - 3° Modulo - 5/4/2014

da e01692

Elenco delle maschere presenti nel file mdb/accdb corrente Dim Frm As Object

For Each Frm In Application.CurrentProject.AllForms msgbox Frm.Name

Next

forms che contengono la A

For Each Frm In Application.CurrentProject.AllForms if instr(frm.name,"A")>0 then

msgbox Frm.Name end if

Next

currentdb.execute (comandoSQL)

esegue il comando SQL (non deve essere di selezione : SELECT)

4Q - 28/3/2014 4T - 29/3/2014

Il for è l'istruzione iterata usata quando conosco a priori il nr di iterazioni (cicli)

Il while è l'istruzione iterata usata quando non conosco a priori il nr di iterazioni (cicli) da svolgeree L'istruzione "IstruzioneRipetuta" verrà iterata fintantochè la condizione è vera:

while condizione IstruzioneRipetura Wend

Continuo a chiedere un numero fino a che non digito 0 x=inputbox("Dammi un numero")

while x<>"0"

x=inputbox("Dammi un numero") wend

In quest'altra sintassi il controllo della condizione e' alla fine do

x=inputbox("Dammi un numero") loop while x<>"0"

LETTURA E SCRITTURA FILE DI TESTO Modalità for output => apertura a scrittura

Inviato: 05/04/2014, 6:58

(15)

Modalità for input => apertura a lettura

#numero => serve nei comandi successivi per identificare il file su cui intendo operare.

La funzione EOF(numero) restituisce vero se sono in fondo al file

La funzione LOF(numero) restituisce il nr di byte che compongono un file Apertura del file:

Open NomeFileDaAprire FOR modo AS #numero Scrittura in un file:

Print #numero, CosaVoglioScrivereDentro Lettura File

Input #numero, variabilechecaricailtestoletto Chiudo il file che intendo non scrivere

close #numero

DOmanda => scrivere il tuo nome nel file Pippo.txt Open "C:\sechi\pippo.txt" For Output As #1

Print #1, "Cognome"

Close #1

Open "C:\sechi\pippo.txt" For Input As #1 While Not EOF(1) ' end of file

Input #1, linea ' legge una frase fino al primo invio che incontra msgbox Linea

Wend Close #1

Alternativa (non richiesta!)

Open "C:\sechi\pippo.txt" For Binary As #1 Testo = Input(LOF(1), 1)

Close #1 29/3/2014 4Q

Formula alternativa del WHILE do

parteiterata

loop while condizione è equivalente a:

parteiterata while condizione parteiterata wend

03/4/2014 4T la sintassi do

parteiterata

loop while condizione

è migliore quando devo eseguire almeno una volta la parte iterata.

Questa è meglio quando è possibile che la parte iterata non venga mai svolta while condizione

parteiterata wend

(16)

esempio:

Continuo a chiedere un numero fino a che non digito 0 x=inputbox("Dammi un numero","titolo","0")

while x<>"0"

x=inputbox("Dammi un numero") wend

In quest'altra sintassi il controllo della condizione e' alla fine do

x=inputbox("Dammi un numero") loop while x<>"0"

mid(x,i,1) => i-esimo carattere della stringa clng("0")= 0

Quale è l'output di questa sequenza ? x=”1234567890”

y=””

For i=len(x) to 1 step -1

if clng(mid(x,i,1)) mod 2=0 then y=y+ mid(x,i,1)

End if Next

msgbox y => "08642"

domanda => nr di vocali all'interno di una stringa true or true and false

and ha precedenza per cui true or (true and false)

function NomeFunzione(parametri) VBA...

[Exit Function] ' esco dalla funzione in anticipo NomeFunzione=valorefunzione

end function

Function contaA(s As String) As Long nrA = 0

For i = 1 To Len(s)

If (Mid(s, i, 1) = "A") Then nrA = nrA + 1

End If Next

contaA = nrA End Function

function minimo(a,b,c) if (A<B AND A<C) then Minimo=A

elseif (B<A AND B<C) then Minimo=B

else Minimo=C end if

(17)

end function

function media(a,b,c) media=(A+B+C)/3 end function

4F - 3° Modulo - 7/4/2014

da e01692

Cosa fa?

for i to 100

if i <10 then exit for msgbox i

next

currentdb.execute (comandoSQL)

esegue il comando SQL (non deve essere di selezione : SELECT)

scorrimento del recordset recordset => insieme di record

rs.eof => proprietà del recordset che mi dice se sono in fondo all'elenco abbinato alla rs.bof => proprietà del recordset che mi dice se sono all'inizio dell'elenco. Se la query è vuota il recordset viene posto subito a eof=true

Metodi recordset movefirst

movelast moveprevious movenext close

rs("NomeCampo")=> mostra il contenuto del record corrente in quel campo ' Lettura in avanti

Dim rs As Recordset

' aggancia l'oggetto rs agganci quella query

Set rs = CurrentDb.OpenRecordset("SELECT Nominativo From Studenti") If Not rs.EOF Then ' se l'elenco non è vuoto...

rs.MoveFirst ' posiziono sul primo elemento While Not rs.EOF

MsgBox rs("Nominativo") rs.MoveNext

Wend Else

MsgBox "La query non ha restituito record! non ho studenti di 4Q"

End If rs.Close

Inviato: 07/04/2014, 6:48

(18)

Lettura invertita Dim rs As Recordset

' aggancia l'oggetto rs agganci quella query

Set rs = CurrentDb.OpenRecordset("SELECT Nominativo From Studenti") If Not rs.EOF Then ' se l'elenco non è vuoto...

rs.MoveLast ' posiziono sull'ultimo elemento While Not rs.BOF

MsgBox rs("Nominativo") rs.Moveprevious

Wend Else

MsgBox "La query non ha restituito record! non ho studenti di 4Q"

End If rs.Close

4Q --- 4/4/2014

variabile=inputbox(DomandaDaPorre,TitoloFinestra, ValorePredefinito) inputbox restituisce unastringa

4T --- 5/4/2014

rowsource => proprietà dei listbox contenente i valori in elenco:

me.lststudenti.RowSource="1;2;3;" => metto in elenco 1,2,3 uno per ogni riga

me.lststudenti.RowSource=me.lststudenti.RowSource & "4;" => aggiungo il 4 all'elenco vedere appunti di word sul listbox

ColumnWidths (non sapere) DefaultValue (non sapere)

oggetto etichetta => caption => frase che appare (come nel bottone) 4Q 5/4/2014

etichetta.caption="Ciao" => l'oggetto etichetta mostra "ciao"

FOR => utile quando conosco a priori il nr di iterazioni for i=1 to 100

msgbox i next

equivalente while i=1

while i<=100 msgbox i i=i+1 wend

il for è meno potente del while poichè non risolve lo stesso insieme di problemi risolti dal while.

il for viene usato comunque poichè è + compatto

for contatore=<valoreiniziale> to valorefinale step passo parteiterata

next

(19)

il while equivalente è (se passo è positivo) contatore=valoreiniziale

while contatore <= valorefinale parteiterata

contatore= contatore + passo wend

il while equivalente è (se passo è negativo) contatore=valoreiniziale

while contatore >= valorefinale parteiterata

contatore= contatore + passo wend

4F - 3° Modulo - 12/4/2014

da e01692

Esempio => elenco studenti maggiorenni Dim rs As Recordset

' aggancia l'oggetto rs agganci quella query

Set rs = CurrentDb.OpenRecordset("SELECT Nominativo,eta From Studenti") If Not ____ Then ' se l'elenco non è vuoto...

rs.MoveFirst ' posiziono sul primo elemento While Not rs.EOF

if (rs("eta")>=18 then MsgBox rs("Nominativo") end if

rs.MoveNext Wend Else

MsgBox "La query non ha restituito record! non ho studenti di 4Q"

End If rs.Close

iif(condizione,rispostaseveracondizione,rispostasefalsecondizione)

RisultatoFinale=iif(voto<6,"bocciato","PROMOSSO") --- 4O - 11/4/2014

instrrev(stringa1,stringa2) => restituisce la posizione dell'ultima occorrenza di stringa1 in stringa2 instrrev("Arrivederci","e") => 8

instr("Arrivederci","e") => 6

controllo.LOCKED => se true il controllo non può essere modificato txtscuola.locked=true => non posso cambiare il valore della scuola

' commento in VBA

sub IncrementaNumero(byval n as long) n=n+1

end sub

Inviato: 12/04/2014, 7:07

(20)

n=11

IncrementaNumero(n) msgbox n

Si considerino le 2 funzioni

Sub IncrementaNumero(ByVal n As Long) n = n + 1

End Sub

Sub IncrementaNumero2(ByRef n As Long) n = n + 1

End Sub

se un parametro viene passato con BYREF allora può essere modificato dalla funzione altrimenti no

Dim n As Long n = 11

IncrementaNumero (n)

MsgBox "Dopo IncrementaNumero: " & n IncrementaNumero2 (n)

MsgBox "Dopo IncrementaNumero2: " & n

--- n,m => minimo

imposto un divisore d = minimo e poi provo a dividere n e m per d. Il primo d che divide sia n che m è il MCD if (n<m) then

minimo =n else

minimo =m end if

for d=minimo to 1 step -1

if (n mod d = 0 ) && (m mod d = 0) then msgbox "MCD=" & d

exit for end of next

function CalcolaMCD(n,m) as long minimo=iif(n<m,n,m)

for d=minimo to 1 step -1

if (n mod d = 0 ) && (m mod d = 0) then CalcolaMCD= d

exit function end of next

end function

(21)

if n<m the massimo=m else

massimo=n end if

for p=massimo to n*m

if (p mod n)=0 and (p mod m)=0 then msgbox "mcm=" & p

exit for end if next

4Q --- 11/4/2014

if (A<B) And (A<C) And (A<D) And (A<E) then msgbox "Minimo " & A

elseif (B<A) And (B<C) And (B<D) And (B<E) then msgbox "Minimo " & B

elseif (C<A) And (C<B) And (C<D) And (C<E) then msgbox "Minimo " & C

elseif (D<A) And (D<B) And (D<C) And (D<E) then msgbox "Minimo " & D

else

msgbox "Minimo " & E end if

minimo=A

if (minimo > B) then minimo=B if (minimo > C) then minimo=C if (minimo > D) then minimo=D if (minimo > E) then minimo=E msgbox minimo

false and true or false => false

false or true and false => false or (true and false) => false

false or true and not false => false or (true and (not false)) => true ---

left("Arrivederci",4) => "Arri"

right("Arrivederci",len("AVE")) => "rci" => len("AVE")=3

esempi equivalenze FOR-WHILE for i=1 to 100

msgbox i next

i=1

while i <=100 msgbox i i=i+1 wend

for i=1 to 100 step 3 msgbox i

next

(22)

i=1

while i <=100 msgbox i i=i+3 wend

for i=100 to 1 step -1 msgbox i

next

i=100 while i >=1 msgbox i i=i-1 wend

A and B => vero se A e B sono veri tutti e 2 A or B => vero se A oppure B veri

TAVOLA VERITA' OR --- true or true => true true or false => true false or true => true false or false => false TAVOLA VERITA' AND --- true and true => true true and false => true false and true => false false and false => false

4F - 3° Modulo - 9/5/2014

da e01692

Correzione verifica 3 modulo for i=10 to 1 step -2

parteIterata next

i=10 while i>=1 parteIterata i=i-2

wend

mid("ciao",2,1)

x*y<0

Inviato: 10/05/2014, 7:44

(23)

Tutti gli orari sono UTC Pagina 1 di 1

(x>0 and y <0) OR (x<0 and y>0)

for i=0 to currentdb.tabledefs.count -1 msgbox currentdb.tabledefs(i).name next

mid(x,1,1)

dim x as byte '

set rs=currentdb.openrecordet("Alunni") if not rs.eof then

rs.movefirst while not rs.eof

msgbox rs("Nominativo") rs.movenext

wend rs.close end if

Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/

Riferimenti

Documenti correlati

Scelti su una retta un primo punto O (origine) ed un diverso secondo punto U (unita’), l’identificazione del numero 0 con O e del numero 1 con U si estende in modo naturale ad

Fissati su una retta un primo ed un diverso secondo punto, consid- eriamo l’identificazione sopra descritta dei numeri reali con punti sulla retta nella quale il numero 0 e il numero

Infatti in tal caso i due gradienti sono non nulli e sono LI perché la prima componente del primo gradiente vale sempre 1 e la prima componente del secondo gradiente vale sempre 0

• Si scriva una funzione che provi a eseguire N giri e salvi i risultati delle frequenze di ogni numero in un array di 37 elementi (il primo elemento per lo 0, il secondo per l'1