Sei sulla pagina 1di 17

ESEMPI CODICE VBA/ACCESS Pagina 1 di 17

INDICE
1 - TIPS & TRICKS
1.a) VBA: codice per andare all'ultimo record all'apertura di una maschera
1.b) VBA: codice per compattare e ripristinare il DB (NON FUNZIONA) 11 - Aprire il FORM Windows per sfogliare le cartelle e solezionare
1.c) VBA: aggiorna utilizzando il codice che va a utilizzare il pulsante AGGIORNA sulla ribbon 12 - Leggere dati da un foglio EXCEL collegato come tabella
2) VBA: inserire un VAI A CAPO (INVIO) 13 - Abilita Maiuscolo
3) Azzerare un campo contatore 14 - Scrivendo un carattere nella cella VERDE nella ROSSA esce il
4) Trasformare il mouse in clessidra 15 - Contatori su FORM / Progressivo elaborazione
5) N° campi presenti in una tabella dalla finestra immediata di Access 16 - Funzioni CtrlSeNULL, CtrlSeZERO, CtrlSeVUOTO, CtrlSeVU
6) MsgBox con sceltra SI/NO/ANNULLA 17 - Funzioni MASSIMO e MINIMO su un array
7) Sintassi nella costruzione di un nome etichetta con variabile 18 - Leggi dati da foglio EXCEL (.xlsx)
8) Query per ottenere una colonna con un numero progressivo (DA VERIFICARE) 19 - Q_ZeroAlSecondoDecimale
9) ACCESS 2013: visualizzare gli oggetti nascosti 20 - Inserire numero progressivo in query di ordinamento
10) Inserire un campo contatore progressivo in un report o query 21 - Funzione che ritorna più parametri
11) Sintassi WHERE con campo DATA 22 - Il comando LIKE nel codice VBA
12) Creare un sottoreport che si "formatta" in orizzontale 23 - Assegnare via codice il recordsource
13) Proprietà colori campi etichette e textbox 24 - Aprire un recordset su un'altro DB
14) Proprietà formattazione campi etichette e textbox 24 - Aprire un recordset su un'altro DB
15) Personalizzare le impostazioni predefinite per i database 25 - Form ricerca dati
2 - Esempio base ADO 26 - Collegare una tabella da codice (DAO)
3 - Invio e@mail di gruppo 27 - Eliminare una tabella da codice (DAO)
4 - Riorganizzare il campo priorità di una sottotabella
5 - Invio e@mail singola
6 - Oggi si festeggia (ricorrenze all'aperture di Access)
7 - Copia dati in nuova tabella
8 - Quante volte ricorre un carattere in una stringa
9 - Dimensiona le colonne di una SSTAB
10 - CountDown per la nascita di un bimbo/a

1 - TIPS & TRICKS


1.a) VBA: codice per andare all'ultimo record all'apertura di una maschera: DoCmd.RunCommand acCmdRecordsGoToLast

1.b) VBA: codice per compattare e ripristinare il DB (NON FUNZIONA): DoCmd.RunCommand acCmdCompactDatabase
questo però sembra funzionare anche in ACCESS 2016:

' Menu Strumenti


SendKeys "(%(S))", False
' Pulsante utilità database
SendKeys "u", False
' Pulsante compatta e ripristina DB
SendKeys "o", False

1.c) VBA: è come premere il pulsante AGGIORNA RECORD


DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70

2) VBA: inserire un VAI A CAPO (INVIO): Rst1!CAMPO1 & vbCrLf & Rst1!CAMPO2

3) ACCESS 2013: per azzerare un campo contatore si può svuotare la tabella e fare un COMPATTA E RIPRISTINA, oppure cancelare il campo contatore e ricrearlo

4) Trasformare il mouse in clessidra:


Screen.MousePointer = 11 ' MOUSE CLESSIDRA
Screen.MousePointer = 0 ' MOUSE NORMALE

5) Dalla finestra immediata di Access digitando:

?Currentdb.TableDefs("NOME_TABELLLA").Fields.Count

mi da il totale dei campi contenuti


PS: il programma deve essere in ESECUZIONE!

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 2 di 17

6) MsgBox con sceltra SI/NO/ANNULLA:

Dim Messaggio, Stile, Titolo as String

Messaggio = "SICURO CHE VOUI VEDERE IL REPORT DEL CERTIFICATO 0?" & Chr(13)
Stile = vbYesNo + vbCritical + vbDefaultButton2
Titolo = "ATTENZIONE"

Risposta = MsgBox(Messaggio, Stile, Titolo)


If Risposta = vbYes Then
.....
else
exit sub
end if

7) Sintassi nella costruzione di un nome etichetta con variabile:


Me("PARTE_FISSA" & VARIABILE & "PARTE_FISSA").Caption

Sintassi nella costruzione di un nome TABELLA con variabile:

Rst1.Open "SELECT * FROM T_PARTE1_" & Rst2!T_PARTE2, CurrentProject.Connection, adOpenDynamic, adLockOptimistic

se Rst2!T_PARTE2 = "TEST" selezionerò i record dalla tabella: T_PARTE1_TEST

8) Query per ottenere una colonna con un numero progressivo. Nell'esempio partiamo dalla creazione di una tabella di test:

CREATE TABLE test (id int, nome text);

Inseriamo dei dati:

INSERT INTO Test (Id, Nome) VALUES (9,"Ciccio");


INSERT INTO Test (Id, Nome) VALUES (5,"Pippo");
INSERT INTO Test (Id, Nome) VALUES (3,"Lillo");

E finalmente ecco la query per ottenere le due colonne più una terza colonna con un numero progressivo

SELECT Id, Nome, (SELECT Count(*) + 1 FROM Test t2 WHERE t2.id < test.id) AS Progressivo FROM Test ORDER BY Id;

Nella slide sotto l'esempio ricostruito sull'ACCESS 2013 Fatture.accdb:

9) ACCESS 2013: visualizzare gli oggetti nascosti: tasto destro sull'area sinistra in un posto vuoto sotto MODULI. Si apre la form:

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 3 di 17

10) Inserire un campo contatore progressivo in un report o query (per tabella vedi punto)

11) Sintassi WHERE con campo DATA


"HAVING data >= #" & Forms!M_STAMPE!DAL & "# AND data <= #" & Forms!M_STAMPE!AL & "# AND ...

12) Creare un sottoreport che si "formatta" in orizzontale


Per creare una situazione del genere non bisogna impostare NESSUNA proprietà ma aprire il report/sottoreport e selezionare il menù:

si aprirà il form:

dove impostiamo quante volte il sottoreport si ripeterà orizzontalmente (vedi ad es. report CRI)

13) Proprietà colori campi etichette e textbox


BackColor = è il colore dello sfondo del controllo
ForeColor = è il colore del testo del controllo

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 4 di 17

Codici colori:
vbYellow = 65535
vbRed = 255
vbBlue = 16711680
vbGreen = 65280
vbWhite = 16777215
vbBlack = 0
vbCyan = 16776960
vbMagenta = 16711935

14) Proprietà formattazione campi etichette e textbox


il GRASSETTO è gestito dalla funzione: FontBold
PS: la proprietà FontWeight, può essere utilizzata per impostare lo spessore della linea per il testo di un controllo.
La proprietà FontBold consente di velocizzare l'applicazione del formato grassetto al testo, mentre la proprietà FontWeight semplifica la gestione dell'impostazione dello spesso

il SOTTOLINEATO è gestito dalla funzione: FontUnderline

l'ITALICO è gestito dalla funzione: FontItalic

15) Personalizzare le impostazioni predefinite per i database


Sono parte delle Opzioni di Access.
Di seguito il link dal supporto Office: link

2 - Esempio base ADO


Function ADO()

Dim Rst1 As New ADODB.Recordset

Rst1.CursorLocation = adUseClient

Rst1.Open "NOME_TABELLA", CurrentProject.Connection, adOpenDynamic, adLockOptimistic


Rst1.MoveFirst

Rst1.Find "[NOME_CAMPO] = '" & Me.NOME_CAMPO & "'"


Me.NOME_CAMPO = Rst1![NOME_CAMPO]

Set Rst1 = Nothing

End Function

3 - Invio di e@mail di gruppo


Public Function InvioMailGruppo()
Dim Rst1 As New ADODB.Recordset
Dim Rst2 As New ADODB.Recordset
Dim ListaIndEmail As String
Dim UltimoIndirizzo As Integer
Dim ContaIndirizzi As Integer

On Error GoTo Errori


Rst1.CursorLocation = adUseClient
Rst2.CursorLocation = adUseClient
Rst1.Open "SELECT * FROM [Q_Anag_x_invio_email] WHERE [INVIO_MAIL] = true", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
Rst2.Open "T_CAMPI_MAIL", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

UltimoIndirizzo = Rst1.RecordCount
ContaIndirizzi = 1
ListaIndEmail = ""
Rst1.MoveFirst

While Not Rst1.EOF


If ContaIndirizzi = UltimoIndirizzo Then
ListaIndEmail = ListaIndEmail & Rst1!Numero
Else
ListaIndEmail = ListaIndEmail & Rst1!Numero & ";"
End If
ContaIndirizzi = ContaIndirizzi + 1
Rst1.MoveNext
Wend

DoCmd.SendObject , "", "", ListaIndEmail, , , Rst2!OGGETTO2, Rst2!Testo2, False, ""

Set Rst1 = Nothing


Set Rst2 = Nothing

Errori:

If Err.Number = 2293 Then


MsgBox ("Per inviare devi acconsentire")
Exit Function
End If

End Function

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 5 di 17

4 - Riorganizzare il campo priorità di una sottotabella


Public Function RiorganizzaPriorita()
Dim Rst1 As New ADODB.Recordset
Dim INCR_PRIORITA As Integer

Rst1.CursorLocation = adUseClient
Rst1.Open "SELECT * FROM ST1_TITOLO" & TitoloTab & " " & _
"WHERE ID_TP = " & Forms![01_M_PRINCIPALE].ID_TP & " ORDER BY PRIORITA", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

INCR_PRIORITA = 5
If Rst1.RecordCount > 0 Then Rst1.MoveFirst
While Not Rst1.EOF
Rst1!PRIORITA = INCR_PRIORITA
Rst1.Update
INCR_PRIORITA = INCR_PRIORITA + 5
Rst1.MoveNext
Wend

Forms![01_M_PRINCIPALE].Refresh
Set Rst1 = Nothing
End Function

5 - Invio e@mail singola


Public Function InviaMail(INDIRIZZO As String, Titolo As String, NOMINATIVO As String)
'DoCmd.SendObject , "", "", "morosini@insor.it", , , "Auguri di buon compleanno", "La Cooperativa Arcobaleno le porge i più sinceri auguri per il suo compleanno. ", False, ""
DoCmd.SendObject , "", "", INDIRIZZO, , , "Auguri!" & Titolo & " " & NOMINATIVO, "La Cooperativa Arcobaleno le porge i più sinceri auguri per il suo compleanno. ", False, ""
End Function

6 - Oggi si festeggia (ricorrenze all'aperture di Access)


Public Function OggiSiFesteggia2()
Dim Rst1 As New ADODB.Recordset
Dim GIORNO As String
Dim GIORNO1 As String
Dim GIORNO2 As String
Dim Mese As String
Dim Festeggiati As String

On Error GoTo Errori


Rst1.CursorLocation = adUseClient

GIORNO = Day(Date)
Mese = Month(Date)

' Se è Venerdì mostrami anche gli anniversari di Sabato e Domenica


If Weekday(Date) = 6 Then
If GIORNO = 27 And Mese = 2 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0227"" or MESE_GIORNO=""0228"" or MESE_GIORNO=""0301""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 29 And Mese = 4 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0429"" or MESE_GIORNO=""0430"" or MESE_GIORNO=""0501""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 29 And Mese = 6 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0629"" or MESE_GIORNO=""0630"" or MESE_GIORNO=""0701""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 29 And Mese = 9 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0929"" or MESE_GIORNO=""0930"" or MESE_GIORNO=""1001""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 29 And Mese = 11 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""1129"" or MESE_GIORNO=""1130"" or MESE_GIORNO=""1201""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic

ElseIf GIORNO = 30 And Mese = 1 Then


Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0130"" or MESE_GIORNO=""0131"" or MESE_GIORNO=""0201""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 30 And Mese = 3 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0330"" or MESE_GIORNO=""0331"" or MESE_GIORNO=""0401""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 30 And Mese = 5 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0530"" or MESE_GIORNO=""0531"" or MESE_GIORNO=""0601""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 30 And Mese = 7 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0730"" or MESE_GIORNO=""0731"" or MESE_GIORNO=""0801""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 30 And Mese = 8 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0830"" or MESE_GIORNO=""0831"" or MESE_GIORNO=""0901""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 30 And Mese = 10 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""1030"" or MESE_GIORNO=""1031"" or MESE_GIORNO=""1101""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 30 And Mese = 12 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""1230"" or MESE_GIORNO=""1231"" or MESE_GIORNO=""0101""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic

ElseIf GIORNO = 28 And Mese = 2 Then


Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0228"" or MESE_GIORNO=""0301"" or MESE_GIORNO=""0302""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 30 And Mese = 4 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0430"" or MESE_GIORNO=""0501"" or MESE_GIORNO=""0502""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 6 di 17

ElseIf GIORNO = 30 And Mese = 6 Then


Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0630"" or MESE_GIORNO=""0701"" or MESE_GIORNO=""0702""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 30 And Mese = 9 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0930"" or MESE_GIORNO=""1001"" or MESE_GIORNO=""1002""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 30 And Mese = 11 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""1130"" or MESE_GIORNO=""1101"" or MESE_GIORNO=""1202""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 31 And Mese = 1 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0131"" or MESE_GIORNO=""0201"" or MESE_GIORNO=""0202""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 31 And Mese = 3 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0331"" or MESE_GIORNO=""0401"" or MESE_GIORNO=""0402""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 31 And Mese = 5 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0531"" or MESE_GIORNO=""0601"" or MESE_GIORNO=""0602""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 31 And Mese = 7 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0731"" or MESE_GIORNO=""0801"" or MESE_GIORNO=""0802""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 31 And Mese = 8 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""0831"" or MESE_GIORNO=""0901"" or MESE_GIORNO=""0902""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 31 And Mese = 10 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""1031"" or MESE_GIORNO=""1101"" or MESE_GIORNO=""1102""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ElseIf GIORNO = 31 And Mese = 12 Then
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = ""1231"" or MESE_GIORNO=""0101"" or MESE_GIORNO=""0102""", _
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
Else
If Len(Trim(Mese)) = 1 Then
Mese = "0" & Mese
End If

If Len(Trim(GIORNO)) = 1 Then
GIORNO = "0" & GIORNO
GIORNO1 = "0" & GIORNO + 1
If Len(GIORNO1) > 2 Then
GIORNO1 = GIORNO + 1
End If
GIORNO2 = "0" & GIORNO + 2
If Len(GIORNO2) > 2 Then
GIORNO2 = GIORNO + 2
End If
ElseIf Len(Trim(GIORNO)) = 2 Then
GIORNO = GIORNO
GIORNO1 = GIORNO + 1
If Len(GIORNO1) > 2 Then
GIORNO1 = Right(GIORNO + 1, 2)
End If
GIORNO2 = GIORNO + 2
If Len(GIORNO2) > 2 Then
GIORNO2 = Right(GIORNO + 2, 2)
End If
End If
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr WHERE MESE_GIORNO = '" & Mese & GIORNO & "' or _
MESE_GIORNO = '" & Mese & GIORNO1 & "' or MESE_GIORNO = '" & Mese & GIORNO2 & "'", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
End If
Else
If Len(Trim(Mese)) = 1 Then
Mese = "0" & Mese
End If
If Len(Trim(GIORNO)) = 1 Then
GIORNO = "0" & GIORNO
End If
Rst1.Open "SELECT * FROM Q_Ann_Comp_Ricorr_2 WHERE MESE_GIORNO = '" & Mese & GIORNO & "'", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
End If

Festeggiati = ""
If Rst1.RecordCount > 0 Then
Rst1.MoveFirst
End If
While Not Rst1.EOF
' SE IL GIORNO DELLA SETTIMANA E' VENERDI' (WEEKDAY=6)
If Weekday(Date) = 6 Then
Festeggiati = Festeggiati & "Il " & Rst1![GIORNO] & " " & Rst1![Mese] & ": " & Rst1![COSA_FESTEGGIANO] & " di " & Rst1![NOMINATIVO] & Chr(13)
'Festeggiati = Festeggiati & AggiuntaGiorniOre
Rst1.MoveNext
Else
Festeggiati = Festeggiati & Rst1![COSA_FESTEGGIANO] & " di " & Rst1![NOMINATIVO] & Chr(13)
'Festeggiati = Festeggiati & AggiuntaGiorniOre
Rst1.MoveNext
End If
Wend

If Rst1.RecordCount <> 0 And Weekday(Date) = 6 Then


If GIORNO = 27 And Mese = 2 Then
MsgBox ("Oggi Venerdi 27 febbraio, domani Sabato 28 febbraio e Domenica 1 marzo si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 29 And Mese = 4 Then
MsgBox ("Oggi Venerdi 29 aprile, domani Sabato 30 aprile e Domenica 1 maggio si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 29 And Mese = 6 Then
MsgBox ("Oggi Venerdi 29 giugno, domani Sabato 30 giugno e Domenica 1 luglio si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 29 And Mese = 9 Then
MsgBox ("Oggi Venerdi 29 settembre, domani Sabato 30 settembre e Domenica 1 ottobre si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 29 And Mese = 11 Then
MsgBox ("Oggi Venerdi 29 novembre, domani Sabato 30 novembre e Domenica 1 dicembre si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)

ElseIf GIORNO = 30 And Mese = 1 Then


MsgBox ("Oggi Venerdi 30 gennaio, domani Sabato 31 gennaio e Domenica 1 febbraio si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 30 And Mese = 3 Then
MsgBox ("Oggi Venerdi 30 marzo, domani Sabato 31 marzo e Domenica 1 aprile si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 30 And Mese = 5 Then
MsgBox ("Oggi Venerdi 30 maggio, domani Sabato 31 maggio e Domenica 1 giugno si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 30 And Mese = 7 Then
MsgBox ("Oggi Venerdi 30 luglio, domani Sabato 31 luglio e Domenica 1 agosto si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 7 di 17

ElseIf GIORNO = 30 And Mese = 8 Then


MsgBox ("Oggi Venerdi 30 agosto, domani Sabato 31 agosto e Domenica 1 settembre si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 30 And Mese = 10 Then
MsgBox ("Oggi Venerdi 30 ottobre, domani Sabato 31 ottobre e Domenica 1 novembre si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 30 And Mese = 12 Then
MsgBox ("Oggi Venerdi 30 dicembre, domani Sabato 31 dicembre e Domenica 1 gennaio si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)

ElseIf GIORNO = 28 And Mese = 2 Then


MsgBox ("Oggi Venerdi 28 febbraio, domani Sabato 1 marzo e Domenica 2 marzo si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 30 And Mese = 4 Then
MsgBox ("Oggi Venerdi 30 aprile, domani Sabato 1 maggio e Domenica 2 maggio si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 30 And Mese = 6 Then
MsgBox ("Oggi Venerdi 30 giugno, domani Sabato 1 luglio e Domenica 2 luglio si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 30 And Mese = 9 Then
MsgBox ("Oggi Venerdi 30 settembre, domani Sabato 1 ottobre e Domenica 2 ottobre si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 30 And Mese = 11 Then
MsgBox ("Oggi Venerdi 30 novembre, domani Sabato 1 dicembre e Domenica 2 dicembre si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)

ElseIf GIORNO = 31 And Mese = 1 Then


MsgBox ("Oggi Venerdi 31 gennaio, domani Sabato 1 febbraio e Domenica 2 febbraio si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 31 And Mese = 3 Then
MsgBox ("Oggi Venerdi 31 marzo, domani Sabato 1 aprile e Domenica 2 aprile si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 31 And Mese = 5 Then
MsgBox ("Oggi Venerdi 31 maggio, domani Sabato 1 giugno e Domenica 2 giugno si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 31 And Mese = 7 Then
MsgBox ("Oggi Venerdi 31 luglio, domani Sabato 1 agosto e Domenica 2 agosto si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 31 And Mese = 8 Then
MsgBox ("Oggi Venerdi 31 agosto, domani Sabato 1 settembre e Domenica 2 settembre si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 31 And Mese = 10 Then
MsgBox ("Oggi Venerdi 31 ottobre, domani Sabato 1 novembre e Domenica 2 novembre si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
ElseIf GIORNO = 31 And Mese = 12 Then
MsgBox ("Oggi Venerdi 31 dicembre, domani Sabato 1 gennaio e Domenica 2 gennaio si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
Else
If Mese = 1 Then
Mese = "Gennaio"
ElseIf Mese = 2 Then Mese = "Febbraio"
ElseIf Mese = 3 Then Mese = "Marzo"
ElseIf Mese = 4 Then Mese = "Aprile"
ElseIf Mese = 5 Then Mese = "Maggio"
ElseIf Mese = 6 Then Mese = "Giugno"
ElseIf Mese = 7 Then Mese = "Luglio"
ElseIf Mese = 8 Then Mese = "Agosto"
ElseIf Mese = 9 Then Mese = "Settembre"
ElseIf Mese = 10 Then Mese = "Ottobre"
ElseIf Mese = 11 Then Mese = "Novembre"
ElseIf Mese = 12 Then Mese = "Dicembre"
End If
MsgBox ("Oggi Venerdi " & CInt(GIORNO) & ", domani Sabato " & CInt(GIORNO + 1) & " e Domenica " & CInt(GIORNO + 2) & " " & Mese & " si festeggia (o si ricorda):" & _
Chr(13) & Chr(13) & Festeggiati)
End If
ElseIf Rst1.RecordCount <> 0 And Weekday(Date) <> 6 Then
MsgBox ("Oggi " & Date & " si festeggia (o si ricorda):" & Chr(13) & Chr(13) & Festeggiati)
Else
MsgBox ("Oggi " & Date & " non si festeggia (o si ricorda) niente.")
End If
Set Rst1 = Nothing

Errori:
If Err.Number = 3021 Then
MsgBox ("Oggi " & Date & " non si festeggia (o si ricorda) niente.")
PrimoAccesso = False
End If

7 - Copia dati in nuova tabella


Public Function CopiaDatiInNewTab()
Dim Rst1 As New ADODB.Recordset
Dim Rst2 As New ADODB.Recordset
Dim Rst3 As New ADODB.Recordset
Dim IDTESTA As Double
Dim InizCorpo As String

On Error GoTo Errori

Rst1.CursorLocation = adUseClient
Rst2.CursorLocation = adUseClient
Rst3.CursorLocation = adUseClient

Rst1.Open "DATI", CurrentProject.Connection, adOpenDynamic, adLockOptimistic


Rst2.Open "DATI_TESTA", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
Rst3.Open "DATI_CORPO", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

'DoCmd.OpenQuery "Q_SVUOTA_TAB_DATI
' PARTE INSERIMENTO RECORD DI TESTA
Rst2.AddNew
Rst1.MoveFirst
While Not Rst1.EOF

If Mid(Rst1!CAMPO1, 1, 4) = "DATE" And IsNull(Rst1!CAMPO2) Then


Rst2!DATA = Mid(Rst1!CAMPO1, 5)
Rst1.MoveNext
ElseIf IsNull(Rst1!CAMPO1) And Not IsNull(Rst1!CAMPO2) And Mid(Rst1!CAMPO2, 1) <> "Lunghezza tot./LENGTH" Then

Dim CAMPO As String


CAMPO = Mid(Rst1!CAMPO2, 1, 4)
Select Case CAMPO
Case "TIME"
Rst2!ORA = Mid(Rst1!CAMPO2, 5)
Case "OPER"

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 8 di 17

Rst2!OPERATORE = Mid(Rst1!CAMPO2, 11)


Case "PROV"
Rst2!PROVA = Mid(Rst1!CAMPO2, 11)
Case "CLIE"
Rst2!CLIENTE = Mid(Rst1!CAMPO2, 9)
End Select

Rst1.MoveNext
ElseIf IsNull(Rst1!CAMPO1) And Mid(Rst1!CAMPO2, 1) = "Lunghezza tot./LENGTH" Then
Rst1.MoveLast
ElseIf Mid(Rst1!CAMPO1, 1, 3) = "END" Then
Rst1.MoveNext
End If

Wend
Rst2.Update
IDTESTA = Rst2!ID_TESTA

' PARTE INSERIMENTO RECORD DEL CORPO


Rst1.MoveFirst
InizCorpo = "Lunghezza tot./LENGTH"
Rst1.Find "[CAMPO2] = '" & InizCorpo & "'"
While Not Rst1.EOF And IsNull(Rst1!CAMPO1)

Rst3.AddNew
Rst3!ID_TESTA = IDTESTA
Rst3!COLONNA1 = Rst1!CAMPO2 'DESCRIZIONE
Rst3!COLONNA2 = Rst1!CAMPO3 'NOMINALE
Rst3!COLONNA3 = Rst1!Campo4 'RILEVATO
Rst3!COLONNA4 = Rst1!Campo5 'TOLLERANZA+
Rst3!COLONNA5 = Rst1!Campo6 'TOLLERANZA-
Rst3!COLONNA6 = Rst1!campo7 'DEVIAZIONE

Dim ValTolMax, ValTolMin, ValDEV, RangeTOT, RangePARZ As Single

ValTolMax = CSng(Rst1!Campo5)
ValTolMin = CSng(Rst1!Campo6)
ValDEV = CSng(Rst1!campo7)

RangeTOT = ValTolMax - ValTolMin


RangePARZ = RangeTOT / 8

Select Case ValDEV


Case ValTolMin To ValTolMin + RangePARZ
Rst3![F-TOLL] = "----"
Case ValTolMin + RangePARZ To ValTolMin + RangePARZ * 2
Rst3![F-TOLL] = "---"
Case ValTolMin + RangePARZ * 2 To ValTolMin + RangePARZ * 3
Rst3![F-TOLL] = "--"
Case ValTolMin + RangePARZ * 3 To ValTolMin + RangePARZ * 4
Rst3![F-TOLL] = "-"
Case ValTolMin + RangePARZ * 4 To ValTolMin + RangePARZ * 5
Rst3![F-TOLL] = "+"
Case ValTolMin + RangePARZ * 5 To ValTolMin + RangePARZ * 6
Rst3![F-TOLL] = "++"
Case ValTolMin + RangePARZ * 6 To ValTolMin + RangePARZ * 7
Rst3![F-TOLL] = "+++"
Case ValTolMin + RangePARZ * 7 To ValTolMax
Rst3![F-TOLL] = "++++"
Case Is > ValTolMax
Rst3![F-TOLL] = ValDEV - ValTolMax
Case Is < ValTolMin
Rst3![F-TOLL] = ValTolMin + ValDEV
End Select
Rst3.Update

Rst1.MoveNext

Wend

Set Rst1 = Nothing


Set Rst2 = Nothing
Set Rst3 = Nothing

Errori:
If Err.Number = -2147217900 Then
MsgBox ("ATTENZIONE! Manca il file DEFINITIVO.STA nella cartella " & PercFileSTA)
End If

End Function

8 - Quante volte ricorre un carattere in una stringa


Public Function QuanteVolte(car As String, str As String) As Long
If Len(car) <> 1 Then Err.Raise 5 ' car DEVE essere 1 carattere !
QuanteVolte = Len(str) - Len(Replace(str, car, "", , , vbTextCompare))
End Function

9 - Dimensiona le colonne di una SSTAB


Public Function RegolaColonne(Numero As Byte)

Dim DimDATA As Integer


Dim DimCheck As Integer

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 9 di 17

DimDATA = 1040
DimCheck = 580

Forms![01_M_PRINCIPALE]("SM1_TITOLO" & Numero)!NOME_CAMPO.ColumnWidth = DimDATA


Forms![01_M_PRINCIPALE]("SM1_TITOLO" & Numero)!NOME_CAMPO.ColumnWidth = DimCheck

End Function

10 - CountDown per la nascita di un bimbo/a


Public Function NuovoArrivoInFamiglia()
'NUOVO ARRIVO IN FAMIGLIA
Dim NUMSET As Integer
Dim DATANascita As String
Dim SETNascita As Integer
Dim GGNascita As Integer
Dim ORENascita As Integer
Dim MINNascita As Long
Dim SECNascita As Long
Dim AggiuntaGiorniOre As String

DATANascita = "#7/17/2005#"
NUMSET = DateDiff("ww", #10/13/2004#, Now)
SETNascita = DateDiff("ww", Now, #7/17/2005#)
GGNascita = DateDiff("d", Now, #7/17/2005#)
ORENascita = DateDiff("h", Now, #7/17/2005#)
MINNascita = DateDiff("n", Now, #7/17/2005#)
SECNascita = DateDiff("s", Now, #7/17/2005#)
AggiuntaGiorniOre = & Chr(13) & Chr(13) & "Mancano: " & GGNascita & " (" & ORENascita & " - " & MINNascita & " - " & SECNascita & ") Giorni (Ore - Minuti - Secondi) alla nascita"
AggiuntaGiorniOre = Chr(13) & Chr(13) & "Mancano: " & GGNascita & " giorni " & "(" & ORENascita & " ore - " & MINNascita & " minuti - " & SECNascita & " - secondi ) alla nascita"
AggiuntaGiorniOre = Chr(13) & Chr(13) & "Mancano: " & GGNascita & " giorni " & "(" & Format(ORENascita, "##,##0") & " ore - " & Format(MINNascita, "##,##0") & " minuti - " & _
Format(SECNascita, "##,##0") & " - secondi ) alla nascita"
AggiuntaGiorniOre = Chr(13) & Chr(13) & "Siamo a " & NUMSET & " settimane." & Chr(13) & Chr(13) & "Mancano: " & SETNascita & " Settimane alla nascita, che equivalgono a" & _
Chr(13) & GGNascita & " giorni" & Chr(13) & Format(ORENascita, "##,##0") & " ore" & Chr(13) & Format(MINNascita, "##,##0") & " minuti" & Chr(13) & Format(SECNascita, "##,##0") & " secondi"
End Function

11 - Sfoglia le cartelle di C:
'APRE SOLO FILE PDF ..... da verificare

Public Function SFOGLIA_CARTELLE()

Dim sh As Object, obj As Object, cNomefile As String, fso As Object

Set sh = CreateObject("Shell.Application")

On Error Resume Next


Set obj = sh.BrowseForFolder(Me.Hwnd, "Selezionare un file", 16385, 17)
If Err.Number <> 0 Then
Set obj = Nothing
End If
On Error GoTo 0

If obj Is Nothing Then


cNomefile = ""
Else
With obj
cNomefile = .ParentFolder.ParseName(.Title).Path
End With

Set fso = CreateObject("Scripting.FileSystemObject")


If Not fso.FileExists(cNomefile) Then
cNomefile = ""
End If
Set fso = Nothing
End If

Set sh = Nothing
If cNomefile <> "" Then
txtCasella.Value = cNomefile
End If

End Sub

12 - Leggere dati da un foglio EXCEL collegato come tabella


Public Function LeggiDatiFoglioEXCEL()
Dim Rst1 As New ADODB.Recordset

Dim xlApp As Excel.Application


Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 10 di 17

Dim A, B, C, D As Integer

Set xlApp = CreateObject("Excel.Application")


xlApp.Visible = False
'Set xlBook = xlApp.Workbooks.Open(CurrentProject.Path & "\FileDaBanca.xls")
Set xlBook = xlApp.Workbooks.Open("C:\Users\riccardo_morosini\Desktop\CANONI_BRENO\PROVA_CANONI.xlsx")

Rst1.CursorLocation = adUseClient
Rst1.Open "T_TMP_FOGLI", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
If Rst1.RecordCount > 0 Then Rst1.MoveFirst

Set xlSheet = xlBook.Worksheets(NomeFoglio)


A = 18
While A <= 60
' VERIFICO PARTENDO DALLA CELLA [G18]=QUANTITA' SE C'E' UN VALORE
If xlSheet.Cells(A, 7) <> "" Then
' SE C'E'
If xlSheet.Cells(A, 4) <> "" Then
Rst1.AddNew
Rst1!CLIENTE = xlSheet.Cells(3, 6) 'F3
Rst1!RIFERIMENTO = xlSheet.Cells(2, 6) 'F2
Rst1!CODICE_PANTHERA = xlSheet.Cells(2, 10) 'J2
Rst1!CODICE1 = xlSheet.Cells(A, 4) 'D&"A"
Rst1!CODICE2 = xlSheet.Cells(A, 5) 'E&"A"
Rst1!DESCRIZIONE = xlSheet.Cells(A, 6) 'F&"A"
Rst1!QUANTITA = xlSheet.Cells(A, 7) 'G&"A"
Rst1!CANONE = xlSheet.Cells(A, 95) 'CQ&"A"
Rst1!DATA_CONTRATTO = xlSheet.Cells(11, 7) 'G11
Rst1.Update
Else
' GENERO UN FILE TXT CONTENENTE IL CLIENTE E LA RIGA CON IL PROBLEMA
File_Anomalie = Trim(Rst1!CLIENTE) & ";" & Trim(Rst1!RIFERIMENTO) & ";CODICE1 NON PRESENTE"
Print #1, File_Anomalie
End If
End If
A=A+1
Wend

Chiudi:
xlBook.Close SaveChanges:=False
xlApp.Quit

Set xlSheet = Nothing


Set xlBook = Nothing
Set xlApp = Nothing

Set Rst1 = Nothing

End Function

13 - Abilita Maiuscolo
Option Compare Database
Option Explicit

' NON MODIFICARE IL NOME DELLA MACRO AUTOEXEC

'Questo modulo consente di applicare una sorta di Protezione e/o


'impostazione di AVVIO in modo Automatico
'Si può utilizzare lanciandola da un Menù sotto Password
'oppure inserendo un controllo nascosto in una Form.

'Consente di Modificare in un solo colpo tutte le proprietà


'del menù di AVVIO compreso ALLOW_BYPASS_KEY ed eventualmente
'la Macro AUTOEXEC.

'Startup properties
'Private Const strAppTitle As String = "ESEMPIO DISABILITAZIONE TASTO MAIUSCOLO"

Private Const strAppTitle As String = "INSOR"


Private Const strStartUpForm As String = "M_LOGIN"
'Private Const strStartUpMenuBar As String = "mnuPrincipale"
Private Const strStartUpMenuBar As String = ""
Private Const strStartUpShortcutMenuBar As String = vbNullString
Private Const strAppIcon As String = vbNullString
Private Const blnStartUpShowDBWindow As Boolean = False
Private Const blnStartUpShowStatusBar As Boolean = False
Private Const blnAllowShortcutMenus As Boolean = False
Private Const blnAllowFullMenus As Boolean = False
Private Const blnAllowBuiltInToolbars As Boolean = False
Private Const blnAllowToolbarChanges As Boolean = False
Private Const blnAllowBreakIntoCode As Boolean = False
Private Const blnAllowSpecialKeys As Boolean = False
Private Const blnAllowBypassKey As Boolean = False

Public Function Secure()

On Error Resume Next


Call ChangeProperty("AppTitle", dbText, strAppTitle)
Call ChangeProperty("StartUpForm", dbText, strStartUpForm)
Call ChangeProperty("StartUpMenuBar", dbText, strStartUpMenuBar)
Call ChangeProperty("StartupShortcutMenuBar", dbText, strStartUpShortcutMenuBar)
Call ChangeProperty("AppIcon", dbText, strAppIcon)
Call ChangeProperty("StartUpShowDBWindow", dbBoolean, blnStartUpShowDBWindow)
Call ChangeProperty("StartUpShowStatusBar", dbBoolean, blnStartUpShowStatusBar)
Call ChangeProperty("AllowShortcutMenus", dbBoolean, blnAllowShortcutMenus)
Call ChangeProperty("AllowFullMenus", dbBoolean, blnAllowFullMenus)
Call ChangeProperty("AllowBuiltInToolbars", dbBoolean, blnAllowBuiltInToolbars)
Call ChangeProperty("AllowToolbarChanges", dbBoolean, blnAllowToolbarChanges)
Call ChangeProperty("AllowBreakIntoCode", dbBoolean, blnAllowBreakIntoCode)
Call ChangeProperty("AllowSpecialKeys", dbBoolean, blnAllowSpecialKeys)

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 11 di 17

Call ChangeProperty("AllowBypassKey", dbBoolean, blnAllowBypassKey)


If CurrentDb.Containers("Scripts").Documents("$Autoexec").Name = "$Autoexec" Then _
EnableAutoExec

End Function

Public Function UnSecure()

On Error GoTo Errori


'Call ChangeProperty("AppTitle", dbText, "My Application is UnSecured")
Call ChangeProperty("AppTitle", dbText, strAppTitle)
'Call ChangeProperty("StartUpForm", dbText, vbNullString)
'Call ChangeProperty("StartUpMenuBar", dbText, vbNullString)
'Call ChangeProperty("StartupShortcutMenuBar", dbText, vbNullString)
Call ChangeProperty("AppIcon", dbText, vbNullString)
Call ChangeProperty("StartUpShowDBWindow", dbBoolean, True)
Call ChangeProperty("StartUpShowStatusBar", dbBoolean, True)
Call ChangeProperty("AllowShortcutMenus", dbBoolean, True)
Call ChangeProperty("AllowFullMenus", dbBoolean, True)
Call ChangeProperty("AllowBuiltInToolbars", dbBoolean, True)
Call ChangeProperty("AllowToolbarChanges", dbBoolean, True)
Call ChangeProperty("AllowBreakIntoCode", dbBoolean, True)
Call ChangeProperty("AllowSpecialKeys", dbBoolean, True)
Call ChangeProperty("AllowBypassKey", dbBoolean, True)
If CurrentDb.Containers("Scripts").Documents("Autoexec").Name = "Autoexec" Then _
DisableAutoExec

Errori:
If Err.Number = 3265 Then
Exit Function
End If

End Function

Public Function ChangeProperty(strPropName As String, varPropType As Variant, varPropValue As Variant) As Boolean

Dim prp As Property


On Error GoTo Change_Err
If Len(varPropValue) > 0 Then
CurrentDb.Properties(strPropName) = varPropValue
Else
CurrentDb.Properties.Delete strPropName
End If
ChangeProperty = True
Change_Bye:
Set prp = Nothing
Exit Function
Change_Err:
Select Case Err
Case 3265 'Item not found in this collection.
Resume Next
Case 3270 'prop not found
With CurrentDb
Set prp = .CreateProperty(strPropName, varPropType, varPropValue)
.Properties.Append prp
End With
Resume Next
Case Else
ChangeProperty = False
Resume Change_Bye
End Select
End Function

Public Function DisableAutoExec() As Boolean


Dim docCiclo As DAO.Document
Dim dbs As DAO.Database
Set dbs = CurrentDb
DisableAutoExec = False
For Each docCiclo In dbs.Containers!Scripts.Documents
'Scorre l'insieme Documents del database per verificare la presenza della Macro se esiste la Rinomina
If docCiclo.Name = "Autoexec" Then
DoCmd.Rename "_Autoexec", acMacro, "Autoexec"
DisableAutoExec = True
End If
Next docCiclo
Set dbs = Nothing
End Function

Private Function EnableAutoExec() As Boolean


Dim docCiclo As DAO.Document
Dim dbs As DAO.Database
Set dbs = CurrentDb
EnableAutoExec = False
For Each docCiclo In dbs.Containers!Scripts.Documents
'Scorre l'insieme Documents del database per verificare la presenza della Macro
' se esiste la Rinomina
If docCiclo.Name = "_Autoexec" Then
DoCmd.Rename "Autoexec", acMacro, "_Autoexec"
EnableAutoExec = True
End If
Next docCiclo
Set dbs = Nothing
End Function

Private Sub BLOCCA_Click()

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 12 di 17

Secure
DoCmd.Close
End Sub

Private Sub OK_Click()

If Me.Password = "1234" Then


Me.SBLOCCA.Enabled = True
Me.BLOCCA.Enabled = True
End If

End Sub

Private Sub SBLOCCA_Click()


UnSecure
DoCmd.Close
End Sub

14 - Scrivendo un carattere nella cella VERDE nella ROSSA esce il corrispettivo n ASCII

Option Compare Database


Dim NumTastiPremuti As Integer

Public Function Form_KeyDown(KeyCode As Integer, Shift As Integer)

Me.COdTastoDigitato = KeyCode
Me.ValTastoDigitato = Chr(KeyCode)

NumTastiPremuti = NumTastiPremuti + 1

End Sub

Public Function Form_KeyUp(KeyCode As Integer, Shift As Integer)

If NumTastiPremuti = 1 Then
InizializzaVar1 = KeyCode
ElseIf NumTastiPremuti = 2 Then
InizializzaVar2 = KeyCode
ElseIf NumTastiPremuti = 3 Then
InizializzaVar3 = KeyCode
End If

If InizializzaVar1 = "17" And InizializzaVar2 = "16" And InizializzaVar3 = "27" Then


MsgBox "Hai premuto CTRL+SHIFT"
NumTastiPremuti = 0
InizializzaVar1 = ""
InizializzaVar2 = ""
InizializzaVar3 = ""
ElseIf InizializzaVar1 = "17" And InizializzaVar2 = "16" And InizializzaVar3 = "77" Then
MsgBox "Hai premuto CTRL+SHIFT+M"
NumTastiPremuti = 0
InizializzaVar1 = ""
InizializzaVar2 = ""
InizializzaVar3 = ""
Else

End If

End Sub

Private Sub Form_Open(Cancel As Integer)

InizializzaVar1 = ""
InizializzaVar2 = ""
InizializzaVar3 = ""
Me.COdTastoDigitato = ""
Me.ValTastoDigitato = ""
NumTastiPremuti = 0
DoCmd.Maximize

End Sub

15 - Contatori su FORM / Progressivo elaborazione


numPassi = 1
numPasso = numPasso + 1
Forms!M_NOME_FORM![NOME TEXTBOX].Value = "Elabora tabelle: Bonifica I.C.I. (Passo: " & numPasso & "/" & numPassi & ")"
Forms!M_NOME_FORM.Repaint

Forms!M_NOME_FORM![NOME_LABEL].Caption = "Importa nuove commesse (record: " & RecordAttuale & "/" & TOTNuoveColate & ")"
Forms!M_NOME_FORM.Repaint

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 13 di 17

16 - Funzioni CtrlSeNULL, CtrlSeZERO, CtrlSeVUOTO, CtrlSeVUOTOeZERO


Public Function CtrlSeNULL(CampoControllo As Variant) As Variant
If IsNull(Trim(CampoControllo)) Then
CtrlSeNULL = 0
Else
CtrlSeNULL = Trim(CampoControllo)
End If

End Function

Public Function CtrlSeZERO(CampoControllo As Variant) As Variant


If Trim(CampoControllo) = 0 Then
CtrlSeZERO = ""
Else
CtrlSeZERO = Trim(CampoControllo)
End If

End Function

Public Function CtrlSeVUOTO(CampoControllo As Variant) As Variant


If Trim(CampoControllo) = "" Then
CtrlSeVUOTO = Null
Else
CtrlSeVUOTO = Trim(CampoControllo)
End If

End Function

Public Function CtrlSeVUOTOeZERO(CampoControllo As Variant) As Variant


If Trim(CampoControllo) = "" Or Trim(CampoControllo) = 0 Then
CtrlSeVUOTOeZERO = Null
Else
CtrlSeVUOTOeZERO = Trim(CampoControllo)
End If

End Function

17 - Funzioni MASSIMO e MINIMO su un array


Option Compare Database

Public Type MinMaxROFase


Min As Single
Max As Single
RO As Single
FASE As String
End Type

Public Function GetMinMaxROFase(L1 As Single, L2 As Single, L3 As Single, L4 As Single, L5 As Single, L6 As Single, L7 As Single, L8 As Single) As MinMaxROFase
Dim emp As MinMaxROFase

Dim Minimo As Single, Massimo As Single


Dim Valori(7) As Single
Dim FASE As String

' POPOLA L'ARRAY DI T1


Valori(0) = CtrlSeNULL(L1) ' 0°
Valori(1) = CtrlSeNULL(L2) ' 45°
Valori(2) = CtrlSeNULL(L3) ' 90°
Valori(3) = CtrlSeNULL(L4) ' 135°
Valori(4) = CtrlSeNULL(L5) ' 180°
Valori(5) = CtrlSeNULL(L6) ' 225°
Valori(6) = CtrlSeNULL(L7) ' 270°
Valori(7) = CtrlSeNULL(L8) ' 315°

Minimo = 1000
Massimo = -1000
FASE = ""
For x = 0 To 7
If Valori(x) < Minimo Then Minimo = Valori(x)
If Valori(x) > Massimo Then
Massimo = Valori(x)
If x = 0 Then
FASE = "0°"
ElseIf x = 1 Then
FASE = "45°"
ElseIf x = 2 Then
FASE = "90°"
ElseIf x = 3 Then
FASE = "135°"
ElseIf x = 4 Then
FASE = "180°"
ElseIf x = 5 Then
FASE = "225°"
ElseIf x = 6 Then
FASE = "270°"
ElseIf x = 7 Then
FASE = "315°"
End If
End If
Next

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 14 di 17

'MsgBox ("Minimo: " & Minimo & " : Massimo " & Massimo)
emp.Min = Minimo
emp.Max = Massimo
emp.RO = Minimo - Massimo
emp.FASE = FASE

GetMinMaxROFase = emp

End Function

18 - Leggi dati da foglio EXCEL (.xlsx)


Public Function LeggiDatiFoglio02(NomeFoglio As String)
Dim Rst1 As New ADODB.Recordset

Dim xlApp As Excel.Application


Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet

Dim A, B, C, D As Integer

Set xlApp = CreateObject("Excel.Application")


xlApp.Visible = False
'Set xlBook = xlApp.Workbooks.Open(CurrentProject.Path & "\FileDaBanca.xls")
Set xlBook = xlApp.Workbooks.Open("C:\Users\riccardo_morosini\Desktop\CANONI_BRENO\PROVA_CANONI.xlsx")

Rst1.CursorLocation = adUseClient
Rst1.Open "T_TMP_FOGLI", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
If Rst1.RecordCount > 0 Then Rst1.MoveFirst

Set xlSheet = xlBook.Worksheets(NomeFoglio)


A = 18
While A <= 60
' VERIFICO PARTENDO DALLA CELLA [G18]=QUANTITA' SE C'E' UN VALORE
If xlSheet.Cells(A, 7) <> "" Then
' SE C'E'
If xlSheet.Cells(A, 4) <> "" Then
Rst1.AddNew
Rst1!CLIENTE = xlSheet.Cells(3, 6) 'F3
Rst1!RIFERIMENTO = xlSheet.Cells(2, 6) 'F2
Rst1!CODICE_PANTHERA = xlSheet.Cells(2, 10) 'J2
Rst1!CODICE1 = xlSheet.Cells(A, 4) 'D&"A"
Rst1!CODICE2 = xlSheet.Cells(A, 5) 'E&"A"
Rst1!DESCRIZIONE = xlSheet.Cells(A, 6) 'F&"A"
Rst1!QUANTITA = xlSheet.Cells(A, 7) 'G&"A"
Rst1!CANONE = xlSheet.Cells(A, 95) 'CQ&"A"
Rst1!DATA_CONTRATTO = xlSheet.Cells(11, 7) 'G11
Rst1.Update
Else
' GENERO UN FILE TXT CONTENENTE IL CLIENTE E LA RIGA CON IL PROBLEMA
File_Anomalie = Trim(Rst1!CLIENTE) & ";" & Trim(Rst1!RIFERIMENTO) & ";CODICE1 NON PRESENTE"
Print #1, File_Anomalie
End If
End If
A=A+1
Wend

Chiudi:
xlBook.Close SaveChanges:=False
xlApp.Quit

Set xlSheet = Nothing


Set xlBook = Nothing
Set xlApp = Nothing

Set Rst1 = Nothing

End Function

19 - Q_ZeroAlSecondoDecimale
NewC: InStr([C];",")
NewC2: Mid([C];InStr([C];",")+1)
NewC3: IIf(Len(Mid([C];InStr([C];",")+1))>1;Mid([C];InStr([C];",")+1);Mid([C];InStr([C];",")+1) & "0")
NewC4: Mid([C];1;InStr([C];",")) & IIf(Len(Mid([C];InStr([C];",")+1))>1;Mid([C];InStr([C];",")+1);Mid([C];InStr([C];",")+1) & "0")

20 - Inserire numero progressivo in query di ordinamento


Ho creato questo campo nella query che genera i dati del sottoreport R_CTT_CICLO_ST1 del programma CertifNEW in FM.
Sotto la slide della query in questione:

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 15 di 17

Il risultato sarà:

Il codice è questo:

NumIncr: (Select Count (*) FROM T_CTT_CICLO_ST1 as A WHERE [A].[ID_CICLO_CTT] < [T_CTT_CICLO_ST1].[ID_CICLO_CTT])+1
Da verificare perchè non funziona ....

Ho risolto il problema creando al tabella T_TEMP con un campo ContRecT_CTT_CICLO_ST1 NUMERICO con valore predefinito = 1

Public Function ContaRecord(numero As Long, pag As Integer) As Integer

Dim Rst2 As New ADODB.Recordset


Dim ValoreIniziale As Integer

Rst2.CursorLocation = adUseClient
Rst2.Open "SELECT ContRecT_CTT_CICLO_ST1 FROM T_TEMP", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

If PrimoRecord Then
Rst2!ContRecT_CTT_CICLO_ST1 = 1
Rst2.Update
End If
ValoreIniziale = Rst2!ContRecT_CTT_CICLO_ST1

ContaRecord = ValoreIniziale
Rst2!ContRecT_CTT_CICLO_ST1 = Rst2!ContRecT_CTT_CICLO_ST1 + 1
Rst2.Update
PrimoRecord = False

Set Rst2 = Nothing

End Function

Nella tabella del sottoreport inseriamo il campo NumIncr che ci restituirà il numero del record corrente

21 - Funzione che ritorna più parametri


Nelle parte di dichiarazione delle variabili:

Option Compare Database


Option Explicit
............................
Public Type NumIDDTTarDTScad
NumID As String
DTTar As String
DTScad As String

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 16 di 17

End Type

La funzione sarà:

Public Function CercaStrumento(NomeStrumento As String) As NumIDDTTarDTScad


Dim Rst1 As New ADODB.Recordset
Dim emp As NumIDDTTarDTScad
Dim IDMorandini, DataTaratura, DataScadenza As String

Rst1.CursorLocation = adUseClient
Rst1.Open "SELECT * FROM T_CPU_STRUMENTI WHERE NOME_STRUMENTO = '" & Replace(NomeStrumento, "'", "''") & "'",
CurrentProject.Connection, adOpenDynamic, adLockOptimistic

If Rst1.RecordCount = 1 Then
emp.NumID = DaNullaVUOTO(Rst1!NUM_IDENTIFICATIVO_MORANDINI)
emp.DTTar = DaNullaVUOTO(Rst1!DATA_TARATURA_STRUMENTO)
emp.DTScad = DaNullaVUOTO(Rst1!DATA_SCADENZA_STRUMENTO)
Else
emp.NumID = ""
emp.DTTar = ""
emp.DTScad = ""
End If
CercaStrumento = emp

Set Rst1 = Nothing

End Function

Questa funzione potrà essere usata nel seguente modo all'interno del programma:

If Not IsNull(Me.STRUMENTO) Then


Me.ETI_NUMERO_ID.Caption = CercaStrumento(Me.STRUMENTO).NumID
Me.ETI_DATA_SCA.Caption = CercaStrumento(Me.STRUMENTO).DTScad
Me.ETI_DATA_TAR.Caption = CercaStrumento(Me.STRUMENTO).DTTar
Else
Me.ETI_NUMERO_ID.Caption = ""
Me.ETI_DATA_SCA.Caption = ""
Me.ETI_DATA_TAR.Caption = ""
End If

22 - Il comando LIKE nel codice VBA


Questo esempio funziona:
Dim Rst1 As New ADODB.Recordset

Rst1.CursorLocation = adUseClient
Rst1.Open "SELECT * FROM [TABELLA/QUERY] WHERE NOME CAMPO like '%" & Me.PARAMETRO & "%'", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

23 - Assegnare via codice il RecordSsource


Si crea un interruttore che gestisce il RecordSource della sottotabella:
If Me.Interruttore1 = -1 Then ' Interruttore attivato
Me.M_Maschera_ST1.Form.RecordSource = "SELECT campo1, campo2, campo3 WHERE campo1 = " & Me.X & " AND campo2 = " & Me.Y & " AND Not IsNull(Campo3)"
ElseIf Me.Interruttore1 = 0 Then ' Interruttore disattivato
Me.M_Maschera_ST1.Form.RecordSource = "SELECT campo1, campo2, campo3 WHERE campo1 = " & Me.X & " AND campo2 = " & Me.Y
End If

24 - Aprire un recordset su un'altro DB


Dim Rst1 As New ADODB.Recordset

Rst1.CursorLocation = adUseClient
' Si inserisce il [percorso completo].[nome database].[nome tabella]
Rst1.Open "SELECT * FROM F:\CARTELLA1\CARTELLA2\NOME_DATABASE.accdb.NOME_TABELLA", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

25 - Form ricerca dati


Si crea una form non associata ad alcuna tabella e si creano i combobox per la ricerca dei dati, impostando come valore predefinito *
All'interno di questa form si crea una sottoform con recordsource associato alla tabella dove vogliamo cercare i dati.
Sulla query metteremo nei campi di ricerca il nome delle combobox (ad es: Forms![NOME_FORM]!NOME_COMBOBOX)

26 - Collegare una tabella da codice (DAO)


Dim Certif As DAO.Database
Dim n As Integer, TableArray() As String
Dim TFileName As String, LinkedTable As TableDef, i As Integer
Dim TFileName2016 As String, LinkedTable2016 As TableDef

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018
ESEMPI CODICE VBA/ACCESS Pagina 17 di 17

Set Certif = CurrentDb


' Database esterno
TFileName = "F:\forge\certif\certif.accdb"
DoCmd.Hourglass True
n=4
ReDim TableArray(1 To n)
' Tabelle esistenti sul database esterno...
TableArray(1) = "T_CPP"
TableArray(2) = "T_CPM"
TableArray(3) = "T_CPU"
TableArray(4) = "T_CTT"
' ... che si vogliono collegare al database corrente con lo stesso nome
For i = 1 To n
Set LinkedTable = Certif.CreateTableDef(TableArray(i))
LinkedTable.Connect = ";DATABASE=" & TFileName
LinkedTable.SourceTableName = TableArray(i)
Certif.TableDefs.Append LinkedTable
Next i
Certif.TableDefs.Refresh
DoCmd.Hourglass False

27 - Eliminare una tabella collegata


.......
For I = 1 To n
On Error Resume Next
CurrentDb.Execute "DROP TABLE " & TableArray(I)
Next I
CurrentDb.TableDefs.Refresh
.......

28 -

http://www.riccardomorosini.com/ACCESSCode/ACCESSCode.htm 22/01/2018