Quelques
procédures VBA pour Microsoft Access comme la
réduction, la fermeture de la base ou bien sa copie,
l'effacement des données, l'exécution d'une
requête.
Manipulation
de la base
Manipulation d'un formulaire
Manipulation
d'un contrôle de formulaire
Requêter avec VBA
Manipulation d'une table
Sortir d'Access vers une autre application
Pour
des macros de manipulation d'Access à partir d'excel,
regarder xl_et_autres_applis.htm
Manipulation
de la base |
|
Fermeture d'une base
Microsoft Access
|
docmd.quit |
|
docmd.close |
Réduction de la
base Microsoft Access dans l'application Microsoft Access
|
docmd.minimize |
Chemin d'accès
à une base Microsoft Access |
currentdb.name |
Répertoire
où figure une base Microsoft Access |
Left(CurrentDb.Name,
Len(CurrentDb.Name) - Len(Dir$(CurrentDb.Name))) |
utilisé
pour créer des chemins relatifs et faire
référence à la base |
Function CheminBase()
pos = 1
Do Until pos = 0
SavePos = pos: pos = InStr(pos + 1, CurrentDb.Name, "\")
Loop
CheminBase = Left(CurrentDb.Name, SavePos)
FName = Mid(CurrentDb.Name,
SavePos + 1)
End Function |
Copie
d'une version
compactée d'une base Microsoft Access |
Function
CopierCompacterBase()
Dim FS As New FileSystemObject
ChDir CheminBase 'changement du répertoire courant
If FS.FileExists(CheminBase & "NomBase.mdb") Then
Kill
CheminBase & "NomBase_Backup.mdb"
Endif.
'Copie intermédiaire de la base
FS.CopyFile CurrentDb.Name, CheminBase &
"NomBase_Backup_Old.mdb", True
'Compactage de la copie sous un autre nom
Application.DBEngine.CompactDatabase CheminBase &
"NomBase_Backup_old", _
CheminBase & "NomBase_Backup"
'Effacement de la copie interrmédiaire
FS.DeleteFile CheminBase & "BackUp_BasePuce_old.mdb"
End Function |
Ouvrir
une autre base |
On Error Resume Next
Static ac As Access.Application: Set ac = New Access.Application
ac.Visible = True
ac.OpenCurrentDatabase (CheminBase & "Base.mdb")
ac.DoCmd.RunMacro "macro_a_lancer": DoEvents
ac.DoCmd.Quit:
Set ac = Nothing
|
Suppression
des messages
d'alertes de Microsoft Access |
DoCmd.SetWarnings False
'comme displayalerts pour Excel |
Suppression
d'un objet, ici une table "tableExport" |
DoCmd.DeleteObject acTable, "tableExport" |
Manipulation
d'un formulaire |
|
Ouverture
d'un formulaire Microsoft Access nommé
"Général" |
DoCmd.OpenForm
"Général", acNormal, , , ,
acWindowNormal |
Action
à l'ouverture d'un formulaire Microsoft Access |
Private Sub
Form_Open(Cancel As Integer)
msgbox "coucou"
End Sub |
Action
à la fermeture d'un formulaire Microsoft Access |
Private Sub
Form_Unload(Cancel As Integer)
msgbox "au revoir"
End Sub |
|
DoCmd.OutputTo
acOutputForm,
Me.uncontroledetypeliste.Name,
acFormatXLS, "tempFile.xls", True |
Manipulation
d'un contrôle de formulaire
|
|
Le contrôle
est-il sélectionné ?
|
Function
ContrôleSélectionné(frm As Form,
chNomCtrl As String) As Integer
Dim entI As Integer, ctl As Control
If frm.CurrentView <> 0
Then
' Le formulaire n'est pas en mode Création.
Exit Function
Else
For entI = 0 To frm.Count - 1
Set ctl = frm(entI)
If ctl.InSelection = True Then
' Le contrôle est-il
sélectionné ?
If UCase(ctl.Name) = UCase(chNomCtrl) Then
ContrôleSélectionné = True
Exit Function
End If
Else
ContrôleSélectionné = False
End If
Next entI
End If
End Function |
Eléments
sélectionnés d'un contrôle de type liste |
Dim frm As Form
Dim ctl As Control
Set frm = Me 'contient le formulaire en cours
Set ctl = frm!uncontroledetypeliste
For Each varElt In ctl.ItemsSelected
If IsNull(ctl.ItemData(varElt)) = False
Then
msgbox ctl.ItemData(varElt)
End If
Next varElt |
Déselection des
éléments d'un contrôle de type liste |
For i = 0 To Me.uncontroledetypeliste.ListCount
Me.uncontroledetypeliste.Selected(i) = False
Next i |
Page
sélectionnée d'un contrôle onglet
nommé CtlTab0 |
Private Sub
CtlTab0_Change()
Select Case CtlTab0.Pages(CtlTab0.Value).Name
Case "Nomdelapage1": form_statusbar.Caption = "Page 1
sélectionnée"
Case "Nomdelapage2": msgbox "Page 2 sélectionnée"
End Select
End Sub |
Spécifier la
requête d'un contrôle |
Lecontrole.rowsource =
"select distinctrow latable.champ1 from latable;" |
Charger ou
rafraîchir un contrôle |
Lecontrole.requery |
Manipulation
d'un état
|
|
Afficher un
état Microsoft Access |
DoCmd.OpenReport "Fax_Suivi", acViewPreview |
Imprimer
un état Microsoft Access |
DoCmd.PrintOut acPrintAll |
Fermer
un état Microsoft Access |
DoCmd.Close acReport, "Fax_Suivi" |
|
|
Requêter
avec VBA
|
|
Ouvrir
une requête
|
DoCmd.OpenQuery
"Nomdelarequete", acNormal, acEdit |
Exécuter
une requête et l'analyser
|
dim marequete
as recordset, nombreEnreg as integer
Set marequete = CurrentDb.QueryDefs("Nomdelarequete").OpenRecordset
On Error Resume Next
marequete.MoveLast
nombreEnreg = marequete.RecordCount
If nombreEnreg <> 0 Then
analyse.MoveFirst
compteur = 1
Do While Not analyse.EOF
analyse.Delete
"suppression
analyse.MoveNext "passage à l'enreg
suivant
Loop
End If |
Spécifier une
requête à la volée,
l'exécuter et contrôler son succès |
dim sqlInfos As String,
marequete as recordset
sqlInfos = "select distinctrow latable.date from latable group by
latable.date" & _
" having (((latable.date)=Date()-1))"
set marequete = CurrentDb.OpenRecordset(sqlInfos)
If marequete.RecordCount <> 0 Then
continuer = False:MsgBox ("Fin")
Else
continuer = True
End if
marequete.Close |
Autre
exécution à la volée |
DoCmd.RunSQL (sqlInfos) |
Effacer
X jours de données |
'Fonction non éprouvée, construite à la
volée à partir d'une macro que j'avais
rédigée
Function
EffacerXEtPlus(NomTable As String, NomChampDate As String,
NbJoursaEffacer As Integer)
On Error GoTo gest_erreur:
Dim sqlInfos As String
sqlInfos = "DELETE Date()-[" & NomTable & "]!["
& NomChampDate & "] AS Expr1, " & NomTable
& "."
sqlInfos = sqlInfos & " FROM " & NomTable
sqlInfos = sqlInfos & " WHERE (((" & NomChampDate
& "()-[" & NomTable & "]![" &
NomChampDate & "])> " & NbJoursaEffacer
& "));"
DoCmd.SetWarnings False
DoCmd.RunSQL (sqlInfos) 'lance l'exécution de la
chaîne sql
'MsgBox "Table " & NomTable & " nettoyée de
" & NbJoursaEffacer & "jour(s)"
DoCmd.SetWarnings True
gest_erreur: If Err Then
CreateObject("WScript.Shell").PopUp "Erreur, Interruption !" _
& Chr(13) & "Erreur n° :" & Err.Number
& Chr(13) & Chr(13) & _
"Description :" & Err.Description, 10, "Fin": End
End Function
|
Manipulation
d'une table
|
|
Transfert d'une table dans
un fichier
|
DoCmd.TransferText ,
"nom_du_fichier_de_parametres", "matable", _
CheminBase & "unrepertoire\"
& "nom_du_fichier_exporté" & Format(Date,
"yy-mm-dd") & ".csv", False, "" |
|
DoCmd.TransferSpreadsheet acExport, 5, "essai export",
"Monfichier.xls", True, ""
DoCmd.TransferSpreadsheet acImport, 5, "essai import",
"Monfichier.xls", True, "" |
Existence
d'une table |
Function
Table_Existe(nomTable) As Boolean
Dim db As Database
Set maBase = DBEngine(0)(0)
For i% = 0 To maBase.TableDefs.Count - 1
If (maBase.TableDefs(i%).Name = nomTable) Then Table_Existe = True:
Exit For
Next i%
End Function |
Lecture
de ses enregistrements et mise à jour |
Dim test As Recordset
Set test = CurrentDb.OpenRecordset("test", dbOpenTable, dbAppendOnly)
Do While Not test.EOF
With test
.Edit
!votrechamp = Date
.Update
End With
test.MoveNext
Loop
|
Valeur
d'un champ donné du premier enregistrement |
Function
GetParametre(NomParam As String, NomTable as String)
Dim laTable As Recordset
Set laTable = CurrentDb.OpenRecordset(NomTable, dbOpenTable)
GetParametre = laTable.Fields(NomParam).Value: Set maTable = Nothing
End Function
Par exemple tester
l'existence d'une table et la vider si existante
If Table_Existe("votreTable") Then DoCmd.RunSQL "DELETE FROM
votreTable" |
|
|
Sortir
d'Access vers une autre application
|
Ouvrir un document
quelconque |
Application.FollowHyperlink
CheminBase & "documents\Controle Puce.doc", , , False
'suppose que le logiciel pour ouvrir le document X soit bien
enregistré |
Excel |
Dim XL As
Excel.Application
Set XL = New Excel.Application
XL.Visible = True
XL.DisplayAlerts = False
Set myWbk = XL.Workbooks.Open(CheminBase & "tablox_bord\"
& "classeurX.xls")
myWbk.run "mamacro", var1, var2
Set XL = Nothing 'excel reste ouvert mais
plus pilotable par Access
End Sub |
Existence d'un fichier |
Dim variablequelconque,
reponse, FS As New FileSystemObject
If FS.FileExists(CheminBase & "BaseC.mdb") = False Then
CreateObject("WScript.Shell").PopUp "Base compactée
inexistante", 1, "Annulation !!"
End if |
Liste
de fichiers dans un objet liste |
Function MaJ_Liste_Fichiers(chemin As String, maListe As
Variant)
Dim i: i = 0
Dim ListeFichiers As String
Dim nomListe
Dim DirVar As String: DirVar = Dir(CheminBase & chemin)
Do While DirVar <> ""
If i < 1 Then ListeFichiers = DirVar Else ListeFichiers =
ListeFichiers & ";" & DirVar
DirVar = Dir()
i = i + 1
Loop
Set nomListe = maListe
nomListe.RowSourceType = "Liste valeurs"
nomListe.RowSource = ListeFichiers
End Function
'Exemple d'utilisation :
'variablequelconque =
MaJ_Liste_Fichiers("\tablox_bord\TBord_detail*.*",
maListe:=Me.listeDetail) |
Contrôle
d'une log ftp |
Function CheckProcessusFTP() As Boolean
Dim FileNumber 'contient le numéro de fichier
alloué par la méthode freefile
FileNumber = FreeFile 'le système aloue un
numéro de fichier pour la méthode open
Dim WholeLine As String, DebutChaine As String
Dim loginOk As Boolean, connectOk As Boolean, transfertOk As Boolean,
commandeGetOk As Boolean
'Ouverture en mode lecture du fichier de compte-rendu
Open CheminBase & "compterendu.txt" For Input As #FileNumber
Do While Not EOF(FileNumber) 'Boucler tant que ce
n'est pas la fin de fichier
Line Input #FileNumber, WholeLine
'stockage d'une ligne entière dans la variable WholeLine
DebutChaine = Mid(WholeLine, 1, 3) 'stockage
des trois premiers caractères de la ligne
Select Case DebutChaine
Case 230: loginOk = True
Case 250: connectOk = True
Case 200: commandeGetOk =
True
Case 226: transfertOk = True
End Select
Loop
If loginOk = True And connectOk = True
And commandeGetOk = True And transfertOk = True Then
CheckProcessusFTP = True
End If
Close #FileNumber
End Function |
Envoi
de mail |
Public Sub envoimail(Optional mytexte As String)
Dim myDestinataires, myObjet, myolApp, myNameSpace, myItem, i
myDestinataires =
Array(GetParametre("tableadmin","champdestinataire"))
myObjet = "test mail"
Set myolApp = CreateObject("Outlook.Application")
Set myNameSpace = myolApp.GetNamespace("MAPI")
Set myItem = myolApp.CreateItem(olMailItem)
myItem.Display
myItem.Subject = myObjet
myItem.Body = mytexte
For i = LBound(myDestinataires) To
UBound(myDestinataires)
myItem.Recipients.Add
myDestinataires(i)
Next
SendKeys "^{enter}"
End Sub |
Envoi
d'un objet, ici une table |
DoCmd.SendObject acSendTable, "tableExport", acFormatXLS,
"maildestinataire", "", "", "sujetMessage", "corpsMessage", False |
Opérations
sur date transposable sur les requêtes
'Lundi=1, Dimanche=7
mercrediencours =
Format(DateAdd("d", (3 - (WeekDay(DateAdd("ww", 0, Now()), 2))),
DateAdd("ww", 0, Now())))
mardiencours =
Format(DateAdd("d", (x - (WeekDay(DateAdd("ww", 0, Now()), 2))),
DateAdd("ww", 0, Now())), "dd/mm/yy")
dimanchedernier =
Format(DateAdd("d", (x - (WeekDay(DateAdd("ww", 0, Now()), 7))),
DateAdd("ww", 0, Now())), "dd/mm/yy")
lundidernier = Format(DateAdd("d", (x - (WeekDay(DateAdd("ww", -1,
Now()), 1))), DateAdd("ww", -1, Now())), "dd/mm/yy")
semainederniere = Format(Format(Date, "ww", 2, 3), "00") - 1
=> nomdelabase = "semaine" & Format(semainederniere,
"00") & "-an" & Format(Year(lundidernier), "0000")
'Une
liste déroulante dont le contenu dépend d'une
requête peut-être trié en croissant une
décroissant
Private Sub
Filtrer_Liste_Click()
If TriListeParClé1 = False Then
ListeDeroulante1.RowSource = "SELECT DISTINCTROW
table_test.Clé1, table_test.Clé2,
table_test.Clé3 FROM table_test ORDER BY
table_test.Clé1;"
ListeDeroulante1.Requery 'demander à access de
réexécuter la requête qui alimente la
liste
TriListeParClé1 = True
Filtrer_Liste.Caption = "Trier par Clé2 &
Clé3"
Else
ListeDeroulante1.RowSource = "SELECT DISTINCTROW
table_test.Clé1, table_test.libelleClé2,
table_test.Clé3 FROM table_caisseregionale ORDER BY
table_test.Clé2, table_test.Clé3;"
ListeDeroulante1.Requery
TriListeParClé1 = False
Filtrer_Liste.Caption = "Trier par Clé1"
End If
End Sub
'Analyse
d'une requête
Dim analyse As Recordset
'contiendra le résultat de la requête d'analyse du
fichier puce
Dim nombreEnreg As Integer 'nombre des enregistrements de l'objet
analyse
Dim compteur As Integer 'incrémenter un compteur pour
boucler sur les enregistrements
'ouverture requête
Analyse_Données_Importées_CPuce
Set analyse =
CurrentDb.QueryDefs("Analyse_Données_Importées_CPuce").OpenRecordset
On Error Resume Next
analyse.MoveLast: nombreEnreg = analyse.RecordCount
If nombreEnreg <> 0 Then
'CreateObject("WScript.Shell").PopUp "Regardez la requête
analyse, " & "Problème", 1, "il y a des
problèmes"
analyse.MoveFirst
compteur = 1
Do While Not analyse.EOF
analyse.Delete
analyse.MoveNext
Loop
End If