FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- 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
Property
Et 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 =
Nothing
Lien : 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
Sub
Lien : 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
Sub
Pour 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
Sub
Lien : 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
Sub
Lien : 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
Function
Lien : 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
Function
Lien : 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
Sub
Lien : 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
Sub
Lien : 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
Sub
Lien : 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
Sub
FRED.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
Function
Vous 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.Quit
Utiliser 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
Sub
Lien : 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
Enum
Ainsi, si on déclare une variable de type Couleurs, on aura par exemple :
Dim
MaCouleur as
Couleurs
MaCouleur=
Couleurs.Vert
Msgbox
MaCouleur
Ceci 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
String
La 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
Function
Ce 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.mamethode
Ou
Dim
obj as
clToto
Set
obj=
New
clToto
obj.mamethode
Pourtant, 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
If
Ceci affiche respectivement :
- Le même objet
- Un objet différent