Introduzione
Microsoft Access include una serie di funzionalità per consentire agli sviluppatori di database di creare moduli di immissione dati, report e query che possono guidare gli utenti nell'esecuzione di query sui dati esistenti nel database e nell'immissione di nuovi dati. Vari strumenti di creazione di query e procedure guidate facilitano questo processo di sviluppo. Anche con questi strumenti, tuttavia, potrebbero verificarsi situazioni in cui lo sviluppatore vorrebbe aggiungere ancora più funzionalità non già fornite dagli strumenti di sviluppo di MS Access. Ad esempio, lo sviluppatore potrebbe voler correggere automaticamente i dati non validi prima che vengano salvati nel database, mostrare un avviso in caso di violazione di una regola aziendale, aiutare l'utente a navigare da un modulo di immissione dati all'altro o avviare un rapporto con alcuni filtri personalizzati. Il modo per realizzare tale personalizzazione consiste nell'aggiungere codice utilizzando il linguaggio di programmazione Visual Basic, Applications Edition.
Visual Basic, Applications Edition (VBA) è il linguaggio di programmazione utilizzato nella famiglia di prodotti software Microsoft Office come Excel e Access. Il linguaggio VBA deriva dal linguaggio "Base" inventato nel 1964 che divenne popolare sui personal computer negli anni '70. La parte "Visuale" del nome è stata aggiunta da Microsoft per riflettere l'uso del linguaggio di programmazione Basic in Microsoft Windows.
Ci sono molti tutorial che introducono la programmazione di base. Questo tutorial si concentrerà su un piccolo sottoinsieme di funzionalità del linguaggio VBA utilizzato in MS Access.
Contenuti
- Eventi in Microsoft Access
- Esempio di codice VBA:assicurarsi che i nomi siano in un caso appropriato
- Il linguaggio VBA:dichiarazione e assegnazione a variabili, dichiarazioni condizionali e commenti
- Il linguaggio VBA:funzioni, metodi ed esempi
- Il linguaggio VBA – Proprietà
- Esercizi di codifica VBA
- Gestione degli errori in VBA
- Esecuzione di query SQL personalizzate in VBA
La pagina successiva introduce gli eventi in Microsoft Access.
Eventi in Microsoft Access
In Access, il codice di programmazione VBA è allegato a moduli e report e può essere impostato per essere eseguito in un momento specifico o in reazione a un evento specifico. Questo stile di programmazione viene talvolta definito programmazione "basata su eventi", il che significa che il codice scritto dallo sviluppatore verrà eseguito in risposta ad alcuni eventi .
Quando un modulo viene visualizzato in Visualizzazione modulo, in genere esegue una query su tutti i dati esistenti dalle tabelle sottostanti e quindi rimane inattivo finché l'utente non fa qualcosa. Ad esempio, l'utente può fare clic su uno dei pulsanti di navigazione per passare al record successivo, fare clic in una casella di testo e iniziare a digitare alcuni nuovi dati oppure fare clic sul pulsante Chiudi per chiudere il modulo. Ognuna di queste azioni si traduce in un Evento accade nella forma. Ogni clic del mouse o tratto della tastiera viene gestito come un evento.
Per la maggior parte, gli eventi hanno un comportamento predefinito. Cliccando sul pulsante di navigazione “record successivo” il modulo scorre al record di dati successivo. Digitando la lettera "C" quando il cursore si trova in una casella di testo, nella casella di testo viene visualizzata la lettera "C". Premendo il tasto TAB il cursore passa alla casella di testo (o al controllo) successivo del form e così via. Un programmatore può ignorare o migliorare questo comportamento predefinito e inserire il proprio codice da eseguire in risposta all'evento.
La programmazione VBA su moduli di accesso e report si concentra principalmente sulla scrittura di codice per rispondere a diversi eventi.
Prima di addentrarci nei dettagli degli eventi, può essere istruttivo implementare un semplice esempio. Per vedere del codice in azione, la sezione successiva di questo tutorial fornisce una procedura dettagliata per l'aggiunta di codice VBA a un modulo di immissione dati.
Esempio di codice VBA:assicurarsi che i nomi siano nel caso corretto
Quello che segue è un esempio relativamente breve e semplice di aggiunta di codice VBA a un modulo di immissione dati in MS Access. Per brevità verranno saltati diversi dettagli. Dopo questo esempio, il resto di questo tutorial inserirà questi dettagli.
Questo esempio utilizza il Cliente modulo di immissione dati personalizzato nell'esercitazione Advanced MS Access Forms. Potresti voler completare quel tutorial (o almeno le parti relative al modulo di inserimento dati del cliente) prima di continuare.
Quando inseriamo le informazioni di un nuovo cliente, vorremmo assicurarci che i nomi del cliente siano inseriti nel "caso corretto". Cioè, la prima lettera del nome dovrebbe essere una lettera maiuscola e il resto del nome dovrebbe essere in minuscolo. Se l'utente inserisce:"joe" vorremmo che il modulo correggesse automaticamente questo caso:"Joe".
In termini di Eventi, aggiungeremo il codice collegato all'evento Dopo l'aggiornamento per il campo Nome nel modulo del cliente. Ciò significa che dopo qualcosa è stato modificato (aggiornato ) nel campo Nome, verrà attivato l'evento After Update e quindi il codice che scriveremo entrerà in azione per assicurarsi che il nome digitato venga convertito in maiuscolo corretto.
I seguenti passaggi mettono in atto questo codice.
- Apri l'immissione dei dati del cliente in modalità Progettazione.
- Fai clic con il pulsante destro del mouse su Nome casella di testo e seleziona Proprietà dal menu a comparsa.
- Quando il foglio di proprietà viene visualizzato, fare clic sulla scheda Evento. Questo è mostrato nella figura seguente:
Prendere nota dell'elenco degli eventi visualizzati. Ognuno può essere programmato per rispondere all'evento specifico che accade al Nome casella di testo.
- Crea un nuovo gestore di eventi facendo clic sui tre punti a destra dell'evento After Update.
- Il Scegli Builder apparirà la finestra. Seleziona Generatore di codice e quindi fare clic su OK pulsante.
- Apparirà la finestra di modifica del codice VBA. Si noti che Access ha già creato lo stub della subroutine che inizia con le parole Private Sub e termina con le parole End Sub.
Il nome della subroutine viene creato utilizzando il nome del controllo form (FirstName) e il nome del Evento a cui risponderà questa subroutine (AfterUpdate).La riga End Sub è dove finirà questa particolare subroutine.
- Aggiungi il seguente codice sulla riga vuota tra Private Sub e End Sub.:
FirstName = StrConv(FirstName, vbProperCase)
Una volta completato, il codice apparirà come segue:
Questa nuova riga di codice esegue le seguenti operazioni:
StrConv è una funzione che accetta il contenuto della casella di testo FirstName e lo converte in base al secondo parametro indicato, che in questo esempio è vbProperCase. Al termine di questa conversione, il risultato verrà riassegnato (usando il segno di uguale) alla casella di testo FirstName. Questo sovrascriverà tutto ciò che è attualmente nella casella di testo FirstName. Ad esempio, questa funzione prenderà "Sally", lo convertirà in "Sally" e quindi inserirà "Sally" nella casella di testo Nome.
- Salva questo nuovo codice aprendo il File menu e selezionando Salva .
- Testare il nuovo codice. Torna alla schermata della modalità di progettazione di Microsoft Access. Cambia la visualizzazione in Visualizzazione modulo.
- Vai a un record vuoto. Fare clic sul campo Nome e digitare un nome in tutte le lettere minuscole:
- Premi la scheda tasto per passare alla casella di testo successiva. Il nome di Joe dovrebbe essere cambiato in "Joe" come mostrato di seguito:
- Se ricevi un errore, torna all'editor di codice VBA e assicurati di aver digitato correttamente tutte le parti del codice. Potrebbe essere necessario abbassare il pulsante Esegui menu e seleziona Ripristina per interrompere l'esecuzione del codice VBA.
L'esempio precedente ha fornito una rapida occhiata a come è possibile personalizzare il comportamento di un modulo per aiutare l'utente a inserire dati ben formattati nel database. Diversi dettagli sono stati ignorati durante questo esempio e tali dettagli verranno discussi nel resto di questo tutorial.
Il linguaggio VBA
Questa sezione introduce brevemente le parti principali del linguaggio VBA utilizzato in MS Access. Una panoramica completa di VBA va oltre lo scopo di questo tutorial. Alla fine di questo tutorial sono forniti riferimenti a libri e materiali più completi.
Dichiarazione di variabili
Una variabile è un nome dato a un segnaposto in cui il programmatore può memorizzare alcuni dati. Ad esempio, una variabile potrebbe essere utilizzata per memorizzare un numero mentre eseguiamo alcune operazioni matematiche su di esso o ne confrontiamo il valore con altre variabili. È possibile dichiarare che le variabili contengano valori di un tipo di dati specifico come numeri interi, stringhe o date. Per dichiarare una nuova variabile, utilizzare l'istruzione Dim. Ad esempio, per dichiarare una nuova variabile denominata MyName e impostalo per contenere una stringa (caratteri), procedi come segue:
Dim strMyName As String
Per dichiarare una nuova variabile denominata "AccountBalance" e configurarla per memorizzare un numero con un decimale, utilizzare quanto segue:
Dim dblAccountBalance come doppio
Assegnazione di valori
Un valore può essere assegnato a una variabile oa un controllo sulla maschera utilizzando il segno di uguale. Ad esempio, per memorizzare il nome "Alex" nella variabile MyName, utilizzare quanto segue:
strMyName =“Alex”
Per copiare il contenuto della casella di testo FirstName nella variabile MyName, utilizzare:
strMyName =[Nome]
I valori possono anche essere calcolati prima di essere assegnati. Ad esempio, la seguente espressione prende il saldo del conto del cliente corrente dalla casella di testo [Saldo], aggiunge l'1% di interesse (moltiplicando il saldo per 1,01) e quindi riduce il risultato di $ 10. Infine, il risultato viene assegnato alla variabile AccountBalance.
dblAccountBalance =( [Saldo] * 1.01 ) – 10.00
Dichiarazioni condizionali
Un'istruzione condizionale utilizza un test logico per determinare quali righe di codice eseguire successivamente. L'istruzione condizionale If... Then viene usata abbastanza frequentemente. Ad esempio:
If AccountBalance < 1000 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
Viene valutata l'espressione logica AccountBalance <1000. Se questa espressione è vera (ad esempio se AccountBalance è $ 400), viene eseguita la riga successiva dopo Then. In questo esempio, tariffa mensile =10.
Se questa espressione è False, viene eseguita la riga dopo Else.
L'espressione logica può includere diverse parti collegate dagli operatori booleani OR, AND e NOT. Una discussione più approfondita delle espressioni booleane può essere trovata in questo tutorial di programmazione. Ad esempio, supponiamo di rinunciare al canone mensile se il conto ha meno di un anno. Supponiamo di avere AccountAge come età dell'account in mesi. Quindi il codice sarebbe:
If AccountBalance < 1000 AND AccountAge > 12 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
È possibile eseguire più righe di codice nelle istruzioni If... Then e If... Then possono essere nidificate l'una nell'altra.
Commenti
Quando si programma in qualsiasi linguaggio di programmazione, è buona norma includere commenti che descrivono il codice. In VBA un commento può essere incluso iniziando con una singola virgoletta. Prendendo come esempio quanto sopra, potremmo aggiungere i seguenti commenti:
Altre parti del linguaggio VBA sono discusse nella pagina successiva.
Lingua VBA – Continua
Funzioni
Il linguaggio VBA ha un gran numero di funzioni e metodi integrati che possono essere utilizzati per svolgere vari compiti come funzioni matematiche (sin, cos, tan), funzioni di stringa e molti altri. Le funzioni in genere hanno uno o più parametri di input utilizzati dalla funzione. Ad esempio, nella funzione Cos(45) il “45” è l'angolo di input su cui la funzione coseno funzionerà. La funzione StrConv richiede due parametri di input:la stringa da convertire e lo stile di conversione:
StrConv(Nome, vbProperCase)
Alcune utili funzioni includono:
MsgBox( prompt, pulsanti, titolo) | Visualizza una finestra di messaggio pop-up con il testo, i pulsanti e il titolo del prompt |
StrConv( espressione, stile ) | Convertire l'espressione stringa in maiuscolo, minuscolo o proprio |
Sinistra( espressione, caratteri ) | Prendi la maggior parte dei caratteri a sinistra dall'espressione stringa |
Mid( espressione, inizio, caratteri ) | Prendi il set centrale di caratteri dall'espressione stringa a partire dall'inizio |
ÈNull( espressione ) | Verifica se l'espressione stringa (o la casella di testo) non ha contenuto (è null) |
Nz( espressione, valore_se_null ) | Se l'espressione è nulla, inserisci un valore predefinito |
Ora() | Restituisce la data e l'ora correnti |
Round(espressione, decimali ) | Arrotonda l'espressione numerica a un certo numero di cifre decimali |
RGB( rosso, verde, blu ) | Restituisce il colore intero in base a una combinazione di rosso, verde e blu |
Metodi
I metodi in VBA sono come funzioni ma sono collegati a un controllo o altro oggetto su una maschera o un report.
Alcuni metodi utili includono:
DoCmd.CancelEvent | Annulla l'evento corrente che viene gestito |
DoCmd.Chiudi | Chiudi il modulo (o database) corrente |
DoCmd.OpenForm | Apre un nuovo modulo |
DoCmd.OpenReport | Esegui un comando MS Access come salvare dati nuovi o aggiornati, annullare una modifica o uscire da un modulo |
.SetFocus | Imposta il focus sul controllo del form |
.Annulla | Annulla la modifica o il comando più recenti |
.Aggiorna | Aggiorna tutti i dati sottostanti un modulo |
.Richiesta | Richiede i dati forniti a un modulo |
.Ridipingi | Ridisegna tutti i controlli su un modulo |
Molte altre funzioni e metodi sono elencati in questo sito Microsoft.
Il seguente insieme di esempi fa uso di varie funzioni e metodi in diverse combinazioni.
Esempi
Mostra all'utente un avviso se il saldo dell'account è inferiore a $ 1.000
If AccountBalance < 1000 Then MsgBox("Warning: The Account Balance is now less than $1,000.") End If
Se la casella di testo FirstName nel modulo contiene qualcosa, convertilo in maiuscolo corretto
If Not IsNull( [FirstName] ) Then FirstName = StrConv( [FirstName], vbProperCase ) End If
la pagina successiva introduce le proprietà di diversi oggetti.
Proprietà
Ciascun elemento di un modulo di immissione dati o di un report ha un insieme di proprietà ad esso associato. Le proprietà controllano il posizionamento, il colore, il carattere, lo sfondo e altri attributi di aspetto e formattazione di ciascun controllo. Ad esempio, alcune delle numerose proprietà di un TextBox includono:
Visibile | Determina se la casella di testo è visibile nel modulo |
Bloccato | Determina se i dati nella casella di testo possono essere modificati |
Indice delle schede | L'ordine di ogni controllo mentre l'utente naviga nel modulo premendo Tab |
Etichetta | Identifica il nome dell'etichetta associata alla casella di testo |
Larghezza, altezza, posizione superiore e inferiore | Indica la posizione relativa e la dimensione della casella di testo |
Stile e colore dello sfondo | Imposta lo stile di sfondo e il colore della casella di testo |
Stile bordo e colore | Imposta lo stile e il colore del bordo attorno alla casella di testo |
Dimensione carattere, peso, sottolineato, corsivo, colore e allineamento | Imposta il carattere e lo stile |
Spaziatura margini e spaziatura interna:imposta i margini e la spaziatura interna attorno alla casella di testo |
Le proprietà possono essere impostate utilizzando la Visualizzazione Progettazione e salvate con il modulo o il report. Le proprietà possono anche essere modificate utilizzando il codice VBA mentre il modulo è in esecuzione. Per accedere a una proprietà in VBA, utilizzare il nome del controllo, quindi un punto e quindi il nome della proprietà. Ad esempio, il codice seguente modifica il colore del carattere della casella di testo CustomerID in rosso:
IDCliente.ForeColor =vbRed
Le sezioni che seguono forniscono alcuni esercizi che combinano diverse parti del linguaggio di programmazione VBA per personalizzare il comportamento di vari moduli di immissione dati.
Esercizi sul codice VBA
Prova i seguenti esercizi per personalizzare i moduli. Fare riferimento alle sezioni precedenti per esempi di codice che possono essere adattati per adattarsi all'esercizio corrente.
Esercizio 1
Modificare il modulo CustomerDataEntry per aggiungere due gestori di eventi AfterUpdate che convertiranno il nome e il cognome in maiuscolo corretto (creare un gestore AfterUpdate separato per ogni casella di testo). Scrivi il codice per verificare che la casella di testo non sia nulla prima di tentare di convertire il testo.
Esercizio 2
Modificare il modulo AccountsDataEntry per aggiungere un gestore di eventi AfterUpdate che visualizzerà una finestra di messaggio di avviso se il saldo dell'account è inferiore a $ 5.000. Trasforma anche in rosso il colore del carattere della casella di testo Saldo.
Esercizio 3
Modifica il modulo di inserimento dati cliente. Creare una subroutine On Lost Focus che trasforma l'etichetta per la casella di testo FirstName in rosso (vbRed) se l'utente lascia la casella di testo FirstName senza digitare nulla. Imposta l'etichetta su blu (vbBlue) se c'è qualcosa nella casella di testo. Nell'esempio seguente non è stato digitato nulla nella casella di testo FirstName, quindi l'utente è passato alla casella di testo successiva facendo diventare rossa l'etichetta FirstName.
La pagina successiva di questo tutorial illustra come gestire gli errori nel codice VBA.
Gestione degli errori in VBA
Di tanto in tanto il codice VBA riscontrerà un errore. Ad esempio, se una casella di testo è vuota e si tenta di convertire il contenuto della casella di testo in maiuscolo corretto, la funzione StrCnv avrà esito negativo. Un altro esempio è quando avviene la divisione per zero. Senza la gestione degli errori, questi problemi possono causare l'arresto anomalo del programma VBA. Quando si verifica un errore, un codice speciale può entrare in azione per gestire l'errore e continuare a elaborare il codice VBA.
Le due principali funzionalità di gestione degli errori di VBA sono l'istruzione On Error Goto e l'istruzione Resume Next. Queste due istruzioni di codice VBA interagiscono per impedire a VBA di arrestare in modo anomalo l'applicazione.
L'istruzione On Error Goto informa VBA su cosa fare quando si verifica un errore in una subroutine. La parte Goto dell'istruzione fa riferimento a un'etichetta altrove nel codice in cui VBA continuerà a funzionare. Una volta che il programma VBA arriva all'etichetta, qualsiasi errore verrà visualizzato in un oggetto chiamato Err. La proprietà Err.Description conterrà una descrizione testuale dell'ultimo errore riscontrato. L'istruzione Resume Next farà sì che il programma VBA continui a essere eseguito dal punto in cui si è verificato l'errore.
L'esempio seguente espande la routine FirstName_AfterUpdate introdotta all'inizio di questa esercitazione. Ora il programma VBA può gestire eventuali errori che possono verificarsi nel programma.
Private Sub FirstName_AfterUpdate ' Subroutine to convert the FirstName of the customer to Proper Case On Error Goto FirstName_AfterUpdate_Error_Handler FirstName = StrConv(FirstName, vbProperCase) ' If the conversion was successful, exit this subroutine Exit Sub FirstName_AfterUpdate_Error_Handler: ' If there is an error show the description of the error MsgBox Err.Description ' Resume with the next statement In the subroutine Resume Next End Sub
la sezione successiva di questo tutorial illustra come includere il codice SQL in VBA.
Esecuzione di query SQL personalizzate in VBA
Structured Query Language (SQL) è il linguaggio di programmazione utilizzato nei database relazionali come MS Access, SQL Server, Oracle e molti altri. Le istruzioni SQL possono essere utilizzate per inserire, aggiornare, eliminare e recuperare (selezionare) record di dati dalle tabelle (tra molte altre abilità). Un semplice esempio di istruzione SQL potrebbe essere:
SELECT customerid, firstname, lastname FROM customer
Il codice SQL può essere scritto all'interno di VBA ed eseguito al momento opportuno. Ad esempio, è possibile scrivere una subroutine VBA per interrogare la tabella Customer per trovare l'ID cliente più alto. Quindi potremmo aggiungere 1 a questo numero per ottenere un nuovo CustomerID non utilizzato per un nuovo record.
I passaggi generali per svolgere questo tipo di attività sono:
Crea un'istruzione SQL
Eseguire l'istruzione SQL utilizzando la connessione al database aperta (denominata CurrentDb in VBA)
Recupera i record risultanti e utilizza i dati recuperati
Per creare questa subroutine VBA, apri il modulo CustomerDataEntry e ottieni le proprietà del campo CustomerID. Nella scheda eventi, fai clic sui tre punti a destra dell'evento On Dbl Click. Scegli Code builder e lo stub verrà creato come segue:
Private Sub CustomerID_DblClick(Cancel As Integer) End Sub
Aggiungi il seguente codice:
Private Sub CustomerID_DblClick(Cancel As Integer) ' Create a new CustomerID when user double-clicks in the CustomerID field On Error GoTo ErrorHandler Dim rstResults As Recordset ' This will hold the set of result records Dim strSQL As String ' This variable will hold the text of the SQL Statement ' If there is nothing in the CustomerID text box If IsNull(CustomerID) Then ' Make the SQL statement strSQL = "SELECT MAX(customerid) + 1 AS NewID FROM customer" ' Run the SQL query against the current database Set rstResults = CurrentDb.OpenRecordset(strSQL) ' If at least 1 record is returned If rstResults.EOF = False Then ' Assign the NewID to the CustomerID field CustomerID = rstResults!NewID End If rstResults.Close ' Close up the result set Set rstResults = Nothing ' Empty out the result set End If Exit Sub ErrorHandler: Set rstResults = Nothing End Sub
Il codice apparirà come il seguente una volta che è tutto a posto:
Salvare il file e quindi visualizzare il modulo CustomerDataEntry. Passare a un nuovo record e quindi fare doppio clic nel campo CustomerID. Dovrebbe essere creato automaticamente un nuovo CustomerID.