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
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
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
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
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
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
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
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"
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).
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)
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
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
' 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
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
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
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
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
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
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
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
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
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
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/