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 créer un raccourci ?
- Comment exécuter des commandes Dos ?
- Comment envoyer un mail (courriel) contenant des sauts de ligne ?
- Comment utiliser l'objet Microsoft Progress Bar ?
- Comment avoir un indicateur de progression d'un traitement quelconque ?
- Comment supprimer les objets d'une base de données externe ?
- Comment composer un numéro de téléphone depuis Access ?
- Comment simuler la fonction annuler (flèche bleue) d'Access ?
- Comment renommer un objet en VBA ?
- [*.MDE] Comment, depuis la base en cours, faire référence à la base MDE contenant le code qui s'exécute ?
- Comment annuler ou redéfinir l'effet d'une touche ou d'une combinaison de touches ?
- Comment savoir si l'on est connecté à internet ?
- Comment connaître l'adresse d'une base de données ?
- Comment savoir si un objet est caché ?
- Comment récupérer l'équation de tendance d'un graphique Access ?
- Comment retrouver le nom d'une constante par sa valeur ?
- Comment imprimer un document sans pour autant ouvrir l'application associée ?
- Comment faire disparaître les barres de commandes ?
- Comment définir en VBA le texte d'une info-bulle ?
- Comment connaître le séparateur décimal ?
- Comment récupérer tous les noms des formulaires en VBA ?
- Comment valider un XML via un XSD en VB avec MSXML et sans .NET sous Windows ?
- Quelles sont les correspondances en VBA des touches ?
- 11.13.1. Divers Trucs et Astuces (17)
Ajoutez la référence Windows Script Host Object Model (wshom.ocx) à votre projet.
Dim
strCheminRaccourci As
String
Dim
oWsh As
New
WshShell
Dim
oRac As
WshShortcut
' Récupère le chemin du bureau et le concatène avec le nom du raccourci
strCheminRaccourci =
oWsh.SpecialFolders
(
"Desktop"
) &
"\Fichier.lnk"
' Crée un nouveau raccourci
Set
oRac =
oWsh.CreateShortcut
(
strCheminRaccourci)
' Paramètre le raccourci
With
oRac
'Cible
.TargetPath
=
Chr
(
34
) &
"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE"
&
Chr
(
34
)
'Argument
.Arguments
=
"D:\mabase.mdb /wrkgrp d:\system.mdw"
'Style de fenêtre
.WindowStyle
=
4
'Chemin vers l'icône
.IconLocation
=
"d:\monicone.ico"
'Dossier de travail
.WorkingDirectory
=
"D:\"
'Enregistre le raccourci
.Save
End
With
' Libère les objets
Set
oRac =
Nothing
Set
oWsh =
Nothing
Sub
tesjdn
(
)
Dim
textemsg As
String
textemsg =
"coucou"
&
"<br>"
&
"TEST3"
DoCmd.SendObject
, , acFormatTXT, "toto@aol.com"
, , , "titre"
, textemsg, True
End
Sub
La balise HTML BR sert à revenir à la ligne. Donc utilisez des balises HTML et vous ferez ce que bon vous semble.
Cet objet peut être utilisé par exemple lors de l'exécution d'un long processus, l'utilisateur verra un état d'avancement (progression) qui le rassurera durant son attente.
mabarre.min
=
0
mabarre.max
=
100
i=
1
While
i <=
100
mabarre.value
=
i
i=
i+
1
Wend
Ainsi la barre s'incrémente de 1 à chaque passage.
Par exemple si vous importez des données, il est bon de s'informer sur le nombre d'enregistrements à importer. Ainsi, le maximum de la barre sera le nombre total d'enregistrements.
À chaque enregistrement importé, on incrémente alors la valeur de la barre. (Astuce de Thogal).
Lien : Comment avoir un indicateur de progression d'un traitement quelconque ?
Il est possible d'utiliser le contrôle MS Progress Bar dans Access.
Sinon la méthode Application.Syscmd permet également d'afficher du texte et/ou une jauge d'avancement dans la barre d'état :
Syscmd acSysCmdInitMeter,"Text à afficher"
, 100
' Définit le texte à afficher et la valeur maximale de la jauge.
Syscmd acSysCmdUpdateMeter, 50
' Définit le texte à afficher et la valeur actuelle de la jauge.
Syscmd acSysCmdRemoveMeter ' Supprime la jauge d'avancement
Function
DeleteObjectExterne
(
)
Dim
acApp As
Access.Application
Set
acApp =
GetObject
(
"toto.mbd"
)
acApp.DoCmd.DeleteObject
acForm, "nom_form"
acApp.Quit
Set
acApp =
Nothing
End
Function
- Activer les assistants.
- Ajouter un bouton de commande sur un formulaire.
- Choisir Divers -> Numérotation Automatique.
- Choisir une image.
- Terminer.
Le bouton et son code _Click() :
- détectent le texte de la zone de texte active ;
- appellent le numéro, s'il y en a un valide ;
- affichent une boîte de dialogue qui dit de décrocher dès que le répondant décroche : vous entendez la ligne dans le haut-parleur du PC ;
- il est facile d'améliorer et d'adapter ce code à vos besoins...
Ensuite, il faut juste avoir un téléphone, sur la même ligne que le modem.
Me.Undo
Lien : Comment fermer un formulaire sans sauvegarder l'enregistrement en cours ?
Utilisez la commande :
DoCmd.Rename
Imaginons une base Access MDA (Microsoft Add-In) dans laquelle on trouve un module VBA et une table. Si dans une procédure du module on souhaite ouvrir un Recordset sur la table, il faut remplacer CurrentDB par CodeDB :
Set
rs =
CodeDB.Openrecordset
(
)
En effet, lorsque la procédure du module de la base MDA sera appelée depuis une base MDB ou MDE classique, Access cherchera la table dans la base de données active (MDB ou MDE) et la procédure échouera puisqu'il fallait chercher dans la base MDA. CurrentDB fait référence à la base de données active, CodeDB fait référence à la BDD contenant le code qui s'exécute.
Vous pouvez définir et utiliser une macro AUTOKEYS. Celle-ci sera active sur la totalité de votre application.
Si vous souhaitez contrôler par du VBA, formulaire par formulaire, l'effet de certaines touches, définissez à Oui la propriété KeyPreview (AperçuTouches) des formulaires concernés, puis utilisez l'événement KeyDown (touche appuyée).
Pour les détails concernant le fonctionnement de ces différentes méthodes, consultez l'aide Access.
Pour un exemple d'utilisation du KeyDown dans un formulaire, référez-vous au lien ci-dessous.
Lien : Comment exécuter une procédure en appuyant sur les touches F1, F2, etc. ?
La fonction ConnexionInternetActive() ci-dessous renvoie True si l'on est connecté à internet.
Private
Declare
Function
InternetGetConnectedState Lib
"wininet.dll"
_
(
ByRef
lpdwFlags As
Long
, _
ByVal
dwReserved As
Long
) As
Long
Public
Function
ConnexionInternetActive
(
) As
Boolean
ConnexionInternetActive =
InternetGetConnectedState
(
0
&
, 0
&
)
End
Function
Lien : FAQ VB
CurrentDb.Name
ou
Application.CurrentProject.Path
Depuis Access 2000, l'objet Application offre deux méthodes :
>> GetHiddenAttribute ;
>> SetHiddenAttribute.
Elles permettent de consulter ou de modifier l'attribut "masqué" normalement accessible dans la fenêtre des Propriétés de n'importe quel objet d'application Access :
Table, Query, Form, Report, Macro, Module...
Exemple pour déterminer si la requête [Ma Requête] est masquée:
Dim
bMasqué as
Boolean
bMasqué =
Application.GetHiddenAttribute
(
acQuery,"Ma Requête"
)
DatDebut sert à donner la borne inférieure pour l'analyse des dates (il n'y a pas de borne supérieure car selon moi ça ne sert à rien de faire des calculs de tendance sur les mois passés !).
X est la valeur des abscisses pour laquelle on veut l'extrapolation.
Voici un exemple de code, mais il faut que vous adaptiez la requête pour que ça marche avec vos tables, bien sûr.
Veillez également à ce que la référence ADO soit cochée (fenêtre VBA Outils>RéférenceMicrosoft ADO...).
Option
Compare Database
Type
ParamTendance
Pente As
Double
OrdonneeZero As
Double
End
Type
Public
Function
CalculTendance
(
DatDebut As
Date
, X As
Double
) As
Double
Dim
Rst As
New
ADODB.Recordset
Dim
MaRequete As
String
Dim
NbDonnee As
Integer
Dim
DonneeCumul
(
) As
Double
Dim
i As
Integer
Dim
SumX As
Double
Dim
SumX2 As
Double
Dim
SumChiffre As
Double
Dim
SumChiffreX As
Double
Dim
Type_Param As
ParamTendance
MaRequete =
"SELECT T.DateJour, T.ChiffreDAffaire AS Chiffre"
&
vbNewLine
&
_
"FROM T_ChiffreDAffaire T"
&
vbNewLine
&
_
"WHERE T.DateJour>=#"
&
DatDebut &
"#"
&
vbNewLine
&
_
"ORDER BY T.DateJour;"
Rst.Open
MaRequete, CurrentProject.Connection
, adOpenStatic
NbDonnee =
Rst.RecordCount
If
NbDonnee =
0
Then
MsgBox
"Pas de données"
CalculTendance =
0
Exit
Function
End
If
Rst.Close
ReDim
DonneeCumul
(
1
To
NbDonnee)
Rst.Open
MaRequete, CurrentProject.Connection
, adOpenDynamic
Rst.MoveFirst
' Calcule le cumul du chiffre d'affaires pour chaque jour
For
i =
1
To
NbDonnee
If
i =
1
Then
DonneeCumul
(
1
) =
Rst
(
"Chiffre"
)
Else
DonneeCumul
(
i) =
Rst
(
"Chiffre"
) +
DonneeCumul
(
i -
1
)
End
If
Rst.MoveNext
Next
i
Rst.Close
SumX =
0
SumX2 =
0
SumChiffre =
0
SumChiffreX =
0
For
i =
1
To
NbDonnee
SumX =
SumX +
i
SumX2 =
SumX2 +
i ^
2
SumChiffre =
SumChiffre +
DonneeCumul
(
i)
SumChiffreX =
SumChiffreX +
DonneeCumul
(
i) *
i
Next
i
Type_Param.Pente
=
(
NbDonnee *
SumChiffreX -
SumX *
SumChiffre) /
(
NbDonnee *
SumX2 -
SumX ^
2
)
Type_Param.OrdonneeZero
=
(
SumX2 *
SumChiffre -
SumX *
SumChiffreX) /
(
NbDonnee *
SumX2 -
SumX ^
2
)
CalculTendance =
Type_Param.Pente
*
X +
Type_Param.OrdonneeZero
End
Function
Ensuite voici comment appeler cette fonction :
Public
Sub
ChiffreTendance18jour
(
)
' Calcule la tendance au 18e jour
Debug.Print
CalculTendance
(
CDate
(
"01/01/2004"
), 18
)
End
Sub
Les constantes sont définies dans des énumérations, elles-mêmes incluses dans une référence.
Par exemple, l'énumération VbMsgBoxResult de
la référence VBA propose les constantes VbOK, VbYes, etc.
Si vous avez besoin de retrouver le nom d'une constante en fonction de sa valeur, vous pouvez utiliser la manipulation suivante :
1. Ajouter la référence TypeLib Information (C:\Winnt\system32\tblinf32.dll).
2. Créer un module de classe dont le nom est impérativement : CEnumValue.
Option
Compare Database
Option
Explicit
Public
LibName As
String
Public
GroupName As
String
Public
ItemName As
String
Public
ItemValue As
Long
Property
Get
ClassType
(
) As
LocalClassType
ClassType =
LocalClassTypeCEnumValue
End
Property
3. Dans un module normal, insérer le code suivant :
Option
Compare Database
Option
Explicit
Dim
TLApp As
TLI.TLIApplication
Dim
TLInfo As
TLI.TypeLibInfo
Dim
Coll_TLI As
Collection
Public
Enum MethodType
MethodConstant =
TLI.InvokeKinds.INVOKE_CONST
MethodEvent =
TLI.InvokeKinds.INVOKE_EVENTFUNC
MethodFunction =
TLI.InvokeKinds.INVOKE_FUNC
MethodGet =
TLI.InvokeKinds.INVOKE_PROPERTYGET
MethodLet =
TLI.InvokeKinds.INVOKE_PROPERTYPUT
MethodSet =
TLI.InvokeKinds.INVOKE_PROPERTYPUTREF
MethodSub =
0
MethodAll =
MethodConstant +
MethodEvent +
MethodFunction +
MethodGet +
MethodLet +
MethodSet +
MethodSub
End
Enum
Public
Enum MethodContext
MethodContextNA =
0
MethodContextReturns =
1
MethodContextTakes =
2
MethodContextBoth =
MethodContextReturns +
MethodContextTakes
End
Enum
Public
Enum PropertyType
PropertyGet =
TLI.InvokeKinds.INVOKE_PROPERTYGET
PropertyLet =
TLI.InvokeKinds.INVOKE_PROPERTYPUT
PropertySet =
TLI.InvokeKinds.INVOKE_PROPERTYPUTREF
PropetyBoth =
PropertyGet +
PropertyLet +
PropertySet
End
Enum
Public
Enum LocalClassType
LocalClassTypeCEnumValue =
1
LocalClassTypeCMethod
LocalClassTypeCParam
End
Enum
Public
Function
GetNameFromEnum
(
ByVal
val As
Long
, _
ByVal
strRefname As
String
, _
ByVal
strEnumGroup As
String
) As
String
Dim
lngI As
Long
Dim
coll As
Collection
Dim
EnumV As
CEnumValue
Set
coll =
EnumValues
(
strRefname, strEnumGroup)
For
lngI =
1
To
coll.count
Set
EnumV =
coll
(
lngI)
If
EnumV.ItemValue
=
val Then
GetNameFromEnum =
EnumV.ItemName
End
If
Next
lngI
Set
coll =
Nothing
Set
EnumV =
Nothing
End
Function
Public
Function
ListEnum
(
ByVal
strRefname As
String
, _
ByVal
strEnumGroup As
String
)
Dim
lngI As
Long
Dim
coll As
Collection
Dim
EnumV As
CEnumValue
Set
coll =
EnumValues
(
strRefname, strEnumGroup)
For
lngI =
1
To
coll.count
Set
EnumV =
coll
(
lngI)
Debug.Print
EnumV.LibName
, EnumV.GroupName
, EnumV.ItemName
, EnumV.ItemValue
Next
lngI
Set
coll =
Nothing
Set
EnumV =
Nothing
End
Function
Private
Function
EnumValues
(
ByVal
strRefname As
String
, _
ByVal
strEnumGroup As
String
) As
Collection
Dim
MemInfo As
TLI.MemberInfo
Dim
TypInfo As
TLI.TypeInfo
Dim
ConstInfo As
TLI.ConstantInfo
Dim
coll As
Collection
Dim
EVI As
CEnumValue
Init strRefname
Set
coll =
New
Collection
Set
ConstInfo =
TLInfo.Constants.NamedItem
(
strEnumGroup)
If
Not
ConstInfo Is
Nothing
Then
For
Each
MemInfo In
ConstInfo.Members
Set
EVI =
New
CEnumValue
With
EVI
.LibName
=
TLInfo.Name
.GroupName
=
ConstInfo.Name
.ItemName
=
MemInfo.Name
.ItemValue
=
MemInfo.Value
End
With
coll.Add
Item:=
EVI
Next
MemInfo
End
If
Set
EnumValues =
coll
Set
coll =
Nothing
Set
EVI =
Nothing
Set
ConstInfo =
Nothing
Set
TypInfo =
Nothing
Set
MemInfo =
Nothing
End
Function
Private
Sub
Init
(
ByVal
strRefname As
String
)
Dim
TL As
TLI.TypeLibInfo
Dim
Ref As
Reference
If
TLApp Is
Nothing
Then
Set
TLApp =
New
TLI.TLIApplication
End
If
Set
TLInfo =
TLApp.TypeLibInfoFromFile
(
_
Filename:=
Application.References
(
strRefname).FullPath
)
Set
Coll_TLI =
New
Collection
For
Each
Ref In
Application.References
Set
TL =
New
TLI.TypeLibInfo
Set
TL =
TLApp.TypeLibInfoFromFile
(
Filename:=
Ref.FullPath
)
Coll_TLI.Add
Item:=
TL, Key:=
TL.Name
Next
Ref
Set
Ref =
Nothing
Set
TL =
Nothing
End
Sub
4. Exemple d'utilisation :
?getnamefromenum (
1
, "VBA"
,"VbMsgBoxResult"
)
vbOk
Le premier paramètre correspond à la valeur recherchée, le deuxième à la référence à utiliser et le dernier à l'énumération.
ShellExecute permet de réaliser cette opération.
Collez la procédure suivante dans un module :
Private
Declare
Function
ShellExecute Lib
"shell32.dll"
Alias "ShellExecuteA"
_
(
ByVal
hwnd As
Long
, ByVal
lpOperation As
String
, ByVal
lpFile As
String
, _
ByVal
lpParameters As
String
, ByVal
lpDirectory As
String
, ByVal
nShowCmd As
Long
) As
Long
Public
Sub
imprimer_fichier
(
Chemin As
String
, le_form As
Form)
'Imprimer le fichier dont le chemin est passé en paramètre
ShellExecute le_form.hwnd
, "print"
, Chemin, ""
, ""
, 1
End
Sub
Vous pouvez alors l'appeler depuis un formulaire de la façon suivante :
Call
imprimer_fichier
(
"C:\monFic.pdf"
, Me)
On peut également bien sûr se passer de créer une méthode et écrire directement la commande d'impression, suivant votre besoin. Écrivez alors simplement dans un module de formulaire :
ShellExecute Me.hwnd
, "print"
, "C:\monImage.jpg"
, ""
, ""
, 1
Ceci fonctionne pour tout type de document, texte ou image. Il faut cependant que vous ayez une application permettant d'ouvrir le fichier. Car l'API utilise l'application associée dans le panneau de configuration des dossiers de Windows.
Par exemple pour imprimer un document PDF, il faut avoir installé sur la machine un logiciel capable de les lire. ShellExecute en a besoin, même si son appel est transparent pour l'utilisateur.
Lien : Comment ouvrir un fichier HTML, Word, PDF ou autre en utilisant l'exécutable associé ?
Lien : Que faire quand l'API ShellExecute ne fonctionne pas ?
Ce code permet de tester si la barre est visible, si tel est le cas, on la cache.
Dim
I As
Integer
For
I =
1
To
Application.CommandBars.Count
If
Application.CommandBars.Item
(
I).Visible
=
True
Then
DoCmd.ShowToolbar
Application.CommandBars.Item
(
I).Name
, acToolbarNo
End
If
Next
I
Pour un contrôle :
MonControl.ControlTipText
=
"Texte à mettre"
Lien : Comment afficher une info-bulle pendant le survol d'un contrôle ?
Function
GiveSep
(
) As
String
GiveSep =
Mid
(
3
/
2
, 2
, 1
)
End
Function
Voici deux exemples qui permettent de lister tous les formulaires de la base de données.
Méthode 1 :
Créer une requête ayant comme source SQL le code ci-dessous.
SELECT
MSysObjects.Name
AS
ReportName FROM
MSysObjects WHERE
((
Left
(
[Name]
,1
)<>
"~"
)
AND
((
MSysObjects.Type
)=-
32768
))
;
Méthode 2 :
Copier et coller cette fonction dans un module.
Function
Test
(
)
Dim
frm As
AccessObject
For
Each
frm In
CurrentProject.AllForms
MsgBox
"Formulaire : "
&
frm.Name
Next
End
Function
Autre méthode :
Sub
FormsName
(
)
Dim
MyDb As
DAO.Database
Dim
MyDocument As
DAO.Document
Set
MyDb =
CurrentDb
(
)
With
MyDb
For
Each
MyDocument In
.Containers
(
"Forms"
).Documents
Debug.Print
"Nom: "
&
MyDocument.name
Next
End
With
End
Sub
Ces deux méthodes fonctionnent sous toutes les versions d'Access.
Lien : Comment récupérer la date et l'heure de la dernière modification d'un état et d'un Formulaire
L'aide en ligne accompagnant XML Parser SDK donne des exemples dans plusieurs langages,
ci-dessous un code permettant de valider un fichier temp.xml à partir de temp.xsd.
N'oubliez pas d'ajouter la référence Microsoft XML 4.0 à votre projet.
Sub
valid
(
)
Dim
xmlDoc As
New
MSXML2.DOMDocument40
Dim
xsdCache As
New
MSXML2.XMLSchemaCache40
Dim
myErr
xsdCache.Add
""
, "C:\test\temp.xsd"
Set
xmlDoc.schemas
=
xsdCache
xmlDoc.validateOnParse
=
True
xmlDoc.async
=
False
xmlDoc.Load
"c:\test\temp.xml"
Set
myErr =
xmlDoc.parseError
If
(
myErr <>
0
) Then
MsgBox
(
"Erreur : "
&
myErr.reason
)
Else
MsgBox
(
"ok"
)
End
If
End
Sub
Il est important que validateOnParse soit renseigné avant l'ouverture du fichier.
Lien : Comment lire un fichier XML ?
Lien : FAQ VB
Lien : Repousser les limites d'Access - récupérer un fil RSS
Ci-joint vous trouverez la liste de correspondance des touches en VBA :
Constantes | Description |
---|---|
vbKey0 | Touche 0. Cette constante fonctionne pour les chiffres de 0 à 9, il vous suffit de remplacer le chiffre. |
vbKeyA | Touche A. Cette constante fonctionne pour les lettres de A à Z, il vous suffit de remplacer la lettre. |
vbKeyBack | Touche Retour en arrière. |
vbKeyCapital | Touche Verrouillage majuscule. |
vbKeyClear | Touche Effacer. |
vbKeyControl | Touche Ctrl. |
vbKeyDelete | Touche Suppr. |
vbKeyDown | Touche Flèche vers le bas. |
vbKeyEnd | Touche Fin. |
vbKeyEscape | Touche Echap (Escape). |
vbKeyExecute | Touche Exécute (Enter). |
vbKeyHelp | Touche Aide. |
vbKeyHome | Touche Home. |
vbKeyInsert | Touche Insert. |
vbKeyLeft | Touche Flèche vers la gauche. |
vbKeyMenu | Touche Menu. |
vbKeyNumlock | Touche Verrouillage Num. |
vbKeyPageDown | Touche Page Suivante. |
vbKeyPageUp | Touche Page Suivante. |
vbKeyPause | Touche Pause. |
vbKeyPrint | Touche Impression écran. |
vbKeyReturn | Touche Entrée. |
vbKeyRight | Touche Flèche vers la droite. |
vbKeySelect | Touche Select. |
vbKeyShift | Touche MAJ. |
vbKeySnapshot | Touche Instantané. |
vbKeySpace | Touche Espace. |
vbKeyTab | Touche Tabulation. |
vbKeyUp | Touche Flèche vers le haut. |
Lien : Comment exécuter une procédure en appuyant sur les touches F1, F2, etc. ?