FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
Sommaire→VBA→Le langage- Comment choisir entre un module standard et un module de classe ?
- Qu'est-ce que ByVal et ByRef ?
- Comment faire une procédure ou une fonction qui a un ou plusieurs paramètres optionnels ?
- Comment passer un tableau en paramètre ?
- Comment tester si un tableau dynamique est vide ?
- Comment faire une fonction qui renvoie un résultat ?
- Comment faire une fonction qui renvoie un tableau ?
- Comment faire une fonction qui renvoie une variable de type utilisateur ?
- Comment obtenir la constante Pi ?
- Comment lire ou modifier une propriété d'un objet par son nom ?
- Comment exécuter une méthode en passant son nom en argument ?
- Comment utiliser les expressions régulières ?
- Comment déclencher un événement par le code ?
- Quelle est la différence entre "." et "!" ?
- Comment fermer ma base Access par le code ?
- Comment suivre un lien hypertexte par le code ?
- Comment modifier le titre de l'application ?
- Comment donner une certaine valeur à une variable (ou un champ) si elle est vide ?
- Comment utiliser les énumérations ? Comment créer une liste de constantes (ex. : une liste de couleurs) ?
- Pourquoi l'instruction : If MaVar = NULL ne marche-t-elle pas ?
- Comment créer des variables utilisables partout dans l'application ?
- À quoi correspond le Me. que je vois devant le nom de certains objets dans des lignes de code ?
- Comment instancier un nouvel objet ?
- Comment tester si deux variables représentent le même objet ?
Un module standard contient un ensemble de fonctions et de procédures, plus toutes les déclarations qui leur sont nécessaires.
Parmi ces déclarations, fonctions et procédures, certaines peuvent être de portée privée, c'est-à-dire que l'on ne peut pas y
accéder à partir d'un autre module. Tout ce qui n'est utilisé que dans le module standard lui-même sera donc de portée privée.
Un module de classe vous permettra de créer une classe. Une classe décrit un objet particulier : quelles sont ses
caractéristiques (appelées propriétés) et ce qu'il peut faire (quelles sont ses méthodes). Par exemple, chaque formulaire
de votre projet correspond à une classe. Ses propriétés sont Caption, BorderStyle, etc. et ses méthodes Show, Hide, etc. Dans une classe, une méthode s'écrit sous la forme d'une fonction de portée
publique. Voyons comment s'écrit une propriété, par exemple la propriété Marque de la classe Voiture :
'Variable privée représentant la marque, on ne peut pas y accéder depuis l'extérieur
Private m_Marque As String
'Property Get est la fonction appelée lorsque l'on veut obtenir la valeur de la propriété
Property Get Marque() As String
Marque = m_Marque
End Property
' Property Let est la procédure appelée lorsque l'on veut modifier la valeur de la propriété.
' Si elle n'existe pas, la propriété sera en lecture seule.
' Elle doit avoir un argument qui a le type de la propriété,
' soit le même que celui de la valeur renvoyée par Property Get.
Property Let Marque(value As String)
m_Marque = value
End PropertyEt pour finir, un exemple d'utilisation de la classe Voiture :
Dim UneVoiture As Voiture
Set UneVoiture = New Voiture
UneVoiture.Marque = "Renault"
MsgBox UneVoiture.Marque
Set UneVoiture = NothingLien : FAQ VB
Les arguments d'une fonction ou d'une procédure peuvent être passés de deux façons différentes : par valeur ou par référence.
Si un argument est précédé de ByVal, il est passé par valeur, et s'il est précédé de ByRef, ou de ni l'un ni l'autre, il est passé par référence.
Passage par valeur (ByVal)
Consiste à passer la valeur de l'argument à la procédure, et non son adresse.
La procédure utilise alors une copie de la variable. La valeur de la variable ne peut pas être modifiée par la procédure.
Passage par référence (ByRef)
Ici c'est l'adresse de la variable qui est passée à la procédure. La variable peut donc être modifiée par la procédure.
Private Sub Echange(ByVal a As Integer, ByVal b As Integer)
Dim temp As Integer
temp = a
a = b
b = temp
End Sub
Private Sub Echange2(a As Integer, b As Integer)
Dim temp As Integer
temp = a
a = b
b = temp
End Sub
Private Sub Test()
x = 5
y = 3
Echange x, y
MsgBox x & " " & y ' Affiche "5 3", les valeurs n'ont pas été modifiées par la procédure
Echange2 x, y
MsgBox x & " " & y ' Affiche "3 5", parce que les valeurs ont été modifiées
End SubLien : FAQ VB
Un paramètre est optionnel s'il est précédé du mot-clé Optional. Les paramètres placés après doivent être également optionnels. Vous pouvez également spécifier une valeur par défaut :
Private Sub Affiche(Optional x As Long=10)
End SubPour les paramètres de type Variant et sans valeur par défaut, vous avez le moyen de savoir si une valeur a été spécifiée lors de l'appel en utilisant IsMissing :
Private Sub Affiche(Optional x As Variant)
If IsMissing(x) Then
' Pas de valeur spécifiée
Else
' Une valeur a été spécifiée pour x
End If
End SubLien : FAQ VB
L'exemple suivant affiche les éléments d'un tableau :
Private Sub AfficheElements(t() As Long)
Dim i As Long
For i = LBound(t) To UBound(t)
MsgBox t(i)
Next
End Sub
Private Sub Form_Load()
Dim t(1 To 3) As Long
t(1) = 1
t(2) = 4
t(3) = 5
AfficheElements t()
End SubLien : FAQ VB
La fonction UBound() renvoie l'indice maximum autorisé pour un tableau donné. Si le tableau est vide, elle crée une erreur. La fonction suivante utilise ce principe. Elle renvoie vrai si le tableau passé en paramètre contient au moins un élément.
Public Function ContientElements(ByVal tableau As Variant) As Boolean
Dim indice As Long
On Error goto vide
indice = UBound(tableau)
ContientElements = True
Exit Function
vide:
End FunctionLien : FAQ VB
La fonction suivante renvoie un booléen : True si le nombre reçu en paramètre est pair, et False sinon.
Private Function EstPaire(x As Long) As Boolean
EstPaire = (x Mod 2 = 0)
End FunctionLien : FAQ VB
Dans l'exemple ci-dessous, la fonction RGBparTableau() renvoie les composantes rouge, vert, bleu du code couleur passé en paramètre. Les composantes sont renvoyées sous la forme d'un tableau.
Public Function RGBparTableau(ByVal couleur As Long) As Long()
Dim MonTab(0 To 2) As Long
MonTab(2) = Int(couleur / 65536)
MonTab(1) = Int((couleur - (65536 * MonTab(2))) / 256)
MonTab(0) = couleur - ((MonTab(2) * 65536) + (MonTab(1) * 256))
RGBparTableau = MonTab
End Function
Private Sub Command1_Click()
Dim TabCouleur() As Long, couleur As Long
couleur = 9550940
TabCouleur() = RGBparTableau(couleur)
MsgBox "Le code " & couleur & " correspond en RGB à " & _
TabCouleur(0) & " " & TabCouleur(1) & " " & TabCouleur(2)
End SubLien : FAQ VB
Une fonction peut renvoyer une variable de type utilisateur comme n'importe quel autre type simple.
Cependant vous ne pouvez pas déclarer dans un module de classe, y compris dans le module d'un formulaire, une fonction de
portée publique renvoyant un type utilisateur. Dans un module standard, si vous déclarez un type utilisateur et
une fonction de portée publique qui renvoie ce type, le type doit être aussi déclaré avec une portée publique.
Dans l'exemple ci-dessous, la fonction RGBparType() renvoie les composantes rouge, vert, bleu du code couleur passé en paramètre. Les composantes sont les champs du type CompCouleur.
Private Type CompCouleur
Red As Long
Green As Long
Blue As Long
End Type
Private Function RGBparType(ByVal Couleur As Long) As CompCouleur
RGBparType.Blue = Int(Couleur / 65536)
RGBparType.Green = Int((Couleur - (65536 * RGBparType.Blue)) / 256)
RGBparType.Red = Couleur - ((RGBparType.Blue * 65536) + (RGBparType.Green * 256))
End Function
Private Sub Command1_Click()
Dim TypColor As CompCouleur
TypColor = RGBparType(9550940)
lblred.Caption = "Red = " & TypColor.Red
lblgreen.Caption = "Green = " & TypColor.Green
lblblue.Caption = "Blue = " & TypColor.Blue
End SubLien : FAQ VB
Contrairement à d'autres langages, la constante Pi n'existe pas en VB. La meilleure façon de l'obtenir rapidement est d'utiliser le code suivant :
Dim Pi as Double
Pi=4*Atn(1)Lien : FAQ VB
Avec la fonction CallByName.
Private Sub Form_Load()
' Ici CallByName renvoie la valeur de la propriété Caption du formulaire
Msgbox CallByName(Me, "Caption", VbGet)
' Modifie la propriété Caption du formulaire
CallByName Me, "Caption", VbLet, "Test de callbyname"
End SubLien : FAQ VB
Avec la fonction CallByName.
Private Sub Form_Load()
' Déplace le formulaire à la position 5000,150
CallByName Me, "Move", VbMethod, "5000,150"
End SubFRED.G : attention, l'exemple utilise la méthode Move qui n'est valable qu'à partir d'Access 2002.
Lien : FAQ VB
La bibliothèque Microsoft VBScript Regular Expressions permet d'utiliser des expressions régulières dans Visual Basic. Il faut l'ajouter dans les références du projet.
Le principe consiste à créer un objet RegExp, à le paramétrer en modifiant ses propriétés, puis à lancer la recherche en appelant la méthode Execute(). Vous devez passer en paramètre la chaîne de caractères dans laquelle vous souhaitez faire une recherche. La méthode Execute vous renvoie alors les occurrences dans une collection. Si vous avez donné la valeur True à la propriété Global de l'objet RegExp, cette collection contiendra toutes les occurrences, sinon seulement la première.
Voici comment vérifier la validité d'une adresse email. Ce code a été écrit avec la version 5.5 de la bibliothèque.
Public Function EmailValide(ByVal email As String) As Boolean
Dim regEx As RegExp, occurrences As MatchCollection
Set regEx = New RegExp
regEx.Pattern = "^[a-z0-9_.-]+@[a-z0-9.-]{2,}\.[a-z]{2,3}$"
regEx.IgnoreCase = True ' Ne pas distinguer les minuscules des majuscules
regEx.Global = False 'Renvoyer seulement la première occurrence
Set occurrences = regEx.Execute(email)
EmailValide = (occurrences.Count = 1)
End FunctionVous pouvez également jeter un œil à la première partie du tutoriel de Louis-Guillaume MORAND.
Lien : FAQ VB
Il est impossible de déclencher des événements par le code (sauf les événements définis par l'utilisateur). Cependant il est possible d'exécuter les procédures événementielles correspondantes en les appelant comme n'importe quelle méthode de formulaire.
Remarque : les procédures doivent être déclarées en Public Sub.
Lien : Comment exécuter une procédure (sub) d'un autre formulaire ?
L'opérateur "!" (point d'exclamation) indique que l'élément qui suit est défini par l'utilisateur (un élément d'une collection). Par exemple, vous pouvez utiliser l'opérateur "!" pour faire référence à un formulaire ouvert, à un état ouvert, ou à un contrôle figurant sur un formulaire ou sur un état.
L'opérateur "." (point) indique généralement que l'élément qui suit est défini par MS Access. Par exemple, vous pouvez utiliser l'opérateur "." pour faire référence à une propriété d'un formulaire, d'un état, ou d'un contrôle.
Deux solutions s'ouvrent à vous :
--> fermer la base en laissant Access ouvert :
Application.CloseCurrentDatabase--> fermer la base et Access :
Application.QuitUtiliser la méthode FollowHyperlink de l'objet Application :
Application.FollowHyperlink "http:www.developpez.net/forums/viewtopic.php?t=228003"ou
exécuter la méthode Follow de l'objet Hyperlink (bibliothèque Access).
1re solution : Menu Outils/Démarrage rubrique titre de l'application.
2e possibilité en VBA, regarder la propriété AppTitle.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
' Pour une première utilisation, cette propriété n'est pas définie et son utilisation
' provoque l'erreur rattrapable n° 3270 : "Propriété non trouvée".
'Il convient alors de créer la propriété dans le code de gestion d'erreur.
Public Sub DefinirTitreApplication()
On Error GoTo err_gestion
Dim prp As DAO.Property
Dim str As String
str = "nouveau titre"
CurrentDb.Properties("AppTitle") = str
RefreshTitleBar
sortie:
Exit Sub
err_gestion:
If Err.Number = 3270 Then
Set prp = CurrentDb.CreateProperty("AppTitle", dbText, str)
CurrentDb.Properties.Append prp
Resume
End If
End SubLien : Comment ajouter/modifier une propriété sur une base de données ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Il faut utiliser la fonction Nz(). Par exemple si vous voulez afficher le contenu d'une variable, ou bien "Vide" si sa valeur est nulle il suffit de faire :
Nz(LaVariable, "vide")Cela peut également servir dans une requête pour donner une valeur à un champ s'il est nul.
Un ensemble de constantes liées par leur sens peut être défini par une énumération à l'aide du mot-clé Enum. La déclaration de l'énumération est à placer dans le haut du module (partie déclaration).
Chaque ligne de l'énumération est déclarée ainsi : <Nom de la valeur> = <Valeur : Type entier>
Private Enum Couleurs
Bleu=1
Vert=3
Jaune=5
End EnumAinsi, si on déclare une variable de type Couleurs, on aura par exemple :
Dim MaCouleur as Couleurs
MaCouleur=Couleurs.Vert
Msgbox MaCouleurCeci affichera 3.
Il faut utiliser la fonction IsNull().
Intéressez-vous aussi à la fonction Nz().
Utilisez des variables globales, créez un module et insérez :
Public MaVar As StringLa variable MaVar sera utilisable depuis n'importe quel formulaire.
Cependant attention à l'utilisation des variables globales, ce peut être un ennemi si elles sont mal utilisées. Attention à ne pas donner à des variables locales le même nom que les variables globales.
Attention, ceci peut être particulièrement dangereux lors d'un travail en équipe, si certains ignorent la présence de variables globales.
Pour utiliser cette valeur dans une requête il suffit de créer une fonction qui en renvoie la valeur.
Dans le même module écrivez :
Public Function ValeurVar() As String
ValeurVar = MaVar
End FunctionCe qui donnera :
Select * FROM MaTable WHERE ID = ValeurVal() ;
Le Me désigne en fait l'instance du formulaire sur lequel on se trouve.
Ainsi la ligne suivante fait référence à une zone de texte se trouvant dans le formulaire actuel :
Me.txtNom = "Dupond"Deux syntaxes sont possibles :
Dim obj as new clToto
obj.mamethodeOu
Dim obj as clToto
Set obj= New clToto
obj.mamethodePourtant, il existe une différence fondamentale entre les deux syntaxes. En Visual Basic, dès qu'une méthode est appelée, une vérification interne est réalisée. Celle-ci consiste à vérifier que l'objet n'est pas vide avant l'appel. Le mot-clé SET permet d'outrepasser cette vérification et de dire explicitement au système que l'objet a été instancié. Ainsi, on gagne de nombreuses opérations qui auraient dû être effectuées à chaque fois que l'objet aurait été référencé. La syntaxe 2 consomme donc une ligne de code de plus mais est beaucoup plus performante.
Pour tester si deux variables correspondent au même objet, il faut utiliser l'opérateur IS :
Dim a As Object
Dim b As Object
Set a = CurrentDb
Set b = a
If b Is a Then
MsgBox "Le même objet"
Else
MsgBox "Objet différent"
End If
Set b = CurrentProject
If b Is a Then
MsgBox "Le même objet"
Else
MsgBox "Objet différent"
End IfCeci affiche respectivement :
- Le même objet
- Un objet différent



