Tutoriel réalisé avec Access 2016
Lorsque vous créez une macro sur Access, vous n’avez pas sa « version » en langage VBA et si vous souhaitez incorporer cette macro à une autre action via le même évènement, créer une boucle ou autre, cela peut être problématique.
Dans ce tutoriel, je vais donc lister les principaux codes VBA que j’utilise lorsque je crée des boutons et ne souhaite pas garder son action en tant que macro. Ces codes sont bien sûr à utiliser dans une procédure (sur clic d’un bouton par exemple).
SOMMAIRE
Code VBA pour ajouter un enregistrement
DoCmd.GoToRecord , , acNewRec
Code VBA pour se placer sur le premier enregistrement d’un formulaire
DoCmd.GoToRecord , , acFirst
Code VBA pour se placer sur le dernier enregistrement d’un formulaire
DoCmd.GoToRecord , , acLast
Code VBA pour sauvegarder l’enregistrement en cours
DoCmd.RunCommand acCmdSaveRecord
Code VBA pour supprimer un enregistrement
DoCmd.RunCommand acCmdDeleteRecord
Code VBA pour fermer le formulaire en cours
DoCmd.Close
Code VBA pour fermer un formulaire spécifique
DoCmd.Close acForm, "(nom du formulaire)"
Exemple :
DoCmd.Close acForm, "F_Clients"
Code VBA pour rafraîchir les données d’un formulaire ou actualiser un enregistrement
J’utilise ce code principalement lorsque je reviens sur un formulaire. Par exemple, si je modifie une facture pour indiquer qu’elle est réglée et que je reviens sur mon formulaire d’accueil où je liste les factures non réglées, cela me permet d’actualiser ma liste et de ne plus voir apparaître cette facture.
Me.Refresh
(sur activation du formulaire dans ce cas)
On peut aussi utiliser
(nom du contrôle).Refresh
ou
Me.Requery
ou
(nom du contrôle).Requery
(à voir lequel fonctionne dans votre cas de figure)
Code VBA pour ouvrir un formulaire
DoCmd.OpenForm "(nom du formulaire)"
Exemple :
DoCmd.OpenForm "F_Factures"
Code VBA pour ouvrir un formulaire sur un enregistrement spécifique
DoCmd.OpenForm "(nom du formulaire)", , , "[(numéro unique indiqué dans le formulaire de départ)] = " & numéro unique indiqué dans le formulaire d’arrivée
Exemple :
DoCmd.OpenForm "F_Clients", , , "[ID_Client] = " & ID_Client
Code VBA pour se déplacer sur un onglet spécifique d’un formulaire
Ce code peut être combiné au précédent lorsque vous créez une navigation par onglets.
Forms![(nom du formulaire)]!(nom du groupe d’onglets).Value = (numéro de l’onglet)
Exemple :
Forms![F_Clients]!Navigation.Value = 1
(dans ce cas, je vais sur le 2e onglet, car cela commence à 0)
Code VBA pour ouvrir un état
DoCmd.OpenReport "(nom de l’état) ", acViewPreview
(pour afficher avant impression ou acViewReport pour l’afficher en Mode État ou acViewNormal pour imprimer l’état)
Exemple :
DoCmd.OpenReport "E_Factures", acViewPreview
Code VBA pour ouvrir un état sur un enregistrement spécifique depuis un formulaire
DoCmd.OpenReport "(nom de l’état)", acViewPreview, , "(numéro unique indiqué sur l’état)=" & (numéro unique indiqué sur le formulaire)
Exemple :
DoCmd.OpenReport "E_Factures", acViewPreview, , "ID_Facture=" & ID_Facture
Les numéros uniques n’ont pas besoin d’apparaître, car il s’agit la plupart du temps d’un Numéroauto, mais ils doivent être dans la source du formulaire et de l’état.
Code VBA pour annuler les messages d’alerte
Ce code vous évite d’avoir les messages d’avertissements qu’Access affiche selon l’action effectuée (une requête d’ajout par exemple). Cependant, il est à utiliser avec précaution, car le retour en arrière ne sera pas possible.
Code VBA à placer en début de procédure :
DoCmd.SetWarnings False
Code VBA à placer en fin de procédure :
DoCmd.SetWarnings True
Bonjour,
Permettez-moi de vous remercier tout d’abord pour la qualité de vos tutoriels.
J’essaye actuellement de créer une plateforme de gestion sur Access, j’ai créé un formulaire qui contient une zone de liste (un sous-formulaire) liée à une table permettant d’afficher tous les enregistrements. Parmi les champs de la table, j’ai les champs « BANQUE » et « MONTANT ».
Au-dessus de cette zone de liste, j’ai écrit « veuillez sélectionner une banque » et, juste devant ça, j’ai inséré une liste déroulante qui me permet de choisir l’une des banques.
Juste à côté, j’ai trois zones de texte. La première nommée « plafond autorisé », elle m’affiche le plafond correspondant à la banque sélectionnée dans la liste déroulante. La deuxième pour calculer la somme des montants utilisés de la liste déroulante et la troisième pour le reliquat entre le plafond et les montants.
Le premier problème que j’ai est que je veux créer un lien entre la première liste déroulante et la deuxième. Si je choisis une banque, la deuxième se filtre et m’affiche que les enregistrements contenant le champ de cette banque, ainsi la zone de texte2 affiche la somme des montants après le filtre et le reliquat est automatiquement calculé.
Le deuxième c’est que je veux qu’à chaque fois que je clique sur l’un des enregistrements, il m’affiche le détail qui lui correspond et comme ça je peux faire des suppressions, impressions ou ajouts qui impactent le montant calculé sous forme de somme dans la liste déroulante de synthèse.
Je vous prie de bien vouloir me donner un coup de main dans ce sens, vraiment c’est très urgent.
Mes remerciements.
Bonjour,
Je pense que vous faites une confusion entre une zone de liste et sous-formulaire : ils n’ont rien à voir l’un et l’autre (l’une est un contrôle et l’autre un formulaire imbriqué).
Pour avoir le plafond correspondant à la banque, je vous invite à suivre la partie du tutoriel sur la création de factures Access où j’indique comment afficher le prix unitaire correspondant à un produit.
Si c’est bien un sous-formulaire que vous avez créé, votre deuxième problème est censé être réglé de lui-même puisque c’est son fonctionnement normal.
Bonjour,
Je vous prie de me donner un coup de main, je suis débutante en Access, bref, j’ai un fichier sur Excel portant les relevés bancaires avec les colonnes suivantes (Date/Libellé/Débit/Crédit/N°compte).
Mon objectif est de créer sur Access une application pour la gestion budgétaire des projets, vu que je n’ai pas de temps pour consulter le relevé à chaque fois et faire un pointage des opérations, je cherche à automatiser les choses, je vous donne un exemple :
Dans le libellé, s’il y a un encaissement constaté (Débit), je veux qu’on me cherche le n° de marché dans le libellé et le N° de l’attachement de ce marché. Pourtant, les libellés peuvent changer, parfois on trouve ASMN M2434 DC2 (dans ce cas, Marché 2434 attachement N°2), parfois, prêt emprunt…le cas échéant est la première forme.
J’ai pensé à ajouter deux colonnes sur le tableau Excel : la 1ère pour me chercher quel marché et la deuxième quel attachement. Pourtant, je ne sais pas comment le faire tout d’abord sur Excel (j’ai essayé avec la formule stxt et cherch, mais il y a des cas où il me renvoie toute une chaîne de lettre donc ce n’est pas efficace, je cherche une autre solution) et, deuxièmement, c’est comment exploiter ces données sur Access d’une façon à avoir une situation financière globale à jour qui regroupe les différents projets et, sous le détail de chacun, on aura des infos sur les attachements, combien y a-t-il de remboursements, le reliquat, PJ (et s’il y a une possibilité d’avoir une notification qui s’affiche sur l’écran du bureau qui informe qu’un nouvel encaissement est constaté d’un montant de … Marché N°…).
Je vous remercie d’avance.
Bonjour,
Pour rechercher une valeur dans une cellule, il faut combiner des fonctions comme Gauche, Droite, Cherche et Nbcar. Tout dépend de la syntaxe de la cellule et du résultat attendu.
Ensuite, vous pouvez importer vos données Excel sur Access avec la fonction d’importation.
Vous ne pourrez pas avoir une notification sur le bureau, mais vous pouvez vous créer un formulaire sur un menu d’accueil basé sur une requête avec les résultats que vous souhaitez.
Bonjour,
Je voudrais savoir comment empêcher un formulaire Access d’occuper tout l’espace-écran à son exécution. J’aurai aimé qu’il garde les dimensions que je lui ai données à la conception.
Merci d’avance.
Bonjour,
Il faut mettre la propriété « Fenêtre contextuelle » du formulaire à Oui.
Merci pour la promptitude, mais je n’ai pas trouvé « Fenêtre contextuelle » dans la liste des propriétés.
J’utilise Access 2010 à toutes fins utiles.
Merci à vous.
C’est dans l’onglet Autres de la Feuille de propriétés.
Dans cet onglet, il y a fenêtre indépendante et fenêtre modale comme propriétés, mais pas de fenêtre contextuelle.
Et fenêtre indépendante règle justement le problème.
Merci Madame !!!
Bonjour Madame Lydia,
D’abord, je vous remercie pour la qualité de vos tutoriels.
Je voudrais votre aide en Access, j’ai un problème et, jusqu’à maintenant, je ne peux pas le résoudre.
J’ai une table comme ceci :
ID N°client Dossier
1 1-11 A
2 1-11 A
3 1-11 A
4 1-11 B
Je voudrais afficher un message (« Terminé ») quand je clique sur un bouton si tout le champ (Dossier) par rapport au même N°client a la même valeur (A) et affiche un message (« Pas terminé ») si non.
Par exemple, j’ai quatre ID (1;2;3;4) correspondants à un même N°client (1-11), mais il y a une valeur dans le champ Dossier différente, donc il affiche un message « Pas terminé ».
Merci d’avance et bien cordialement.
Khaled
Bonjour Khaled,
À votre place, je mettrais cette table « Dossiers_details » en sous-formulaire de la table « Dossiers » qui est elle-même en sous-formulaire de la table « Clients ».
La table « Dossiers » contiendrait tous les noms de dossiers et, avec les bonnes relations, lorsque vous sélectionnez le nom du dossier, vous auriez un visuel des détails effectués ou non et vous pourriez cocher une case Terminée qui se trouverait dans la table « Dossiers ».
Merci beaucoup, Madame Lydia, j’ai grandement bénéficié de vos leçons.
Cordialement.
Bonjour Lydia,
Voilà, j’ai bien profité de vos cours et astuces sur Access.
J’ai utilisé votre projet de facturation qui fonctionne à merveille.
Je voudrais l’améliorer dans la partie saisie des données concernant le détail de la facturation (ref article, désignation, prix unitaire, etc.).
Pour ce qui est de la désignation de l’article, après clic sur le champ, une liste déroulante s’ouvre pour effectuer le choix correspondant à l’article. Moi, je souhaiterais trouver l’article en question en tapant les premières lettres et effectuer un choix parmi les articles qui commencent tous par les mêmes lettres.
Comme je ne maîtrise pas encore bien Access, j’aimerais bien que vous puissiez m’orienter sur le code VBA que je dois utiliser.
Merci infiniment.
Cordiales salutations.
Bonjour Khaled,
Il n’y a pas besoin de code VBA, c’est le fonctionnement de base d’une liste déroulante sur Access.
Bonjour Madame Lydia !
S’il vous plaît, j’ai une petite question concernant ma base de données, j’ai déjà créé une requête analyse croisée qui sera par la suite la source de mon état, mais j’arrive pas à créer un filtre, j’ai déjà essayé d’écrire de message du filtre comme critère comme le cas de la requête sélection, mais ça marche pas.
Prière de m’aider et je vous remercie d’avance.
Bonjour Salma,
Avez-vous vérifié qu’Access n’attende pas une réponse numérique comme un NuméroAuto par exemple ?
Bonjour, je veux connaître la liste des commandes Access.
Bonjour,
Hormis la documentation Microsoft, il n’existe pas de « liste de commandes ».
Bonsoir,
Tout d’abord je vous remercie pour vos tutoriels, c’est vraiment intéressant.
Moi, j’ai commencé à apprendre Access avec vos tutos. Actuellement, je prépare un facturier, mais je suis bloqué sur la procédure événementielle de ID_tarif, si vous pouvez m’aider sur le code VBA.
Merci.
Bonjour,
Je vous invite à consulter le tutoriel sur la facturation Access.
Bonjour
C’est quand j’ai dû faire cette application que j’ai trouvé le problème, quand je valide le code, les points d’exclamation disparaissent.
Merci.
Bonjour,
Vous utilisez Access 2007 ? Si oui, ça ne fonctionnera pas.
Bonjour,
Je suis débutant dans Access, je ne parviens pas à sauvegarder en PDF avec la date du jour (Ex : Annexes_733 du 01/10/2020)
voici ma procédure :
Private Sub BTN_PDF_Annexe_Click()
Dim Fichier As String: Dim CheminPDF As String
Dim DC As String
Dim MyPath As String
Dim MyFilename As String
'fichier indique le chemin où l'on enregistre le doc et ensuite le nom qu'on lui applique
'DC = Me.Date_Concours
'MsgBox "date du concours" & "DC"
Fichier = Application.CurrentProject.Path & "\Annexes_733\Annexe_733 & Me.Date_Cncours.Value & .pdf"
DoCmd.OutputTo acOutputReport, "E_Annexe_733", "PDF", Fichier, True
DoCmd.Close acReport, "ReportName"
End Sub
Merci.
Bonjour,
Ça devrait plutôt être :
Fichier = Application.CurrentProject.Path & "\Annexes_733\Annexe_733 du " & Me.Date_Cncours.Value & ".pdf"
DoCmd.OutputTo acOutputReport, "E_Annexe_733", acFormatPDF, Fichier
Bonsoir Lydia, bonsoir à vous tous,
Je vous remercie pour tous les cours et les explications que vous postez sur votre chaîne YouTube, je tombe sur une erreur d’exécution « 3075 » après que j’ai formulé une requête sur un formulaire de création d’une facture, bien évidemment, j’ai créé des tables avec des relations l’une à l’autre qui sont Produits, Clients, Commandes, CommandDétails, Mouvement, Catégories, Unités de mesure, Condition de paiement, mais en formant le code :
req = "Update Commandes SET " & _ " CodeFacture = '" & CodeFct & " ' " & _ ", ModePaiement = '" & Me.txtModePaiement & " ' " & _ ", DateFacture = '" & Me.txtDateFacture & " ' " & _ ", idConditionPaiement =" & Int(Me.txtConditionPaiement.Value) & _ ", DateEcheance = " & Me.txtDateEcheance & " ' " & _ ", Status = '" & Me.txtStatus.Value & _ " WHERE IdCommande " & idcmd db.Execute (req)
Bien sûr, après une déclaration de :
Dim idcmd As Integer, idcmd = Int(Me.TxtIdCommande) If (Me.txtDateFacture "" And Me.txtModePaiement.Value "" And Me.txtConditionPaiement.Value "" And Me.txtStatus.Value "") Then
Je tombe sur l’erreur qui est comme suit : Erreur d’exécution ‘3075’ Erreur de syntaxe (Opération Absent) dans l’expression (me citant la date facture, et Statut = ‘Non Payé’.
Merci pour votre aide, bonne soirée.
Bonjour Boubekeur,
Il faudrait vérifier les types des variables de la requête SQL, car les dates doivent par exemple être entourées de #.
Bonjour,
J’ai un formulaire A contenant un sous-formulaire B. J’aimerais avoir une procédure pour l’interception de toute insertion d’un nouvel enregistrement dans mon sous-formulaire B.
Cdt.
Bonjour,
Qu’entendez-vous par interception ? Vous voulez savoir quel évènement est provoqué par l’insertion dans un sous-formulaire ?
Salut, j’ai exactement fait la même chose, ça marche très bien, mais le problème est qu’après l’exportation, l’état en mode aperçu avant impression n’affiche que le dernier enregistrement et pas moyen de revenir en arrière. S’il vous plaît, besoin d’aide et merci d’avance.
Bonjour,
Quel code avez-vous utilisé ?
Bonjour, c’est ce code-là :
Fichier = Application.CurrentProject.Path & "\Annexes_733\Annexe_733 du " & Me.Date_Cncours.Value & ".pdf"
DoCmd.OutputTo acOutputReport, "E_Annexe_733", acFormatPDF, Fichier
Dans les boutons de navigation de l’état, il n’y a qu’une page ? La source de votre état ne serait-elle pas basée sur un seul enregistrement ?
Euh non, il y a plusieurs enregistrements. Dans le fichier PDF exporté, ils y sont tous.
Avez-vous utilisé les boutons de navigation dans l’aperçu ?
Impossible, ils sont tous grisés. Mais je crois que je vais me contenter des PDF exportés. Merci.
Bonjour Lydia, merci de partager vos connaissances.
Je tente de monter une application de gestion de dossiers pour mon bureau. Un dossier représente beaucoup d’informations. Je cherche comment je peux fragmenter un « dossier » pour ensuite créer un formulaire qui rassemble tous les volets fragmentés dans des tables différentes : tblMandant, tblClient, tblGaranties, tblExpertise, tblEvaluation, etc… Est-il possible de faire cela ? Sinon, je cesserai de chercher pour rien.
Merci.
Bonjour Dyonis,
Je ne comprends pas très bien votre question. Une base de données bien structurée doit être bien « compartimentée » au niveau des données qu’elle traite (vous ne mélangerez pas, dans la même table, les mandants et les clients par exemple). Ensuite, il est tout à fait possible d’avoir toutes les informations qui concernent un mandant par exemple dans un même formulaire (en utilisant des sous-formulaires) du moment que sa clé primaire est reliée à sa clé étrangère dans les autres tables, mais je ne sais pas si c’est de ça dont vous parlez.
Merci pour votre réponse Lydia. J’ai en fait des notions sur la mise en forme des tables, requêtes et formulaires. De ce côté, ça va. Maintenant que ces bases sont assimilées, je m’attaque justement à la structure et aux liaisons des tables de la base de données. J’ai recherché comment interagissent les tables entre elles lorsqu’il y a une liaison via les clés primaires et étrangères. Dans la totalité des tutos que j’ai consultés, il n’y a que des exemples avec 2 tables du genre « clients » et « commandes ». Comme cela n’implique qu’un formulaire et un sous-formulaire, c’est relativement simple et cela fonctionne à merveille. Toutefois, en faisant des tests pour mon projet, quand j’essaie d’appliquer le principe à plusieurs tables thématiques, je n’y arrive pas. Ma question visait à me convaincre de la faisabilité du projet et que je ne perdais pas mon temps pour rien. Votre réponse me rassure. Je vais donc continuer mes recherches. Félicitations pour la qualité de vos tutos. C’est bien présenté et clair tout en étant ludique et agréable. Merci.
Merci Dyonis 😉
Bonjour
Sur un formulaire comportant un sous-formulaire, j’ai intégré une case à cocher qui varie en fonction d’un renseignement de champ. Cette case à cocher verrouillée, appelée « verrou » dans mon formulaire, doit bloquer la modification de tout le formulaire. Toutefois, j’aimerais que le champ « modifiable120 », qui me sert à afficher les différents enregistrements de la table reste modifiable. Actuellement, si verrou est coché, tout le formulaire est figé.
Voici mon code :
Private Sub Form_Current()
GRey = RGB(214, 220, 229)
If Forms![BL]![verrou] = False Then
Me.AllowEdits = True
Else
Me.AllowEdits = False
Me.controls("modifiable120").AllowEdit = True
Me.controls("N°Contact").BackColor = GRey
Me.controls("Numero Bulletin").BackColor = GRey
Me.controls("date BV").BackColor = GRey
End If
End Sub
Encore merci pour votre coup de main, je ne connais presque rien au VBA et, là, je galère.
Bonjour,
J’ai eu la même problématique pour un client récemment et il me semble qu’il n’était pas possible de débloquer au cas par cas. Du coup, il faut bloquer un à un.
J’ai commencé par empêcher l’ajout et la suppression par :
Forms![Nom_du_formulaire].AllowAdditions = False
Forms![Nom_du_formulaire].AllowDeletions = False
Mais, ensuite, pour tout le reste, j’ai dû désigner chaque contrôle :
Forms![Nom_du_formulaire].Nom_du_champ.Locked = True
C’est long s’il y a beaucoup de champs, mais je n’ai pas trouvé autre chose.
Bonjour,
J’ai créé un formulaire de recherche dans Access.
Voici le code inséré dans le bouton de commande pour valider les critères de recherche :
Option Compare Database
Private Sub cmdfiltre_Click()
f = ""
If Not IsNull(Me.Rtitre) And Me.Rtitre "" Then
f = "titre LIKE ""*" & Me.Rtitre & "*"""
End If
If Not IsNull(Me.Rauteur) And Me.Rauteur "" Then
If f "" Then
f = f & " AND auteur = """ & Me.Rauteur & """"
Else
f = "auteur = """ & Me.Rauteur & """"
End If
End If
If Not IsNull(Me.Rdesc) And Me.Rdesc "" Then
If f "" Then
f = f & " AND Description LIKE ""*" & Me.Rdesc & "*"""
Else
f = "Description LIKE ""*" & Me.Rdesc & "*"""
End If
End If
If Not IsNull(Me.Rdate1) And Me.Rdate1 "" And Not IsNull(Me.Rdate2) And Me.Rdate2 "" Then
If f "" Then
f = f & " AND clng([date stock]) BETWEEN " & CLng(Me.Rdate1) & " AND " & CLng(Me.Rdate2) & ""
Else
f = "clng([date stock]) BETWEEN " & CLng(Me.Rdate1) & " AND " & CLng(Me.Rdate2) & ""
End If
End If
Me.Filter = f
Me.FilterOn = True
End Sub
Le souci c’est que, quand je renseigne les dates de début et de fin, ça met débogage.
Aidez-moi s’il vous plaît.
Bonjour,
Quel est le message d’erreur ?
Bonsoir Lydia ! S’il vous plaît, moi, j’aimerais lire un son à l’ouverture de ma base de données, mais j’ignore le code que je dois utiliser. Si vous pouviez m’aider.
Bonjour Soro,
Voici un lien.
Bonjour, je voudrais ajouter un commercial en envoi automatique.
1 cela passe bien, j’ai ajouté les lignes 7, 8 et 9, cela ne fonctionne plus.
Private Sub essai_Click()
On Error GoTo Err_essai_Click
Dim repre As String
If Me.rep = "49" Then
Else: repre = ""
repre = "commercial1@tata.fr"
ElseIf Me.rep = "85" Then
repre = "commercial2@tata.fr"
Else: repre = ""
End If
DoCmd.SendObject acSendReport, "IMPDEV", acFormatRTF, Me.mail, repre, , "OFFRE DE PRIX", "Bonjour," & Chr(10) & Chr(10) & "Commentaire:" & Chr(10) & Chr(10) & "Cordialement." & Chr(10) & Chr(10) & "L'équipe commerciale.", , True
Exit_essai_Click:
Exit Sub
Err_essai_Click:
MsgBox Err.Description
Resume Exit_essai_Click
End Sub
Bonjour,
Je pense que c’est votre condition If qui ne va pas.
Après
If Me.rep = "49"
, vous mettez Else donc Access ne va pas vérifier si rep = 85.