Les meilleures sources Access

Les meilleures sources AccessConsultez toutes les sources
Nombre d'auteurs : 44, nombre de sources : 147, création le 19 mars 2013
Sommaire→Divers→Assistance au développement- Définir la propriété "texte de barre d'état" pour chaque contrôle des formulaires d'une application.
- Lister les tables et les champs d'une base de données
- Obtenir la propriété (ici "Description") d'un champ de table
- Réaliser un dictionnaire de données
- Recherche de chaîne dans les requêtes stockées
- Sauvegarder l'ensemble des requêtes dans un fichier texte
- Tester la performance des PC
- Tracer le temps d'execution de votre code
- Créer un timer sans formulaire
Versions : 2000 et supérieures
Parfois certaines propriétés comme le texte de barre d'état sont fastidieuses à mettre à jour. Cette procédure permet de passer en revue tous les formulaires d'une application afin de mettre à jour la propriété StatusBarText des contrôles concernés. La valeur proposée par défaut correspond au nom du contrôle.
Pour utiliser cette procédure, copiez la dans un module. Puis, toujours dans VBE, affichez la fenêtre exécution (ctrl+G).
Dans cette fenêtre, tapez :
sStatusBarTextCode à placer dans le module :
Sub sStatusBarText()
Dim obj As AccessObject
Dim frm As Form
Dim ctl As Control
Dim prp As Property
For Each obj In Application.CurrentProject.AllForms
'Demande confirmation pour le formulaire en question
Select Case MsgBox(Formulaire : " & obj.Name, vbQuestion + vbYesNoCancel)
'si OUI
Case vbYes
'Ouvre le formulaire en mode création
DoCmd.OpenForm obj.Name, acDesign
Set frm = Forms(obj.Name)
'Applique le propriété à chaque controle
For Each ctl In frm.Controls
For Each prp In ctl.Properties
If prp.Name = "StatusBarText" Then
prp = InputBox(ctl.Name & " :", frm.Name & " - StatusBarText", _
IIf(prp = "", ctl.Name, prp))
Exit For
End If
Next prp
Next ctl
'Enregistre et ferme le formulaire
DoCmd.Close acForm, obj.Name, acSaveYes
'Si annuler alors, quitter le traitement
Case vbCancel
Exit Sub
End Select
Next obj
set variable = nothing
End SubVersions : 2000 et supérieures
Ce code permet de lister l'ensemble des tables et des champs d'une base de données. Le résultat est envoyé dans un treeview ce qui permet d'avoir une vue globale des propriétés de l'ensemble des champs de la base de données.
Private Sub Commande1_Click()
'Gestion d'erreur
On Error Resume Next
'Declaration des variables
Dim Pere As String
Dim T As DAO.TableDef
Dim F As DAO.Field
Dim P As DAO.Property
Dim DB As DAO.Database
'Vide le treeview
TreeView0.Nodes.Clear
'Liste les tables
For Each T In DB.TableDefs
'Verifie si c'est une table système
If T.Attributes = 0 Or (T.Attributes <> 0 And Me.chk_systeme) Then
TreeView0.Nodes.Add , , T.Name, T.Name
'Liste les champs
For Each F In T.Fields
Pere = T.Name
TreeView0.Nodes.Add Pere, tvwChild, Pere & "#" & _
F.Name, F.Name
Pere = Pere & "#" & F.Name
'Liste les propriétés
For Each P In F.Properties
TreeView0.Nodes.Add Pere, tvwChild, Pere & F.Name & _
"#" & P.Name, P.Name & " : " & LireProperty(F, P.Name)
Next P
Next F
End If
Next T
End Sub
'Cette fonction renvoit le type d'un champ en français
'en fonction de son type en numérique
Private Function Renvoi_Type(ByVal n As Integer) As String
Dim s As String
Select Case n
Case dbBoolean
s = "Oui/Non"
Case dbByte
s = "Octet"
Case dbInteger
s = "Entier"
Case dbLong
s = "Entier long"
Case dbCurrency
s = "Monétaire"
Case dbSingle
s = "Réel S"
Case dbDouble
s = "Réel D"
Case dbDate
s = "Date"
Case dbBinary
s = "Binaire"
Case dbText, dbChar
s = "Texte"
Case dbLongBinary, dbVarBinary
s = "Binaire 2"
Case dbMemo
s = "Mémo"
Case dbGUID
s = "GUID"
Case dbBigInt
s = "Numérique HP"
Case dbNumeric
s = "Numérique"
Case dbDecimal
s = "Décimal"
Case dbFloat
s = "Flottant"
Case dbTime, dbTimeStamp
s = "Heure"
End Select
Renvoi_Type = s
End Function
'Cette fonction permet de lire une propriété
'Et de gerer les erreurs de lecture.
Private Function LireProperty(Objet As Object, _
Propriete As String) As String
'Gere les erreurs
On Error GoTo err
'Si l'objet est un champ et que la propriété est type
'alors convertit la valeur en français
If TypeOf Objet Is DAO.Field And Propriete = "Type" Then
LireProperty = Renvoi_Type(Objet.Properties(Propriete))
Else
LireProperty = Objet.Properties(Propriete)
End If
err:
End Function
Private Sub Commande12_Click()
DoCmd.Close
End Sub
Private Sub Form_Load()
Me.chk_systeme = True
End SubLe processus est en fait très simple. Il s'agit de lire chaque table puis pour chaque table, accéder à chacun des champs et enfin, pour chaque champ, lire une à une les propriétés. La fonction renvoi_type permet d'afficher une valeur explicite du type du champ et non un numérique. Quant à la fonction lirePropriete, elle permet d'accéder à la valeur d'une propriété et ne pas faire boguer le programme principal si la propriété est inaccessible.
N'hésitez surtout pas à télécharger la base de données exemple en fichier Zip. Elle vous permet, en plus, de sélectionner une autre base de données que celle en cours d'utilisation.
Versions : Toutes
Ce code permet d'obtenir la description du champ passé en paramètre. Toutefois, pour que cela fonctionne, vous devez ajouter la référence Microsoft DAO Object Library à votre projet.
Attention !
Il semble que la propriété "Description" n'existe pas par défaut en DAO.
Le fait d'exploiter cette fonction alors que la propriété (passée en paramètre) n'existe pas, va provoquer l'erreur 3270 (Propriété inexistante).
Dans cet exemple, la propriété est créée s'il elle n'existe pas et si le paramètre "CreateIt" est égal à True.
Vous pouvez modifier ou adapter la fonction fnctGetFieldDescription selon vos besoins...
Dans un module, copiez la fonction suivante :
Function fnctGetFieldDescription(ByVal WhatTable As String, _
ByVal WhatField As String, Optional ByVal PropertyName As _
String ="Description", Optional ByVal CreateIt As Boolean = False)
Dim oDB As DAO.Database
Dim oTBL As DAO.TableDef
Dim oField As DAO.Field
Dim oPRP As DAO.Property
Dim strDescription As String
On Error GoTo L_Err_FieldDescription
strDescription = vbNullString
Set oDB = CurrentDb
Set oTBL = oDB.TableDefs(WhatTable)
Set oField = oTBL.Fields(WhatField)
strDescription = oField.Properties(PropertyName)
L_Ex_FieldDescription:
Set oDB = Nothing
Set oTBL = Nothing
Set oPRP = Nothing
Set oField = Nothing
fnctGetFieldDescription = strDescription
Exit Function
L_Err_FieldDescription:
If Err = 3270 Then
If CreateIt Then
Set oPRP = oField.CreateProperty(PropertyName, dbText, _
"Nouvelle description")
oField.Properties.Append oPRP
MsgBox "La propriété '" & PropertyName & "' a été ajoutée au champ " & _
WhatField & "...", 48, "Propriété ajoutée à la collection"
End If
Else
MsgBox "Impossible d'avoir des information sur le champ '" & WhatField & _
"' !" & vbCrLf & Err.Description, 48, "Erreur"
End If
Resume L_Ex_FieldDescription
End FunctionExemple d'utilisation:
Sub ObtenirDescription()
Dim strMaTable As String
Dim strMonChamp As String
Dim strMaPropriete As String
strMaTable = "TBLClients"
strMonChamp = "ProvenanceContact"
strMaPropriete = "Description"
Debug.Print fnctGetFieldDescription(strMaTable, strMonChamp, strMaPropriete)
End SubNb :
Normalement, la case à cocher "Arrêt sur toutes les erreurs" n'est pas censée être cochée car par défaut, c'est la case à cocher "Arrêt sur les erreurs non gérées" qui l'est. Veillez à ce que vos options en VBA soient ainsi déclarées si un bug se présentait. Merci à CRUSOE13 pour cette remarque intéressante.
Versions : Access 2000 et supérieures
Parfois, lorsque vous reprennez le projet d'un autre développeur, vous avez besoin de réaliser le dictionnaire des données de la base afin d'avoir sous les yeux l'ensemble des champs (attributs) utilisés.
Cet exemple de code utilise la librairie Microsoft DAO (il vous faut donc ajouter cette référence) afin de parcourir la structure du fichier mdb.
L'ensemble du résultat est envoyé vers une table nommée Tbl_Dictionnaire que le module se chargera de créer si celle-ci n'existe pas.
Elle se compose des champs suivants :
- Table : Nom de la table
- Attribut : Nom du champ (attribut)
- TypeAttribut : Type du champ
- RegleGestion : Règle de gestion appliquée à la propriété Valide Si du champ
Le module dispose de trois fonctions utilitaires :
La première permet de tester l'existence d'une table :
'Fonction qui teste l'existence d'une table
Private Function TableExiste(strNom As String, _
oDb As DAO.Database) As Boolean
'Gestion d'erreur : En cas d'erreur, aller à l'étiquette
'err (càd retouner Faux)
On Error GoTo err
Dim oTbl As DAO.TableDef
'Tente d'accéder à la table
Set oTbl = oDb.TableDefs(strNom)
'Retourne Vrai
TableExiste = True
Set oTbl = Nothing
err:
End FunctionLa seconde permet de traduire la propriété Type des champs DAO (Field) en texte :
'Fonction qui retourne le type du champ en français
Private Function TypeFr(intType As Integer) As String
Select Case intType
Case dbText, dbMemo: TypeFr = "Texte"
Case dbBoolean: TypeFr = "Booléen"
Case dbDate, dbTime, dbTimeStamp: TypeFr = "Date"
Case Else: TypeFr = "Numérique"
End Select
End FunctionEnfin la dernière permet de mettre en forme du texte afin de pouvoir l'exécuter dans une requête. Elle encadre ainsi la chaine passée en paramètre par des guillemets et double ceux figurant à l'intérieur.
'Fonction qui rend les chaînes de caractères valides dans les requêtes
Private Function MAJTexte(strChaine As String) As String
MAJTexte = Chr(34) & Replace(strChaine, Chr(34), Chr(34), , _
, vbTextCompare) & Chr(34)
End FunctionLes procédures du dictionnaire sont les suivantes :
'Procédure qui crée la table du dictionnaire
Private Sub CreerTableDico(oDb As DAO.Database)
Dim oTbl As DAO.TableDef
Dim oFld As DAO.Field
'Si la table n'existe pas alors
If Not TableExiste(NOMTABLEDICO, oDb) Then
'Crée la table
Set oTbl = oDb.CreateTableDef(NOMTABLEDICO)
'Ajoute les champs
With oTbl
.Fields.Append .CreateField(NOMCHAMPTABLE, dbText, 255)
.Fields.Append .CreateField(NOMCHAMPATTRIBUT, dbText, 255)
.Fields.Append .CreateField(NOMCHAMPTYPE, dbText, 15)
Set oFld = .CreateField(NOMCHAMPRG, dbText, 255)
'Autorise les chaines vide pour les règles de gestion
oFld.AllowZeroLength = True
.Fields.Append oFld
End With
'Ajoute la table à la base de données
oDb.TableDefs.Append oTbl
Else
'Sinon vide la table
oDb.Execute "DELETE FROM " & NOMTABLEDICO
End If
End SubCreerTableDico crée la table du dictionnaire où seront stockés les résultats. Dans le cas où la table existe déjà, elle se contente alors simplement de vider son contenu.
La procédure principale est alors la suivante :
'Procédure principale
Public Sub EnrichirDico()
Dim oDb As DAO.Database
Dim oTbl As DAO.TableDef
Dim oFld As DAO.Field
Set oDb = CurrentDb
'Lance la création de la table dico si besoin
CreerTableDico oDb
'Explore chaque table
For Each oTbl In oDb.TableDefs
'Si la table n'est pas système et différente de la table dico
If (oTbl.Attributes And dbSystemObject) = 0 And oTbl.Name <> NOMTABLEDICO Then
'Alors explore chaque champ
For Each oFld In oTbl.Fields
'Enrichit la table du dictionnaire
oDb.Execute "INSERT INTO " & NOMTABLEDICO & " VALUES (" & _
MAJTexte(oTbl.Name) & "," & _
MAJTexte(oFld.Name) & "," & _
MAJTexte(TypeFr(oFld.Type)) & "," & _
MAJTexte(oFld.ValidationRule) & ")"
Next oFld
End If
Next oTbl
'libère les objets
Set oFld = Nothing
Set oTbl = Nothing
Set oDb = Nothing
End SubN'hésitez pas à télecharger le fichier zip afin de visualiser le résultat ainsi qu'un exemple d'état possible.
Versions : 97 et supérieures
Cet exemple recherche des chaînes de caractères contenues dans les requêtes stockées de la base courante et retourne une collection d'objets Querydef des requêtes correspondantes.
Pour que ce code fonctionne vous devez ajouter la référence Microsoft DAO Object Library à votre projet.
Dans un module, placez le code suivant :
'------------------------------
'Recherche la chaîne valueToFind dans les requêtes
'stockées de la base courante
'Retourne une collection d'objet querydef trouvés.
'------------------------------
'Parametres :
' valueToFind : chaine à rechercher dans les requêtes
' QueryFilterName : s'il est fixé, le nom de requête
'doit contenir cette chaîne pour être pris en compte
'------------------------------
Public Function searchInQueryDefs(ByVal valueToFind As String, _
Optional ByVal QueryFilterName As String) As Collection
Dim qryCurrent As DAO.QueryDef
Dim Db as DAO.Database
Dim colQueries As New Collection
On Error GoTo ErreursearchInQueryDefs
'Instancie un objet Database correspondant à la base courante
Set Db=CurrentDb
'Pour chaque requête de la base, recherche la chaine
For Each qryCurrent In Db.QueryDefs
If QueryFilterName = "" Or _
(InStr(qryCurrent.Name, QueryFilterName) > 0) Then
If Nz(InStr(qryCurrent.SQL, valueToFind), 0) > 0 Then
colQueries.Add qryCurrent
End If
End If
Next
Set searchInQueryDefs = colQueries
FinsearchInQueryDefs:
Exit Function
ErreursearchInQueryDefs:
MsgBox Err.Number & Err.Description, vbExclamation, _
Application.CurrentProject.Name
Resume FinsearchInQueryDefs
End FunctionMode d'utilisation :
Vous prenez un projet en cours où règne la pagaille ou bien vous êtes un peu perdu dans votre propre projet. Vous ne savez plus par qui cette table est modifée ou vous cherchez à savoir dans quelles requêtes des tables sont utilisées...
Sub TesterExemple()
Dim qryCurrent As QueryDef
For Each qryCurrent In searchInQueryDefs("Clients", "Factures")
Debug.Print qryCurrent.Name
Debug.Print qryCurrent.SQL
Next
End SubRésultat obtenu dans la fenêtre de débogage :
Factures
SELECT DISTINCTROW [Commandes].[Destinataire], [Commandes].[Adresse livraison],
[Commandes].[Ville livraison], [Commandes].[Région livraison],
[Commandes].[Code postal livraison], [Commandes].[Pays livraison],
[Commandes].[Code client], [Clients].[Société], [Clients].[Adresse],
[Clients].[Ville], [Clients].[Région], [Clients].[Code postal],
[Clients].[Pays], [Prénom] & " " & [Nom] AS Vendeur, [Commandes].[N° commande],
[Commandes].[Date commande], [Commandes].[À livrer avant],
[Commandes].[Date envoi], [Messagers].[Nom du messager],
[Détails commandes].[Réf produit], [Produits].[Nom du produit],
[Détails commandes].[Prix unitaire], [Détails commandes].[Quantité],
FROM Produits INNER JOIN (Messagers INNER JOIN (Employés
INNER JOIN ((Clients INNER JOIN Commandes ON
[Clients].[Code client]=[Commandes].[Code client]) INNER JOIN
[Détails commandes] ON
[Commandes].[N° commande]=[Détails commandes].[N° commande]) ON
[Employés].[N° employé]=[Commandes].[N° employé]) ON
[Messagers].[N° messager]=[Commandes].[N° messager]) ON
[Produits].[Réf produit]=[Détails commandes].[Réf produit];Version : Access 97 et supérieures
Pour que ce code fonctionne, vous devez ajouter les références suivantes à votre projet :
- Microsoft Scripting Runtime
- Microsoft DAO Object Library
Dans un module, placez le code suivant :
Public Sub SauvegarderRqt(strFichier As String)
On Error Goto Err
Dim Db As DAO.Database
Dim qry As DAO.QueryDef
Dim FSO As New Scripting.FileSystemObject
Dim oFileText As Scripting.TextStream
'Instancie Db
Set Db = CurrentDb
'Ouvre le fichier texte (le crée s'il n'existe pas)
Set oFileText = FSO.OpenTextFile(strFichier, ForWriting, True)
'Pour chaque requête
For Each qry In Db.QueryDefs
'si la requête n'est pas sytème (commence par ~)
If Left(qry.Name, 1) <> "~" Then
'Ecrit le nom de la requête et son code SQL
With oFileText
'Ecrit le titre et des #
.WriteLine String(Len(qry.Name) + 4, "#")
.WriteLine "# " & qry.Name & " #"
.WriteLine String(Len(qry.Name) + 4, "#")
'Saute 1 ligne et écrit le SQL
.WriteBlankLines (1)
.WriteLine qry.SQL
'Saute 3 lignes
.WriteBlankLines (3)
End With
End If
Next qry
'Ferme le fichier, libère la mémoire
oFileText.Close
Set FSO = Nothing
Db.Close
Set Db = Nothing
'Demande à l'utilisateur s'il veut visualiser le fichier
If MsgBox("Voulez vous ouvrir le fichier généré ?", _
vbQuestion + vbYesNo, "Sauvegarde requête") = vbYes Then
Shell "notepad.exe " & strFichier, vbMaximizedFocus
End If
Exit Sub
Err:
Msgbox "Une erreur est survenue."
End SubCe code est particulièrement utile aux étudiants qui souhaitent rendre un rapport de leur projet et aux développeurs qui, comme moi, aiment garder une trace papier de leur travail.
Versions : 97 et supérieures
Dans un réseau d'entreprise, il est utile de pouvoir rapatrier des infos sur les postes connectés (mémoire, résolution d'écran, OS, ...), mais il est délicat d'obtenir la vitesse du processeur. Pour pallier à ce manque, voici une fonction qui retourne une valeur indiquant la vitesse brute de la machine (durée d'une boucle for/next). Le résultat est donné en log base 2 pour atténuer les écarts de résultats. Avec cette méthode, un point supplémentaire indique une machine deux fois plus rapide. L'avantage de cette fonction c'est qu'elle permet de se faire tout de suite une idée de l'age de la machine.
Option Compare Database
Option Explicit
Private Declare Function GetTickCount Lib _
"kernel32" () As Long
Function PerformancePcTeste() As Currency
Const curExposant As Currency = 2
Const lngDuréeMinima As Currency = 100
Dim intPuissance As Integer
Dim lngTopTemp As Long
Dim lngTopDébut As Long
Dim lngTopFin As Long
Dim lngDurée As Long
Dim curNombre As Currency
Dim curForIndex As Currency
Dim curNombreParSeconde As Currency
Dim curPuissance As Currency
Do
intPuissance = intPuissance + 1
curNombre = curExposant ^ intPuissance
lngTopTemp = GetTickCount
Do
lngTopDébut = GetTickCount
Loop Until lngTopDébut > lngTopTemp
lngTopDébut = GetTickCount
For curForIndex = 1 To curNombre
Next
lngTopFin = GetTickCount
lngDurée = lngTopFin - lngTopDébut
Loop Until lngDurée > lngDuréeMinima
curNombreParSeconde = curNombre / _
lngDurée * 1000
curPuissance = Log(curNombreParSeconde) / _
Log(curExposant)
curPuissance = Int(curPuissance * 100) / 100
PerformancePcTeste = curPuissance
End FunctionLes plus lents PC que j'aie vu sur un réseau donnaient un résultat de 21-22 (P2) ce qui est aujourd'hui un veau. Mon PC, un Athlon 1400 (=1800) donne 25,5. Je n'ai pas encore vu de note supérieure ou égale à 27.
Je joins cette fonction qui permet de comparer son PC avec une note de référence :
Function PerformancePcCompare _
(PuissanceRéférence As Currency) As String
Dim curPuissance As Currency
curPuissance = PerformancePcTeste()
PerformancePcCompare = "La vitesse de ce PC est de " _
& Int(2 ^ (curPuissance - PuissanceRéférence) * 100) / 100 _
& " fois la vitesse du PC de référence"
End Function
- Je précise tout de même que pour obtenir une note fiable, il ne faut pas qu'un autre programme gourmand tourne en tâche de fond.
- La note de performance évolue très légèrement en fonction de la version du Basic - optimisations du compilateur ?
Versions : Access 2000 et supérieures
Un marqueur mesure le temps d'execution du code compris entre son début et sa fin. On peut utiliser plusieurs marqueurs et les imbriquer. Cette source se compose de 2 classes clsMarqueur et clsMarqueurs. Le développeur ne déclare et manipule que clsMarqueurs qui est une collection de plusieurs objets marqueurs.
Code Classe clsMarqueur
Option Compare Database
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Nom As String
Private Debut As Long
Private Fin As Long
Private Sub Class_Initialize()
Debut = GetTickCount
End Sub
Public Property Get lDebut() As Long
Let lDebut = Debut
End Property
Public Property Get lFin() As Long
Let lFin = Fin
End Property
Public Sub SetFin()
Fin = GetTickCount
End Sub
Public Function Duree() As Long
Duree = Fin - Debut
End Function
Public Sub lNom(ByVal pNom As String)
Nom = pNom
End Sub
Public Function getNom() As String
getNom = Nom
End FunctionCode Classe clsMarqueurs
Option Compare Database
Option Explicit
Dim Marqueurs As New Collection
Private Sub Class_Initialize()
Set Marqueurs = New Collection
End Sub
Public Sub ajouterMarqueur(ByVal pNomMarqueur As String)
Marqueurs.Add New clsMarqueur, pNomMarqueur
Marqueurs(pNomMarqueur).lNom (pNomMarqueur)
End Sub
Public Sub terminerMarqueur(ByVal pNomMarqueur As String)
Marqueurs.Item(pNomMarqueur).SetFin
End Sub
Public Function dureeMarqueur(ByVal pNomMarqueur As String) As String
dureeMarqueur = Marqueurs.Item(pNomMarqueur).sDuree
End Function
Private Sub Class_Terminate()
Set Marqueurs = Nothing
End Sub
Public Sub rapportDebug()
Dim mqr As New clsMarqueur
For Each mqr In Marqueurs
Debug.Print mqr.getNom & " : " & mqr.Duree & "ms"
Next
End SubExemple d'utilisation sur une procédure lente :
Option Compare Database
Option Explicit
Sub TesterExemple()
Dim cAnalyse As New clsMarqueurs
cAnalyse.ajouterMarqueur "*** MettreAJourFax ***"
Call MettreAJourFax
cAnalyse.terminerMarqueur "*** MettreAJourFax ***"
cAnalyse.rapportDebug
End Sub
Sub MettreAJourFax()
Dim oRS As Recordset
Set oRS = CurrentDb.OpenRecordset("SELECT * FROM [Clients]", 2)
With oRS
If IsNull(.Fields("Fax")) Or Len(.Fields("Fax")) = 0 Then
.Edit
.Fields("Fax") = Null
.Update
.Close
End If
End With
Set oRS = Nothing
End SubValeurs renvoyées dans la fenêtre d'exécution :
*** MettreAJourFax *** : 15547msLe code suivant est à coller dans un module. En faisant varier nIDEvent on peut ajouter autant de timer que l'on veut sans être obligé de créer un formulaire caché. Pour l'exemple lancer la fonction Start_Test_Timer() Elle affiche l'heure dans la barre de statut...
Pour la version 97, utiliser la fonction AddrOf présente dans les sources. Cf lien.
Dans la procédure Start_Timer, pensez à supprimer la ligne qui ne correspond pas à votre version Access.
' Intervalle du timer en millisecondes
Private Const INT_TIMER As Long = 1000
' Déclaration d'API pour timer
Private Declare Function APISetTimer Lib "user32.dll" Alias _
"SetTimer" (ByVal hWnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerProc As Long) As Long
Private Declare Function APIKillTimer Lib "user32.dll" Alias _
"KillTimer" (ByVal hWnd As Long, ByVal uIDEvent As Long) As Long
' Constante définissant les timers
Private Const IDT_TIMER As Long = 1
'Private Const IDT_TIMER2 As Long = 2
' Démarre le timer (numéro du timer, interval en ms)
Private Sub Start_Timer(nIDEvent As Long, interval As Long)
APISetTimer Application.hWndAccessApp, nIDEvent, interval, _
AddrOf("Callback_Timer") ' Ligne pour Access 97
APISetTimer Application.hWndAccessApp, nIDEvent, interval, _
AddressOf Callback_Timer ' Ligne pour les autres versions
End Sub
' Arrête le timer
Private Sub Stop_Timer(uIDEvent As Long)
APIKillTimer Application.hWndAccessApp, uIDEvent
End Sub
' Callback_Timer est appelé par les timers à intervalle régulier
Public Function Callback_Timer(ByVal hWnd As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
' Citation de l'aide de AddressOf :
'Étant donné que l'appelant d'un rappel ne se trouve pas dans votre programme,
'il est important qu'une erreur rencontrée dans la procédure de rappel ne se propage pas
'dans l'appelant. Pour ce faire, insérez l'instruction On Error Resume Next
'au début de la procédure de rappel.
On Error Resume Next
Select Case wParam
Case IDT_TIMER
Call Evenement_Timer
'Case IDT_TIMER2
' Call Evenement_Timer2
End Select
End Function
' Affichage de l'heure à chaque seconde
Private Sub Evenement_Timer()
SysCmd acSysCmdSetStatus, Now()
End Sub
' Démarrage de l'horloge
Public Function Start_Test_Timer()
Start_Timer IDT_TIMER, INT_TIMER
End Function
' Arrêt de l'horloge
Public Function Stop_Test_Timer()
Stop_Timer IDT_TIMER
End FunctionLien : Code de remplacement de la fonction AddressOf pour Access 97



