Académique Documents
Professionnel Documents
Culture Documents
Voici un petit exercice facile à réaliser sur Acces. Il devrait vous permettre de
comprendre tout l'avantage de considérer les formulaires Access comme des classes. Bon
apprentissage.
La multiplication du formulaire Access par Maxence HUBICHE
I - Le résultat............................................................................................................................................................... 3
I-1 - De quoi vous avez besoin............................................................................................................................. 3
I-2 - A quoi cela va servir...................................................................................................................................... 3
II - Le formulaire Access............................................................................................................................................. 4
II-1 - Propriétés du formulaire Access................................................................................................................... 4
III - Le code................................................................................................................................................................. 5
III-1 - Les concepts utiles.......................................................................................................................................5
III-1-a - Notions de base sur les classe........................................................................................................... 5
III-1-b - Les variables - Portée, Type et Durée de vie..................................................................................... 6
III-1-c - Rappels sur la classe Collection......................................................................................................... 7
III-2 - Le code de base.......................................................................................................................................... 7
III-2-a - Les déclarations...................................................................................................................................7
III-2-b - Les fonctions utiles.............................................................................................................................. 8
III-2-b-i - Réinitialisation de la collection..................................................................................................... 8
III-2-b-ii - Récupération du nombre de subalternes.................................................................................... 8
III-2-b-iii - Création d'un nouvel objet formulaire.........................................................................................9
III-2-c - Sur activation d'un enregistrement.................................................................................................... 10
III-2-d - Sur clic du bouton cmdFermer.......................................................................................................... 10
III-2-e - Sur clic du bouton cmdResponsable.................................................................................................10
III-2-f - Sur clic du bouton cmdSubalternes....................................................................................................11
III-3 - Le code complet.........................................................................................................................................11
IV - Téléchargement.................................................................................................................................................. 16
-2-
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
I - Le résultat
Pour réaliser notre objectif, il vous faut un formulaire Access, et la table 'Employés' que vous trouverez dans la base
'comptoir.mdb', sur votre poste de travail (installée avec Access)
Rien d'autre... et pourtant, vous allez pouvoir afficher une grande quantité de formulaires.
L'objet de cet exercice est de construire un formulaire Access permettant la visualisation d'un employé, et d'ouvrir
autant de formulaires Access identiques que de subalternes. Vous devriez également, à partir du même formulaire,
pouvoir afficher le responsable de ce même employé... s'il en a un !
Pour parvenir à ce résultat, il va falloir réussir à concevoir le formulaire comme un module de classe, et non comme
un objet, ce qui n'est pas exact.
Cela nécessitera un petit passage par l'explication de la notion de module de classe. Explication rapide, car, il n'y a
pas lieu de faire tout un article à ce sujet dans ce chapitre.
-3-
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
II - Le formulaire Access
Il suffit de créer un formulaire Access, basé sur la table employé. Ici, je n'ai gardé que quelques champs. Mais rien
ne vous empêche de tous les mettre.
Commençons par configurer correctement notre formulaire Access, que nous enregistrerons sous ce nom :
frmEmployes_Responsables. Affichez les propriétés du formulaire Access, et définissez-les comme suit :
-4-
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
III - Le code
Puisque nous cherchons, en VBA, à nous rapprocher de la notion physique de l'objet, partons d'un exemple physique
très connu : le téléphone portable...
Cet objet (élément que nous manipulons) a des caractéristiques (que nous appelerons propriétés) qui sont,
systématiquement des valeurs. Il est également possible d'exercer des actions sur l'objet (ces 'actions' sont les
méthodes). Enfin, un évènement peut toujours survenir, évènement que nous pourrons intercepter pour déclencher
une action que nous programmerons (lorsqu'on reçoit un appel, on peut déclencher une sonnerie différente en
fonction du carnet dans lequel se trouve le numéro appelant, par exemple).
La classe correspond au 'plan', au 'cahier des charges' qui permet la réalisation de cet objet, ainsi que de tous ceux
qui sont construits en suivant les principes qu'il décrit.
Régulièrement, nous créons des objets, issus des classes. En voici un exemple très simple:
Vous noterez à travers cet exemple, que vous ne manipulez pas 'Recordset' qui est la classe, le modèle de tous
les recordsets, mais l'objet recordset représenté par la variable rstClient. Il en est de même dans la vie courante :
-5-
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
pour téléphoner, vous n'utilisez pas le cahier des charges, mais bien le téléphone qui a été créé d'après le cahier
des charges.
Prenons l'exemple d'un formulaire Access. Il a des propriétés qui sont définies, que vous pouvez modifier. il
y a également des évènements que vous pouvez intercepter pour programmer les actions que vous souhaitez
entreprendre lorsque cet évènement ce produit. Nous sommes donc bien en présence d'une classe, qui permet la
génération d'un nouvel objet dès que vous l'ouvrez.
Voilà une partie que tout le monde devrait connaître, mais un petit rappel est peut-être utile... alors, allons-y.
Premièrement, le concept de base de la déclaration d'une variable :
NomDuType :Comme son nom l'indique, il s'agit du nom du type de la variable. Une variable de donnée aura un type
de données (String, Byte, Integer, Long, Single, Double, Decimal, Currency, Date, Boolean), alors qu'une variable de
type objet recevra un nom de classe (Workspace, Database, Recordset, Field, Form, Report, ...)
{Dim|Private|Public|Static} : suivant le terme que vous utiliserez, et l'endroit où vous l'inscrirez, différents éléments
seront affectés : la portée et la durée de vie. De quoi s'agit-il ?
La Portée : Cela correspond à la 'visibilité' de la variable, à son accessibilité. Si je souhaite qu'une variable ne soit
accessible qu'à l'intérieur d'une procédure, et qu'une autre soit partagée entre plusieurs procédures, elles auront des
portées différentes. On distingue essentiellement 4 portées : Publique, Projet, Module et Procédure.
La Durée de Vie : Cette information permet de savoir pendant combien de temps on a accès à la valeur contenue dans
la variable. On pourrait ainsi décider qu'une fois qu'une procédure est terminée, une variable doit être réinitialisée, et
qu'une autre doit conserver sa valeur jusqu'au prochain appel de la procédure. Ces 2 variables ont donc des durées
de vie différentes.
Une variable déclarée avec Dim en tête de module sera interrogeable/modifiable uniquement par une procédure du
module où elle est déclarée, et sera disponible aussi longtemps que le sera le projet (que la base sera ouverte). Elle
sera par contre invisible pour toutes les procédures issues d'autres modules (au sens large du terme, soit 'module
standard', 'module de classe', 'module de classe formulaire', 'module de classe état', ...)
-6-
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
La bibliothèque VBA (Outils/Références...) que vous pourrez parcourir grâce à l'explorateur d'objets (F2), contient
quelques classes, sont une classe 'Collection'. Cette classe permet d'accéder à des objets conteneurs, susceptible
de regrouper et gérer maints élements distincts, le tout avec seulement quatre méthodes :
-7-
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
Const SQL1 As String = "SELECT E.[N° employé], Count(S.[N° employé]) AS NB FROM Employés" &
_
"AS E LEFT JOIN Employés AS S ON E.[N° employé] = S.[Rend compte à]
" & _
"WHERE (((E.[Rend compte à])="
Const SQL2 As String = " GROUP BY E.[N° employé];"
'Nom de l'application
Const APPNAME As String = "Form - Module de classe"
Finprog:
On Error Resume Next
Exit Function
GestErr:
MsgBox "Une erreur (N° " & Err.Number & " - " & Err.Description & _
") a eu lieu de manière inattendue dans la procédure GetNewForm " & _
"du module Document VBA Form_frmEmployes_Responsables", vbCritical, _
"ERREUR INATTENDUE"
Resume Finprog
End Function
'Réinitialisation du recordset
Set rstSubalternes = Nothing
-8-
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
'S'il y a un n° employé
If Nz(Me.N°_employé, "") = "" Then
nbSubalternes = 0
Else
'Recréer la liste des employés subalternes
Set rstSubalternes = CurrentDb.OpenRecordset(SQL1 & Me.N°_employé & SQL2, dbOpenSnapshot)
'Si aucun employé n'a été trouvé
If rstSubalternes.EOF Then
'Renvoyer 0
nbSubalternes = 0
Else
'Sinon, renvoyer le nombre d'enregistrement de la liste.
rstSubalternes.MoveLast
nbSubalternes = rstSubalternes.RecordCount
End If
End If
Finprog:
On Error Resume Next
Exit Function
GestErr:
MsgBox "Une erreur (N° " & Err.Number & " - " & Err.Description & _
") a eu lieu de manière inattendue dans la procédure GetNewForm " & _
"du module Document VBA Form_frmEmployes_Responsables", vbCritical, _
"ERREUR INATTENDUE"
Resume Finprog
End Function
Finprog:
On Error Resume Next
-9-
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
Exit Function
GestErr:
MsgBox "Une erreur (N° " & Err.Number & " - " & Err.Description & _
") a eu lieu de manière inattendue dans la procédure GetNewForm " & _
"du module Document VBA Form_frmEmployes_Responsables", vbCritical, _
"ERREUR INATTENDUE"
Resume Finprog
End Function
Finprog:
On Error Resume Next
Exit Sub
GestErr:
MsgBox "Une erreur (N° " & Err.Number & " - " & Err.Description & _
") a eu lieu de manière inattendue dans la procédure GetNewForm " & _
"du module Document VBA Form_frmEmployes_Responsables", vbCritical, _
"ERREUR INATTENDUE"
Resume Finprog
End Sub
Set frmResp = GetNewForm("Responsable de " & Me.Prénom & " " & Me.Nom, Me.Rend_compte_à,
mhTypeEmplResponsable)
Finprog:
- 10 -
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
Finprog:
On Error Resume Next
Exit Sub
GestErr:
MsgBox "Une erreur (N° " & Err.Number & " - " & Err.Description & _
") a eu lieu de manière inattendue dans la procédure GetNewForm " & _
"du module Document VBA Form_frmEmployes_Responsables", vbCritical, _
"ERREUR INATTENDUE"
Resume Finprog
End Sub
'---------------------------------------------------------------------------------------
' Module : Form_frmEmployes_Responsables
' Créé le : samedi 16 oct 2004 15:14
' Auteur : Maxence
' Objet : Code exemple pour l'article sur la multiplication des formulaires.
'
' Licence : Vous pouvez utiliser tout ou partie de ce code à la condition de prendre
' soin de notifier son origine (http://mhubiche.developpez.com) et son auteur
' (Maxence Hubiche). Merci !
'---------------------------------------------------------------------------------------
Option Compare Database
Option Explicit
'===== VARIABLES (Portée Module)
'Variable pour l'objet formulaire du responsable de l'employé
Private frmResp As Form_frmEmployes_Responsables
'Variable pour l'objet collection regroupant les formulaires subalternes
Private colSubs As New Collection
- 11 -
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
Const SQL1 As String = "SELECT E.[N° employé], Count(S.[N° employé]) AS NB FROM Employés" &
_
"AS E LEFT JOIN Employés AS S ON E.[N° employé] = S.[Rend compte à]
" & _
"WHERE (((E.[Rend compte à])="
Const SQL2 As String = ")) GROUP BY E.[N° employé];"
'Nom de l'application
Const APPNAME As String = "Form - Module de classe"
Set frmResp = GetNewForm("Responsable de " & Me.Prénom & " " & Me.Nom, Me.Rend_compte_à,
mhTypeEmplResponsable)
Finprog:
On Error Resume Next
Exit Sub
GestErr:
MsgBox "Une erreur (N° " & Err.Number & " - " & Err.Description & _
") a eu lieu de manière inattendue dans la procédure GetNewForm " & _
"du module Document VBA Form_frmEmployes_Responsables", vbCritical, _
"ERREUR INATTENDUE"
Resume Finprog
End Sub
Set rs = CurrentDb.OpenRecordset("SELECT [N° Employé] FROM Employés WHERE [Rend Compte à]=" &
Me.N°_employé, dbOpenSnapshot)
ClearCol
Do Until rs.EOF
colSubs.Add GetNewForm("Subalterne de " & Me.Prénom & " " & Me.Nom, rs(0),
mhTypeEmplSubalterne)
rs.MoveNext
Loop
Finprog:
On Error Resume Next
Exit Sub
GestErr:
- 12 -
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
MsgBox "Une erreur (N° " & Err.Number & " - " & Err.Description & _
") a eu lieu de manière inattendue dans la procédure GetNewForm " & _
"du module Document VBA Form_frmEmployes_Responsables", vbCritical, _
"ERREUR INATTENDUE"
Resume Finprog
End Sub
Finprog:
On Error Resume Next
Exit Sub
GestErr:
MsgBox "Une erreur (N° " & Err.Number & " - " & Err.Description & _
") a eu lieu de manière inattendue dans la procédure GetNewForm " & _
"du module Document VBA Form_frmEmployes_Responsables", vbCritical, _
"ERREUR INATTENDUE"
Resume Finprog
End Sub
'Réinitialisation du recordset
Set rstSubalternes = Nothing
'S'il y a un n° employé
If Nz(Me.N°_employé, "") = "" Then
nbSubalternes = 0
Else
'Recréer la liste des employés subalternes
Set rstSubalternes = CurrentDb.OpenRecordset(SQL1 & Me.N°_employé & SQL2, dbOpenSnapshot)
'Si aucun employé n'a été trouvé
If rstSubalternes.EOF Then
'Renvoyer 0
nbSubalternes = 0
Else
'Sinon, renvoyer le nombre d'enregistrement de la liste.
rstSubalternes.MoveLast
nbSubalternes = rstSubalternes.RecordCount
End If
End If
Finprog:
On Error Resume Next
Exit Function
GestErr:
- 13 -
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
MsgBox "Une erreur (N° " & Err.Number & " - " & Err.Description & _
") a eu lieu de manière inattendue dans la procédure GetNewForm " & _
"du module Document VBA Form_frmEmployes_Responsables", vbCritical, _
"ERREUR INATTENDUE"
Resume Finprog
End Function
Finprog:
On Error Resume Next
Exit Function
GestErr:
MsgBox "Une erreur (N° " & Err.Number & " - " & Err.Description & _
") a eu lieu de manière inattendue dans la procédure GetNewForm " & _
"du module Document VBA Form_frmEmployes_Responsables", vbCritical, _
"ERREUR INATTENDUE"
Resume Finprog
End Function
- 14 -
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
Next
End If
Finprog:
On Error Resume Next
Exit Function
GestErr:
MsgBox "Une erreur (N° " & Err.Number & " - " & Err.Description & _
") a eu lieu de manière inattendue dans la procédure GetNewForm " & _
"du module Document VBA Form_frmEmployes_Responsables", vbCritical, _
"ERREUR INATTENDUE"
Resume Finprog
End Function
- 15 -
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
IV - Téléchargement
- 16 -
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/
La multiplication du formulaire Access par Maxence HUBICHE
1 : je ne traite ici que des cas décrits dans la déclaration type donnée dans le cours. Je
n'aborde pas la déclaration en Friend...
- 17 -
Copyright ® 15/10/2004 Maxence Hubiche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
https://mhubiche.developpez.com/Access/classes/formulaires/