FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- La création d'un champ dans une table liée m'est refusée.
- Comment créer un formulaire instantané par rapport à une table X en VBA ?
- [VBA] Comment masquer une table ?
- Comment faire pour trouver le plus grand nombre contenu dans une table ?
- Rétablir les liaisons des tables liées après déplacement d'une base fractionnée
- Comment savoir quelle valeur vient de prendre un champ NuméroAuto après l'ajout d'un enregistrement ?
- Comment créer son propre NuméroAuto ?
- Est-il possible de changer le nom d'une table, champ ou requête et que chaque partie de code basé sur un de ces éléments soit automatiquement mise à jour ?
- Comment récupérer la valeur du dernier NuméroAuto inséré dans une table ?
- Comment réinitialiser un champ de type NuméroAuto ?
- Comment supprimer les tables d'erreurs ?
Vous ne pouvez pas modifier la structure d'une table liée. Il faut créer le champ directement dans la table source.
Si la table est une table Access (Jet), vous pouvez modifier la structure de la table en VBA, par exemple en DAO.
_ Première possibilité :
DoCmd.SelectObject
acTable, "VotreTable"
, True
DoCmd.RunCommand
acCmdNewObjectAutoForm
_ Seconde possibilité :
Sub
NouvForm
(
ByVal
NomTable As
String
)
Dim
frm As
Form
Set
frm =
CreateForm
With
frm
.RecordSource
=
NomTable
.RecordsetType
=
0
.Caption
=
NomTable
.DefaultView
=
2
.ViewsAllowed
=
2
.ScrollBars
=
0
.NavigationButtons
=
True
End
With
AjouterTB frm, NomTable
DoCmd.Restore
DoCmd.Close
acForm, frm.Name
, acSaveYes
End
Sub
Sub
AjouterTB
(
f As
Form, s As
String
)
Dim
rs As
Recordset
Dim
fld As
Field
Dim
c As
Control
Dim
l As
Control
Dim
i As
Long
Set
rs =
CurrentDb.OpenRecordset
(
s, dbOpenSnapshot)
For
Each
fld In
rs.Fields
Set
c =
CreateControl
(
f.Name
, acTextBox, acDetail, ""
, fld.Name
, 1440
, 360
*
i, 1440
, 360
)
Set
l =
CreateControl
(
f.Name
, acLabel, , c.Name
, fld.Name
, 0
, 360
*
i)
i =
i +
1
Next
End
Sub
Application.SetHiddenAttribute
acTable, NomdeTaTable, True
Si la table n'est pas trop grosse
on peut utiliser Dmax dans la propriété source contrôle du champ txt_1
Source contrôle.....=MaxDom("nombre";"[Chiffre]")
PS: Cette solution est moins rapide que la deuxième pour les tables contenant beaucoup d'enregistrements, car les fonctions domaine (Dmax, dlookup, dmin, etc. sont très lentes par rapport à un Recordset)
On crée un Recordset
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Dim
rst As
DAO.Recordset
Set
rst =
CurrentDb.OpenRecordset
(
"SELECT MAX([Nombre])AS Maximum FROM [Chiffre]"
)
Me!txt_1 =
rst!Maximum 'txt_1 est une zone de texte
rst.Close
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.
Comme leurs noms l'indiquent, la première fonction ne permet de lier qu'une seule table avec un nom donné, alors que la seconde liera toutes les tables.
Vous devrez bien évidemment modifier ces codes afin qu'ils répondent parfaitement à votre attente.
Voici les variables et valeurs que vous aurez besoin de mettre à jour :
strMotPasse, strCheminBd, strNomTable
Sub
lier
(
)
Dim
strMotPasse As
String
Dim
strCheminBd As
String
Dim
strNomTable As
String
Dim
strConnect As
String
Dim
oDb As
DAO.Database
Dim
oTbl As
DAO.TableDef
' Définit mot passe, nom table, chemin base de données
strMotPasse =
"pass"
strCheminBd =
"c:\test.mdb"
strNomTable =
"Table1"
' Instancie l'objet Database
Set
oDb =
CurrentDb
' Définit la chaîne de connexion permettant la liaison
strConnect =
"MS Access;pwd="
&
strMotPasse &
";DATABASE="
&
strCheminBd
' Crée la nouvelle table
Set
oTbl =
oDb.CreateTableDef
(
strNomTable)
With
oTbl
.Connect
=
strConnect
.SourceTableName
=
strNomTable
End
With
' Ajoute la table à la base de données
oDb.TableDefs.Append
oTbl: oDb.TableDefs.Refresh
End
Sub
Sub
lierToutes
(
)
Dim
strMotPasse As
String
Dim
strCheminBd As
String
Dim
strConnect As
String
Dim
strNomsTables
(
) As
String
Dim
strTemp As
String
Dim
i As
Integer
Dim
oDb As
DAO.Database
Dim
oDbSource As
DAO.Database
Dim
oTbl As
DAO.TableDef
Dim
oTblSource As
DAO.TableDef
' Définir mot passe et chemin base de données
strMotPasse =
"pass"
strCheminBd =
"c:\test.mdb"
' Définit la chaîne de connexion permettant la liaison des tables
strConnect =
"MS Access;pwd="
&
strMotPasse &
";DATABASE="
&
strCheminBd
' Instancie l'objet Database de la base courante
Set
oDb =
CurrentDb
' Instancie l'objet Database de la base protégée
Set
oDbSource =
DBEngine.OpenDatabase
(
strCheminBd, True
, True
, strConnect)
' Parcourt l'ensemble des tables de la base de données protégée
' et stocke leur nom
For
Each
oTblSource In
oDbSource.TableDefs
' Ignore les tables system
If
(
oTblSource.Attributes
And
dbSystemObject) =
0
Then
strTemp =
strTemp &
oTblSource.Name
&
"|"
End
If
Next
' Ferme la base de données source (impératif pour la liaison)
oDbSource.Close
: Set
oDbSource =
Nothing
' Parcourt le tableau de noms de tables
strNomsTables =
Split
(
Left
(
strTemp, Len
(
strTemp) -
1
), "|"
)
For
i =
0
To
UBound
(
strNomsTables)
' Crée une nouvelle table dans la base de données courante
Set
oTbl =
oDb.CreateTableDef
(
strNomsTables
(
i))
' Lie les deux tables
oTbl.Connect
=
strConnect
oTbl.SourceTableName
=
strNomsTables
(
i)
' Ajoute la table à la base de données
oDb.TableDefs.Append
oTbl
Next
i
' Rafraichit la liste des tables
oDb.TableDefs.Refresh
End
Sub
Lien : Comment avec l'API GetOpenFileNameA ouvrir plusieurs fichiers à la fois ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Lien : Comment utiliser une application en mode multi-utilisateur par Dolphy35
Vous venez d'ajouter un enregistrement et vous voulez avoir le NuméroAuto qui vient de s'incrémenter. L'obtention de ce numéro est différente selon qu'il s'agit de la méthode DAO ou ADO.
Sous DAO le numéro est disponible immédiatement après l'appel de AddNew.exemple (pour obtenir le code de la ville) :
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
rst.AddNew
Debug.print
rst
(
"Code Ville"
) ' <---' Vous obtenez le code qui est un NuméroAuto
' Ajout d'autres informations
rst
(
"Nom Ville"
) =
"TEST"
rst
(
"Code postal"
) =
"57000"
rst.Update
Par contre avec la méthode ADO le code est disponible après l'appel de Update. Exemple :
Pour exécuter ce code, il faut activer les références : Microsot ADO Ext 2.X for dll and security et Microsof ActiveX Data Object 2.X Library.
rst.AddNew
rst
(
"Nom Ville"
) =
"TEST"
rst
(
"Code postal"
) =
"57000"
rst.Update
Debug.Print
rst
(
"Code ville"
)
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.
Une table Table1 avec un champ num (clé primaire) de type Long Integer.
Un formulaire Form1 lié à la Table1 avec un contrôle Num (verrouillé) lié au champ Num de table1 :
Et sur l'événement BeforeInsert du formulaire :
Private
Sub
Form_BeforeInsert
(
Cancel As
Integer
)
Dim
rs As
DAO.Recordset
Set
rs =
CurrentDb.OpenRecordset
(
Me.RecordSource
, dbOpenSnapshot)
If
rs.EOF
Then
Me!Num =
1
Else
rs.MoveLast
Me!Num =
rs!Num +
1
End
If
rs.Close
Set
rs =
Nothing
End
Sub
et pour réinitialiser les valeurs NuméroAuto :
Public
Function
Init_numeroAuto
(
)
Dim
rs As
DAO.Recordset
Dim
i As
Long
On
Error
Resume
Next
Set
rs =
CurrentDb.OpenRecordset
(
"Table1"
, dbOpenDynaset)
i =
1
While
Not
(
rs.EOF
)
rs.Edit
rs!Num =
i
rs.Update
rs.MoveNext
i =
i +
1
Wend
rs.Close
Set
rs =
Nothing
End
Function
ATTENTION : Ces fonctions sont valables pour des applications monopostes. Attention en réseau aux accès concurrents et simultanés.
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 cocher l'option : Outils > Options > onglet Général > Correction automatique de nom, Access fera la mise à jour dans la base en cours.
Ça veut dire hélas, que si vos tables sont dans une base séparée, seule cette base sera mise à jour, pas l'application. C'est un problème qu'on souhaite voir résolu dans une prochaine version d'Access.
Une autre option :
Dans le code, une recherche/remplacement globale permet de tout remplacer d'un coup, mais faut chercher dans chaque requête, formulaire, c'est un travail assez pénible.
Première solution, on cherche tout simplement le NuméroAuto le plus élevé :
Select
Max
(
monchampAuto) From matable;
Cette seconde solution ne fonctionnera qu'à partir d'Access 2000.
Select
@@identity From maTable;
Info : La variable @@IDENTITY est une variable globale SQL qui permet de retrouver la dernière valeur utilisée pour un numéro automatique d'une table.
Il vous suffit pour cela de vider la table en question et de compacter la base de données.
Mettez par exemple les enregistrements dans une table temporaire.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Function
PurgeErreurs
(
)
Dim
tbl As
TableDef
For
Each
tbl In
CurrentDb.TableDefs
If
InStr
(
tbl.Name
, "importerrors"
) or
Instr
(
tbl.Name
, "PasteErrors"
) Then
Debug.Print
"Effacement de "
&
tbl.Name
CurrentDb.TableDefs.Delete
tbl.Name
End
If
Next
tbl
Set
tbl =
Nothing
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 ?