AS
Microsoft Access
Advanced Tips
Spostamento fra record in una maschera
Function recFirst(NomeMaschera As String)
DoCmd.GoToRecord acDataForm, NomeMaschera, acFirst
End Function
Function recPrec(NomeMaschera As String)
DoCmd.GoToRecord acDataForm, NomeMaschera, acPrevious
End Function
Function recSucc(NomeMaschera)
DoCmd.GoToRecord acDataForm, NomeMaschera, acNext
End Function
Function recLast(NomeMaschera As String)
DoCmd.GoToRecord acDataForm, NomeMaschera, acLast
End Function
Apertura di una tabella
Function openTbl(myTable As String)
DoCmd.OpenTable myTable
End Function
Apertura di una query
Function openQry(myQuery As String)
DoCmd.OpenQuery myQuery
End Function
Esportazione di una query in Excel
Una della tipiche funzionalità per un utilizzo integrato di Microsoft Access ed Excel è l'esportazione delle query in modo da aggiornare fogli esistenti (i quali magari rappresentano a loro volta le basi dati di tabelle pivot con aggiornamento automatico).
Ecco il codice:
Function EsportaExcel()
Dim Vpath As String
Dim Vfile As String
Vpath = Application.CurrentProject.Path
Vfile = Vpath & "\nomefile.xlsx"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "nomequery", Vfile, , "nomefoglio"
End Function
Data Access Objects
Ecco un esempio di accesso ai dati con il DAO. Immaginiamo di avere una tabella chiamata tbl_persona con la seguente struttura: id (contatore), nome (string), cognome (string). Immaginiamo anche una maschera chiamata start sulla quale ci siano i tre pulsanti accoda_tbl_persona, cancella_tbl_persona, modifica_tbl_persona e due caselle nominate nome e cognome.
I primi due pulsanti rappresentano un esempio di accesso diretto ai recordset. Il primo avvia la subroutine accoda_tbl_persona_Click che accoda i valori presenti nelle due caselle di testo, il secondo legge i campi uno ad uno e propone delle pop-up per modificare eventualmente i valori.
Il terzo pulsante è un esempio di come eseguire una stringa SQL, in questo caso una semplice DELETE.
Option Compare Database
 
Private Sub nome_AfterUpdate()
Forms!start.Refresh
End Sub
Private Sub cognome_Click()
Forms!start.Refresh
End Sub
 
Private Sub accoda_tbl_persona_Click()
On Error GoTo Err
Dim V_nome As String
If (IsNull(Forms!start.nome.Value) = True) Then
MsgBox ("compilare il campo Nome")
Exit Sub
Else
V_nome = Forms!start.nome.Value
End If
Dim V_cognome As String
If (IsNull(Forms!start.cognome.Value) = True) Then
MsgBox ("compilare il campo Cognome")
Exit Sub
Else
V_cognome = Forms!start.cognome.Value
End If
AccodaDati "tbl_persona", V_nome, V_cognome
MsgBox ("Fatto")
Exit Sub
Err:
MsgBox err.Description
Exit Sub
End Sub
 
Private Sub modifica_tbl_persona_Click()
ModificaDati "tbl_persona"
End Sub
 
Private Sub cancella_tbl_persona_Click()
On Error GoTo Err
Dim V_Warning As String
V_Warning = MsgBox("Pulisci tabella?", 4)
If V_Warning = 6 Then
CancellaDati "tbl_persona"
MsgBox ("fatto!")
End If
Exit Sub
Err:
MsgBox err.Description
Exit Sub
End Sub
Function AccodaDati(NomeTabella As String, Valore1 As String, Valore2 As String)
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = CurrentDb
Set rst = db.OpenRecordset(NomeTabella, dbOpenDynaset)
With rst
.AddNew
!nome = Valore1
!cognome = Valore2
.Update
End With
rst.Close
db.Close
End Function
 
Function ModificaDati(NomeTabella As String)
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim str As String
Set db = CurrentDb
Set rst = db.OpenRecordset(NomeTabella, dbOpenDynaset)
rst.MoveFirst
Dim c As Integer
c = 1
Do While Not rst.EOF
rst.Edit
str = InputBox("Nuovo nome per " + rst!nome + "?", "", rst!nome)
rst!nome = str
str = InputBox("Nuovo cognome per " + rst!cognome + "?", "", rst!cognome)
rst!cognome = str
rst.Update
MsgBox ("modifica record " & c & " ok")
c = c + 1
rst.MoveNext
Loop
rst.Close
db.Close
End Function
 
Function CancellaDati(NomeTabella As String)
Dim db As DAO.Database
Dim sqlStr As String
Set db = CurrentDb
sqlStr = "DELETE FROM " & NomeTabella & ";"
db.Execute sqlStr
db.Close
End Function
Nota. Per le vecchie versioni di Access (fino a 2003) includi fra le librerie selezionate dal Visual Basic Editor, strumenti->riferimenti "Microsoft DAO 3.6 Object Library". Dalla versione 2007 il DAO è incluso nella libreria "Microsoft Office 12.0/14.0* Access database engine Object Library". (*) versione alla data del presente articolo: 27/06/2019
Rendo disponibile il file Access utilizzato per il caso appena illustrato.
Scaricando il seguente file accettate che viene rilasciato così com'è senza alcun tipo di garanzia.
Alcune funzioni VBA sulle date
Giorno della settimana.
Il secondo argomento della funzione (2) indica che la numerazione inizia da lunedì=1.
SELECT Weekday([myDate],2) AS wDay
FROM myTable;
Numero della settimana.
SELECT DatePart("ww",[myDate]) AS week
FROM myTable;
Differenza di date in giorni.
SELECT DateDiff("d",[myDate1],[myDate2]) AS myDateDiff
FROM myTable;
Incremento di date in giorni.
SELECT DateAdd("d",+/-[myIncrement],[myDate]) AS myNewDate
FROM myTable;