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 ajouter en SQL un champ NuméroAuto à une table existante ?
- Comment augmenter la taille d'un champ Texte au-delà de 255 caractères ?
- Comment changer le format d'un NuméroAuto ?
- Comment créer un champ NuméroAuto en SQL ?
- Comment supprimer les trous des champs NuméroAuto ?
- Comment interdire les doublons sur la combinaison de plusieurs champs ?
- Comment modifier la légende d'un champ d'une table via VB ?
- Comment modifier le type d'un champ de ma table ?
- Comment connaître le nombre de champs d'une table ?
- Comment ajouter un champ dans une table ?
- Comment renommer un champ avec ADO ?
- Comment renommer un champ avec DAO ?
- Comment renommer un champ en SQL ?
- Comment supprimer un champ avec ADO ?
- Quel type de champ choisir pour un code postal ?
- Comment vérifier l'existence d'un champ avec ADO ?
- Comment modifier les masques de saisie d'un champ ?
- Pourquoi éviter les champs calculés dans une table Access ?
- Comment récupérer la liste des champs des tables et leurs descriptions ?
- Comment connaître les noms des champs composant la clé primaire d'une table ?
- Comment faire pour afficher des 0 après le symbole décimal ?
- Comment modifier la valeur par défaut d'un champ d'une table en SQL ?
- Comment créer une clé primaire composée en VBA avec ADO ?
- Comment créer une clé primaire composée en VBA avec DAO
- Comment obtenir une valeur aléatoire unique dans un champ ?
- Comment modifier la position d'une colonne dans une table en VBA ?
- Comment mettre une valeur par défaut dans un champ d'une table ?
- Comment créer un lien hypertexte en dynamique ?
- Comment créer un champ de type décimal ?
- Comment connaître le nom du champ vide qui ne saurait être null ?
- Comment trier les champs par ordre alphabétique dans une table ?
ALTER TABLE MaTable ADD COLUMN MonChampID COUNTER
Il faut utiliser un champ de type mémo, celui-ci accepte jusqu'à 65 535 caractères. Notez que vous ne pourrez pas indexer ce champ.
Vous voulez un numéro automatique de format 00001 par exemple ?
Dans la structure de la table, il faut taper dans la propriété format du NuméroAuto : 00000.
CREATE TABLE MaTable (
MonChampID COUNTER, MonAutreChamp Text
(
10
))
Lien : Comment ajouter en SQL un champ NuméroAuto à une table existante ?
Cette question est étrange en elle-même, car cela ne convient pas, dans une base de données.
lorsque l'on crée une clé primaire en NuméroAuto, c'est pour éviter d'avoir à créer des identifiants.
- Ces identifiants sont créés automatiquement ;
- Ils ne sont pas "porteurs d'information" ;
- Il ne s'agit pas d'un compteur.
"Combler les trous dans un NuméroAuto" est tout simplement une aberration.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Maintenant, si vous avez un champ numérique, vous pouvez combler les trous dans la numérotation en récupérant le premier numéro libre grâce à la fonction suivante :
Function
NextID
(
LeChamp As
String
, LaTable As
String
) As
Long
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' Fonction renvoyant le prochain Identifiant, en fonction des valeurs existantes dans une table.
' Arguments :
' LeChamp => Nom du champ Identifiant numérique Long concerné
' LaTable => Nom de la table contenant cet identifiant
' Retour :
' 1 s'il n'y a rien dans la table ;
' le Nombre maximum +1 s'il y a une suite ininterrompue de nombres ;
' la valeur du nombre manquant en cas de trou.
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Dim
sSQL As
String
Dim
rs As
DAO.Recordset
Dim
n As
Long
' Chaîne SQL en fonction de LeChamp et de LaTable, retournant NULL ou le numéro du trou
sSQL =
"Select Min(["
&
LECHAMP &
"]-1) As NextID From "
&
LATABLE &
" As T1 "
sSQL =
sSQL &
"Where (((["
&
LECHAMP &
"]-1)>0) And (((Select ["
&
LECHAMP &
"] "
sSQL =
sSQL &
"From "
&
LATABLE &
" T2 "
sSQL =
sSQL &
"Where T2.["
&
LECHAMP &
"]=T1.["
&
LECHAMP &
"]-1)) Is Null));"
Set
rs =
CurrentDb.OpenRecordset
(
sSQL, dbOpenSnapshot)
' Nbre d'enregistrements dans laTable
n =
DCount
(
"["
&
LeChamp &
"]"
, "["
&
LaTable &
"]"
)
If
n =
0
Then
'S'il n'y a pas d'enregistrement, mettre 1
NextID =
1
ElseIf
IsNull
(
rs
(
0
)) Then
'Si la requête ne renvoie rien, incrémenter de 1 le maximum
NextID =
DMax
(
"["
&
LeChamp &
"]"
, "["
&
LaTable &
"]"
) +
1
Else
NextID =
rs
(
0
) 'Sinon, il y a un trou. Renvoyer la valeur du trou
End
If
End
Function
Lien : Comment réinitialiser un champ de type NuméroAuto ?
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 créer dans la table un index multichamp et définir sa propriété unique à "oui".
Pour créer l'index :
1) Afficher la table en mode création ;
2) Menu Affichage >> Index ;
3) Sélectionner dans la colonne "Nom du champ", tous les champs concernés en laissant vides les champs de la colonne "Nom de l'index", sauf le premier champ, celui où commence la liste car il faut y inscrire le nom de l'index multichamp.
Function
ModifTable
(
)
'Gestion d'erreur pour garantir la mise à jour de l'écran
On
Error
GoTo
GestionErreur
' Empêche la mise à jour de l'écran
DoCmd.Echo
False
' Ouvre la table en mode création
DoCmd.OpenTable
"maTable"
, acViewDesign
' Change la propriété caption du champ 'colonne2'
CurrentDb.TableDefs
(
"maTable"
)(
"colonne2"
).Properties
(
"caption"
).Value
=
"nouvelle légende"
' Ferme la table en sauvegardant
DoCmd.Close
acTable, "maTable"
, acSaveYes
Exit_function
:
DoCmd.Echo
True
Exit
Function
GestionErreur
:
MsgBox
Err
.Description
Resume
Exit_function
End
Function
Il vous faut utiliser ALTER en SQL.
Alter Table [TABLE] Alter Column [NOMCHAMP] [Type
];
En utilisant DAO.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Puis dans un module :
Function
NbDeChamps
(
NomTable as
string
) As
Integer
On
error
goto
err
Dim
Db As
DAO.Database
Dim
T As
DAO.TableDef
Set
Db=
CurrentDb
Set
T=
Db.Tabledefs
(
NomTable)
NbDeChamps=
T.fields.count
err
:
End
Function
Puis pour connaître le nombre de champs de la table "essai" :
MsgBox
NbDeChamps
(
"essai"
)
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Méthode DAO
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Sub
addDefault (
)
Dim
fldDate As
Field
Set
fldDate =
CurrentDb.TableDefs
!Clients.CreateField
(
"DateSignature"
,dbDate)
fldDate.DefaultValue
=
"Now()"
CurrentDb.TableDefs
(
"Clients"
).Fields.Append
fldDate
End
Sub
Méthode SQL Par exemple pour un champ booléen :
ALTER TABLE Clients ADD COLUMN chkSigne YESNO;
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Tout d'abord ajouter les références suivantes dans votre projet :
Microsot ADO Ext 2.X for dll and security
Microsof ActiveX Data Object 2.X Library.
Ensuite dans un module, écrire le code suivant :
Function
RenommerChamp
(
NomTable As
String
, Ancien As
String
, Nouveau As
String
) As
Boolean
On
Error
GoTo
err
:
Dim
MCat As
New
ADOX.Catalog
Dim
MTable As
ADOX.Table
Dim
MField As
ADOX.Column
Set
MCat.ActiveConnection
=
CurrentProject.Connection
Set
MTable =
MCat.Tables
(
NomTable)
Set
MField =
MTable.Columns
(
Ancien)
MField.Name
=
Nouveau
RenommerChamp =
True
err
:
Set
MCat =
Nothing
Set
MTable =
Nothing
Set
MField =
Nothing
End
Function
Utilisation :
MsgBox
RenommerChamp
(
"produit"
, "stock"
, "Stock1"
)
Renomme le champ stock de la table produit en stock1 et affiche true si l'opération a réussi, false sinon.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Dans un module placer le code suivant :
Public
sub
RenommerChamp
(
PTable as
string
,POld as
string
,PNew as
String
)
On
error
goto
err
:
Dim
VTable as
DAO.Tabledef
Dim
VField as
DAO.Field
set
VTable=
currentDb.TableDefs
(
PTable)
set
VField=
VTable.Fields
(
POld)
VField.Name
=
PNew
set
VField=
Nothing
set
VTable=
Nothing
exit
sub
err
:
msgbox
"L\'action renommer le champ a échoué"
End
Sub
Voici comment renommer le champ test de la table MaTable en essai
RenommerChamp "MaTable"
,"test"
,"essai"
Lien : Comment renommer un champ en SQL ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
C'est impossible en SQL sous Access. Il faut utiliser DAO ou ADO (voir liens ci-dessous).
Lien : Comment renommer un champ avec DAO ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Tout d'abord ajouter les références suivantes dans votre projet :
Microsot ADO Ext 2.X for dll and security ;
Microsof ActiveX Data Object 2.X Library.
Ensuite dans un module, écrire le code suivant :
Function
SupprimerChamp
(
NomTable As
String
, NomChamp) As
String
On
Error
GoTo
err
Dim
MCat As
New
ADOX.Catalog
Set
MCat.ActiveConnection
=
CurrentProject.Connection
MCat.Tables
(
NomTable).Columns.Delete
(
NomChamp)
SupprimerChamp =
True
err
:
Set
MCat =
Nothing
End
Function
Utilisation :
MsgBox
SupprimerChamp
(
"Produit"
, "C1"
)
Ceci affiche true si le champ C1 a été correctement supprimé de la table Produit.
En règle générale on utilise du numérique lorsque l'on a des calculs à faire dessus (quantité, prix, compteur...), sinon on utilise du texte. Donc ici, le code postal se mettra au format texte.
Tout d'abord ajouter les références suivantes dans votre projet :
Microsot ADO Ext 2.X for dll and security Microsof ActiveX Data Object 2.X Library.
Function
ExisteChamp
(
NomTable As
String
, NomChamp As
String
) As
Boolean
On
Error
GoTo
err
:
Dim
MCat As
New
ADOX.Catalog
Dim
MTable As
ADOX.Table
Dim
MField As
ADOX.Column
Set
MCat.ActiveConnection
=
CurrentProject.Connection
Set
MTable =
MCat.Tables
(
NomTable)
Set
MField =
MTable.Columns
(
NomChamp)
ExisteChamp =
True
err
:
Set
MCat =
Nothing
Set
MTable =
Nothing
Set
MField =
Nothing
End
Function
Utilisation :
Debug.print
ExisteChamp
(
"Produit"
, "stock"
)
Affiche dans la fenêtre de débogage True si le champ existe dans la table Produit , false sinon.
Il faut utiliser la propriété InputMask du champ, exemple :
Forms!MonFormulaire!Téléphone.InputMask
=
"##-##-##-##-##"
Vous ne devriez pas mettre de champ calculé dans une table Access.
La maintenance de ces derniers n'est pas toujours efficace.
Vous devez donc faire une requête.
Dans cette requête, prenez tous les champs de la table et faites un champ calculé (ex. : Select Champ1 + Champ2 From ...). Utilisez également la fonction vraifaux() si besoin est (afin de ne pas diviser par 0 par exemple).
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Dim
db As
DAO.Database
, tdf As
DAO.TableDef
, fld As
DAO.Field
Dim
strDescription As
String
Set
db =
CurrentDb
On
Error
GoTo
GestionErreur
For
Each
tdf In
db.TableDefs
For
Each
fld In
tdf.Fields
strDescription =
fld.Properties
(
"Description"
)
If
MsgBox
(
"Nom : "
&
fld.Name
&
vbCrLf
&
vbCrLf
&
_
"Description : "
&
strDescription, _
vbOKCancel
, _
"Champs de la table : "
&
tdf.Name
) =
vbCancel
Then
Exit
Sub
Next
fld
Next
tdf
Set
fld =
Nothing
Set
tdf =
Nothing
Set
db =
Nothing
Exit
Sub
GestionErreur
:
Select
Case
Err
.Number
Case
3270
strDescription =
""
Resume
Next
Case
Else
MsgBox
"Erreur inconnue."
, vbCritical
Set
fld =
Nothing
Set
tdf =
Nothing
Set
db =
Nothing
exit
sub
End
Select
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Le souci c'est qu'une clé primaire peut être composée.
Dans un module :
Public
Function
NomClePrimaire
(
NomTable As
String
) As
String
On
Error
GoTo
err
Dim
oInd As
DAO.Index
Dim
oDb As
DAO.database
Dim
oTbl As
DAO.tabledef
Dim
oFld As
DAO.Field
Set
oDb =
CurrentDb
Set
oTbl =
oDb.TableDefs
(
NomTable)
' Parcourt les index
For
Each
oInd In
oTbl.Indexes
' S'il s'agit d'une clé primaire, alors traiter
If
oInd.Primary
Then
For
Each
oFld In
oInd.Fields
NomClePrimaire =
NomClePrimaire &
oFld.Name
&
","
Next
oFld
Exit
For
End
If
Next
oInd
' Enlève la dernière virgule
NomClePrimaire =
Left
(
NomClePrimaire, Len
(
NomClePrimaire) -
1
)
Exit
Function
err
:
End
Function
Utilisation :
Msgbox
NomClePrimaire
(
"MaTable"
)
Dans le cas d'une clé primaire composée, cela retourne le nom des champs séparés par des virgules.
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Dans la table, quand vous sélectionnez le champ qui doit être numérique, vous devez avoir :
- Taille du champ : réel simple
- Format : standard
- Décimales : 3
Ainsi, si le nombre stocké est 16, il sera affiché : 16.000.
ALTER TABLE <
table1>
ALTER COLUMN <
champ1>
<
typeChamp1>
DEFAULT
<
valeurParDéfaut>
Il faut ajouter la référence Microsoft ADO Ext. For DDL and Security à votre projet puis travailler avec les objets ADOX.Key.
Exemple :
Sub
PrimaryKeyADO
(
)
Dim
oCat As
ADOX.Catalog
Dim
oTbl As
ADOX.Table
Dim
oKey As
ADOX.Key
' Instancie un nouvel objet ADOX.Catalog
Set
oCat =
New
ADOX.Catalog
' Lie le catalogue à la base de données
Set
oCat.ActiveConnection
=
CurrentProject.Connection
' Accède à la table
Set
oTbl =
oCat.Tables
(
"MaTable"
)
' Crée une nouvelle clé primaire
Set
oKey =
New
ADOX.Key
' Affecte les différentes propriétés
With
oKey
.Name
=
"PK_MaTable"
.Type
=
adKeyPrimary
'Ajoute les trois champs à la clé primaire
With
.Columns
.Append
"champ1"
.Append
"champ2"
.Append
"champ3"
End
With
End
With
' Ajoute la clé primaire à la table
oTbl.Keys.Append
oKey
End
Sub
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library puis travailler avec les objets DAO.Index.
Exemple :
Sub
PrimaryKey
(
)
Dim
oDb As
DAO.Database
Dim
oTbl As
DAO.TableDef
Dim
oIdx As
DAO.Index
' Instancie un objet Database courant
Set
oDb =
CurrentDb
' Accède à la table
Set
oTbl =
oDb.TableDefs
(
"MaTable"
)
' Crée la clé primaire sur les champs :
' champ1, champ2, champ3
Set
oIdx =
oTbl.CreateIndex
(
"PK_MaTable"
)
With
oIdx
.Fields.Append
.CreateField
(
"Champ1"
)
.Fields.Append
.CreateField
(
"Champ2"
)
.Fields.Append
.CreateField
(
"Champ3"
)
.Primary
=
True
.Required
=
True
End
With
oTbl.Indexes.Append
oIdx
End
Sub
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Si votre champ est de type numérique entier long, vous pouvez utiliser une méthode peu documentée du moteur Jet : la fonction GenUniqueId
Créer votre champ, définissez son type et fixer sa valeur par défaut à :
=GenUniqueId()
Sous DAO, il s'agit de la propriété OrdinalPosition de l'objet Field.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Dim
db As
DAO.Database
Dim
fld As
DAO.Field
Dim
tbl As
DAO.TableDef
Set
db =
CurrentDb
Set
tbl =
db.TableDefs
(
"essai"
)
Set
fld =
tbl.Fields
(
"c1"
)
fld.OrdinalPosition
=
3
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
La propriété Valeur par défaut directement dans les propriétés du champ, dans la structure de la table.
Il n'est pas possible de créer un champ de type hypertexte via un SQL ALTER, puisqu'à ma connaissance les possibilités sont "réduites" à cela :
Texte : VARCHAR (255 caractères), CHAR(n) ou TEXT(n) (n caractères), LONGTEXT (mémo, 32K max.) ;
Fichier binaire : LONGBINARY (Objet OLE) ;
Compteur : COUNTER (NuméroAuto).Booléen : BIT ;
Nombre entier : SHORT (entier), SMALLINT (entier), LONG (entier long), INTEGER (entier long), BYTE (octet) ;
Nombre réel : SINGLE (réel simple), DOUBLE (réel double), NUMERIC (réel double) ;
Monétaire : CURRENCY, MONEY ;
Date/Heure : DATE, TIME, DATETIME ;
Pour faire cela je vous renvoie vers le tuto DAO de Tofalu dans la partie 4 au paragraphe 4.4.2.
Lien : Définition et manipulation de données avec DAO par Tofalu
C'est une des impossibilités avec DAO.
Seul remède : ADO
Pour ce code, il est nécessaire de mettre les références : Microsot ADO Ext 2.X for dll and security et Microsoft ActiveX Data Object 2.X Library.
CurrentProject.Connection.Execute
"ALTER TABLE TABLE1 ADD COLUMN ESSAI3 DECIMAL(18,0)"
L'erreur 3314 nous indique qu'on essaie de remplir un enregistrement alors
qu'un des champs (voir plusieurs) de la table ne peut être null.
En VBA ça correspond à la propriété Required de l'objet Field :
si Required = True, le champ ne peut pas accepter de Null.
Sub
NoNull
(
)
Dim
db As
DAO.Database
, tdf As
DAO.TableDef
, fld As
DAO.Field
Dim
strDescription As
String
Set
db =
CurrentDb
Set
tdf =
db.TableDefs
(
"maTABLE"
)
For
Each
fld In
tdf.Fields
If
fld.Required
=
True
Then
If
IsNull
(
Me.Controls
(
fld.Name
)) Then
MsgBox
"REMPLISSEZ LE CHAMP"
&
fld.Name
End
If
Next
fld
Set
fld =
Nothing
Set
tdf =
Nothing
Set
db =
Nothing
Exit
Sub
Quand vous disposez d'une grande table, il est parfois nécessaire de trier les champs par ordre alphabétique pour s'y retrouver facilement.
Cela peut être fait en VBA avec DAO en attribuant la même propriété OrdinalPosition à tous les champs.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Sub
ranger
(
)
Dim
db As
DAO.Database
Dim
fld As
DAO.Field
Dim
tbl As
DAO.TableDef
Set
db =
CurrentDb
Set
tbl =
db.TableDefs
(
"essai"
)
For
Each
fld In
tbl.Fields
fld.OrdinalPosition
=
1
Next
End
Sub
En utilisant plusieurs valeurs de OrdinalPosition, il est possible de créer des groupes. Exemple pour afficher les clés primaires en haut de la liste des champs :
Sub
ranger
(
)
Dim
db As
DAO.Database
Dim
fld As
DAO.Field
Dim
tbl As
DAO.TableDef
Set
db =
CurrentDb
Set
tbl =
db.TableDefs
(
"essai"
)
For
Each
fld In
tbl.Fields
If
IsPrimary
(
fld, tbl) Then
fld.OrdinalPosition
=
1
Else
fld.OrdinalPosition
=
2
End
If
Next
End
Sub
Function
IsPrimary
(
fld As
DAO.Field
, tbl As
DAO.TableDef
) As
Boolean
On
Error
GoTo
err
Dim
ind As
DAO.Index
Dim
tfld As
DAO.Field
For
Each
ind In
tbl.Indexes
If
ind.Primary
Then
Set
tfld =
ind.Fields
(
fld.Name
)
IsPrimary =
True
End
If
Next
ind
err
:
End
Function
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?