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 attacher une table Oracle ?
- Comment connaître la date de création d'une table en DAO ?
- Comment connaître la date de dernière modification d'une table en DAO ?
- Quelle est la différence entre table liée et table importée ?
- Comment exporter plusieurs tables en même temps ?
- Est-il possible de modifier les tables système ?
- Comment connaître le nombre d'enregistrements d'une table ou d'une requête ?
- Comment renommer une table avec ADO ?
- Comment supprimer une table avec ADO ?
- Comment faire pour que toutes les tables liées ne soient plus présentes dans ma base de données ?
- Comment savoir si une table existe ?
- Comment tester l'existence d'une table avec ADO ?
- Comment afficher les tables masquées ?
- Comment fusionner deux tables, en ne gardant pas les enregistrements de la table 2 identiques à ceux de la table 1 ?
- Comment ouvrir une table en mode exclusif ?
- Comment lier des tables en VBA dans une base de données protégée par un mot de passe ?
- Comment savoir si une table est verrouillée ?
- Comment récupérer le chemin d'accès à la base contenant les tables par ADO ?
- Comment obtenir la clé primaire d'une table en ADO ?
- Comment mettre à jour des tables liées après modifications ?
- Comment renommer une table en SQL ?
- Comment renommer une colonne en SQL ?
- Comment supprimer une table si elle existe ?
Dans Panneau de configuration/Outils d'administration/Source de données ODBC créez un DSN via l'administrateur de source de données.
Sur l'onglet system DSN.
Cliquez sur Add.
Choisissez dans la liste le bon pilote (au choix celui de Microsoft ou celui d'Oracle).
Vous avez trois informations à renseigner :
- le nom du DSN que vous voulez créer ;
- le nom du User ;
- le nom de la source (chaîne que vous utilisez pour vous connecter via SQL Plus (3e zone) et que vous retrouvez dans votre tnsnames.ora.
Dans Access, dans l'onglet Tables, faites Nouveau/Attacher la table.
Choisissez dans type de fichier source de données ODBC, vous choisissez le DSN que vous venez de créer puis sélectionnez la ou les tables à attacher.
Lien : Comment utiliser Access pour exécuter des requêtes sur d'autres types de base de données ?
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Coller ce code dans un nouveau module :
Public
function
DateCreation
(
PTable as
string
) as
Date
On
error
goto
err
Dim
DB as
DAO.Database
Dim
T as
DAO.Tabledef
Set
DB=
CurrentDb
Set
T=
DB.TableDefs
(
PTable)
DateCreation=
T.DateCreated
Goto
fin:
err
:
Msgbox
"Impossible d\'accéder à la table"
fin
:
Set
DB=
nothing
Set
T=
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 ?
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Coller le code suivant dans un nouveau module :
Public
function
DateMaj
(
PTable as
string
) as
Date
On
error
goto
err
Dim
DB as
DAO.Database
Dim
T as
DAO.Tabledef
Set
DB=
CurrentDb
Set
T=
DB.TableDefs
(
PTable)
DateMaj=
T.LastUpdated
Goto
fin:
err
:
Msgbox
"Impossible d\'accéder à la table"
fin
:
Set
DB=
nothing
Set
T=
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 ?
Table importée : amène toute la table sur la base de données, elle n'aura aucun lien avec la table d'origine, si vous modifiez les données dans l'une, ça n'aura aucune répercussion dans l'autre.
Table liée : les tables liées ont les MÊMES DONNÉES. Si vous modifiez des données dans une, elles seront modifiées dans l'autre. En fait, les deux tables liées sont une seule et même table.
Il faut utiliser la commande DoCmd.TransferDatabase pour transférer une table.
Il vous suffit de créer un tableau contenant le nom de toutes les tables, et d'inclure la commande précédente dans une boucle qui lira un à un chaque nom de table.
Lien : Comment récupérer le nom des tables et de leurs champs ?
Non, d'ailleurs elles sont en lecture seule.
Pour une table ou bien une requête :
Dim
LaVariable As
Integer
LaVariable =
DCount
(
"monChamp"
,"NomTableOuNomRequete"
)
Ou bien (seulement pour une table) :
LaVariable =
Currentdb.TableDefs
(
"NomTable"
).RecordCount
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.
Puis dans un module, écrire le code suivant :
Function
RenommerTable
(
Ancien As
String
, Nouveau As
String
) As
Boolean
On
Error
GoTo
err
:
Dim
MCat As
New
ADOX.Catalog
Dim
MTable As
ADOX.Table
Set
MCat.ActiveConnection
=
CurrentProject.Connection
Set
MTable =
MCat.Tables
(
Ancien)
MTable.Name
=
Nouveau
RenommerTable =
True
err
:
Set
MCat =
Nothing
Set
MTable =
Nothing
End
Function
Utilisation :
MsgBox
RenommerTable
(
"Produit"
, "Produit2"
)
Affiche True si la table Produit a été renommée avec succès en Produit2. Renvoie False en cas d'échec.
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.
Puis dans un module, écrire le code suivant :
Function
SupprimerTable
(
NomTable As
String
) As
Boolean
On
Error
GoTo
err
Dim
MCat As
New
ADOX.Catalog
Set
MCat.ActiveConnection
=
CurrentProject.Connection
MCat.Tables.Delete
(
NomTable)
SupprimerTable =
True
err
:
Set
MCat =
Nothing
End
Function
Utilisation :
MsgBox
SupprimerTable
(
"test"
)
Affiche True si la table test a été correctement supprimée.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Public
Function
xKillLinks
(
)
Dim
BD As
DAO.Database
Set
BD =
CurrentDb
Dim
tb As
DAO.TableDef
For
Each
tb In
BD.TableDefs
If
left
(
tb.name
, 4
) <>
"MSys"
Then
If
Len
(
tb.connect
) >
0
Then
DoCmd.RunSQL
"DROP TABLE ["
&
tb.name
&
"] ;"
Debug.Print
"effacement de "
&
tb.name
&
" -=#=> "
&
tb.connect
End
If
End
If
Next
tb
End
Function
Une méthode parmi d'autres : ici par capture d'erreur.
Function
ExistTable2
(
ByVal
strTabl As
String
) As
Boolean
Dim
str As
String
On
Error
GoTo
err01
str =
CurrentDb.TableDefs
(
strTabl).name
ExistTable2=
True
Exit
Function
err01
:
Select
Case
Err
.Number
Case
3265
ExistTable2 =
False
End
Select
End
Function
Lien : Comment tester l'existence d'une requête en VBA et la supprimer ?
Lien : Comment supprimer une table si elle existe ?
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.
Puis dans un module, écrire le code suivant :
Function
ExisteTable
(
NomTable As
String
) As
Boolean
On
Error
GoTo
err
:
Dim
MCat As
New
ADOX.Catalog
Dim
MTable As
ADOX.Table
Set
MCat.ActiveConnection
=
CurrentProject.Connection
Set
MTable =
MCat.Tables
(
NomTable)
ExisteTable =
True
err
:
Set
MCat =
Nothing
Set
MTable =
Nothing
End
Function
Utilisation :
Debug.print
ExisteTable
(
"Produit"
)
Affiche dans la fenêtre de débogage True si la table Produit existe, False sinon.
Pour afficher les tables et autres objets masqués, rendez-vous dans
le menu Outils, puis Options. Activez la case : Objets masqués.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Un moyen assez simple et de créer une table identique à la première mais vide avec vos champs qui ne doivent pas être identiques en clé primaire.
Ensuite, via VBA, vous insérez les données d'une table vers l'autre.
Par exemple :
Sub
Insertion
(
oRst1 As
DAO.Recordset
, orst2 As
DAO.Recordset
)
On
Error
GoTo
err
Dim
Fld As
DAO.Field
orst2.AddNew
For
Each
Fld In
oRst1.Fields
If
(
Fld.Attributes
And
dbAutoIncrField) =
0
Then
orst2.Fields
(
Fld.Name
).Value
=
Fld.Value
End
If
Next
Fld
orst2.Update
err
:
End
Sub
Sub
copier
(
)
Dim
NomTable1 As
String
, NomTable2 As
String
Dim
oRst1 As
DAO.Recordset
, orst2 As
DAO.Recordset
Dim
odb As
DAO.Database
Dim
Message As
String
Set
odb =
currentdb
NomTable1 =
"TblClient"
NomTable2 =
"TblClientSansDoublons"
Set
oRst1 =
odb.OpenRecordset
(
NomTable1)
Set
orst2 =
odb.OpenRecordset
(
NomTable2)
While
Not
oRst1.EOF
Insertion oRst1, orst2
oRst1.MoveNext
Wend
If
Not
orst2.EOF
Then
orst2.MoveLast
Message =
"Opération terminée"
&
vbCrLf
&
vbCrLf
&
_
"La table source comportait : "
&
oRst1.RecordCount
&
" enregistrement(s),"
&
vbCrLf
&
_
"la table de destination en comporte "
&
orst2.RecordCount
MsgBox
Message, vbInformation
, "MAJ terminée"
End
Sub
Pour que cela fonctionne vous devez ajouter la référence Microsoft DAO à votre projet.
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.
Function
Ouvrir_Table_Exclusif (
Bd As
Database, Ma_Table As
String
) As
Integer
Dim
rcd As
DAO.Recordset
On
Error
GoTo
Erreur
Set
rcd =
Bd.OpenRecordset
(
Ma_Table, dbOpenTable, dbDenyRead)
' -- Mes traitements en mode exclusif
Rcd.Close
Set
rcd =
Nothing
Exit
Function
Erreur
:
Msgbox
Err
.Number
&
vbcrlf
&
Err
.Description
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 ?
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Il faut utiliser DAO pour créer l'objet TableDef représentant la nouvelle table.
L'emplacement de la source et le mot de passe seront inscrits dans la propriété Connect de cet objet.
Exemple pour lier une table :
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=C:\test.mdb"
' 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
Exemple pour lier toutes les tables d'une base de données :
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éfinit mot passe, nom table, 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=C:\test.mdb"
' 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 système
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
Pour que cela fonctionne, il ne faut pas oublier d'ajouter la référence Microsoft DAO au projet.
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 code ouvre un Recordset avec un lockedit Optimistic et une option DenyWrite, en cas d'erreur on suppose que ça signifie que la table n'est pas accessible en écriture.
Dim
db As
DAO.Database
Dim
rs As
DAO.Recordset
On
Error
GoTo
ILT_Err
Set
db =
CurrentDb
(
)
Set
rs =
db.OpenRecordset
(
strTbl, dbOpenTable, dbDenyWrite, dbOptimistic)
rs.Close
IsLockedTable =
False
ILT_End
:
Set
rs =
Nothing
Set
db =
Nothing
Exit
Function
ILT_Err
:
Select
Case
Err
.Number
Case
3008
' La table est verrouillée par un autre processus
IsLockedTable =
True
GoTo
ILT_End
Case
Else
Err
.Raise
Err
.Number
, Err
.Source
, Err
.Description
, Err
.HelpFile
, Err
.HelpContext
IsLockedTable =
True
GoTo
ILT_End
End
Select
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 ?
Ce code permet de retrouver le chemin des tables liées de la BDD :
Public
Sub
Chemin_Tables
(
)
Dim
cnDB As
New
ADODB.Connection
Dim
catDB As
New
ADOX.Catalog
Dim
tblDB As
ADOX.Table
Set
cnDB =
CurrentProject.Connection
Set
catDB.ActiveConnection
=
cnDB
For
Each
tblDB In
catDB.Tables
If
tblDB.Type
=
"LINK"
Then
Debug.Print
tblDB.Name
Debug.Print
tblDB.Properties
(
"Jet OLEDB:Link Datasource"
)
End
If
Next
cnDB.Close
Set
cnDB =
Nothing
Set
tblDB =
Nothing
Set
catDB =
Nothing
End
Sub
Lien : Comment récupérer le chemin d'accès à la base contenant les tables ?
Cet exemple montre comment traiter la PrimaryKey et les propriétés uniques d'un index.
Le code crée une nouvelle table avec deux colonnes.
La PrimaryKey et les propriétés uniques sont employées pour faire référence à une colonne, la clef primaire, pour laquelle on ne permet pas des valeurs doubles.
Sub
PrimaryKeyX
(
)
Dim
catNorthwind As
New
ADOX.Catalog
Dim
tblNew As
New
ADOX.Table
Dim
idxNew As
New
ADOX.Index
Dim
idxLoop As
New
ADOX.Index
Dim
colLoop As
New
ADOX.Column
' Relier le catalogue
catNorthwind.ActiveConnection
=
"Provider=Microsoft.Jet.OLEDB.4.0;"
&
_
"data source=c:\Program Files\"
&
_
"Microsoft Office\Office\Samples\Northwind.mdb;"
' Nommer nouvelle table
tblNew.Name
=
"NewTable"
' Apposer un champ numérique et des textes à la nouvelle table.
tblNew.Columns.Append
"NumField"
, adInteger
, 20
tblNew.Columns.Append
"TextField"
, adVarWChar
, 20
' Apposer le nouvel index principal primaire sur la colonne de NumField
' à la nouvelle table
idxNew.Name
=
"NumIndex"
idxNew.Columns.Append
"NumField"
idxNew.PrimaryKey
=
True
idxNew.Unique
=
True
tblNew.Indexes.Append
idxNew
' Apposer un index sur TextField à la nouvelle table.
' Noter la technique différente : indication de l'index
' et du nom de colonne comme paramètres de la méthode d'apposition
tblNew.Indexes.Append
"TextIndex"
, "TextField"
' Apposer la nouvelle table
catNorthwind.Tables.Append
tblNew
With
tblNew
Debug.Print
tblNew.Indexes.Count
&
" Indexes in "
&
_
tblNew.Name
&
" Table"
' Énumérer la collection d'index.
For
Each
idxLoop In
.Indexes
With
idxLoop
Debug.Print
"Index "
&
.Name
Debug.Print
" Primary key = "
&
.PrimaryKey
Debug.Print
" Unique = "
&
.Unique
' Énumérer la collection de colonnes de chaque objet d'index.
Debug.Print
" Columns"
For
Each
colLoop In
.Columns
Debug.Print
" "
&
colLoop.Name
Next
colLoop
End
With
Next
idxLoop
End
With
' Supprimer la nouvelle table car c'est une démonstration
catNorthwind.Tables.Delete
tblNew.Name
Set
catNorthwind =
Nothing
End
Sub
La méthode RefreshLink n'est utilisable que sur des tables liées. Elle permet, après avoir modifié la propriété Connect, de rafraîchir les informations de connexion entre la table attachée et la source de données.
Pour ce code, il vous faut activer la référence : Microsoft DAO 3.x Object Library.
Dim
Db as
DAO.Database
Set
Db=
CurrentDb
Db.Tabledefs
(
"MaTable"
).RefreshLink
Le code suivant crée une nouvelle table avec toutes les données de la précédente
select
*
into
NouvTable from
AncienneTable;
Puis il ne reste plus qu'à supprimer l'ancienne table à l'aide de DROP TABLE en SQL
Il ne semble pas qu'Access permette de faire cela. La parade classique consiste à créer une nouvelle colonne et y déplacer les données :
ALTER
TABLE
MaTable ADD
COLUMN
NouvColonne Text
(
255
)
UPDATE
MaTable SET
NouvColonne =
VieilleColonne
ALTER
TABLE
MaTable DROP
COLUMN
VieilleColonne
La fonction suivante permet de tester si une table passée en paramètre existe et l'efface si c'est le cas et renvoie True, sinon la fonction renvoie False.
Pour ce code activer, la référence Microsoft DAO 3.x Object Library.
Collez cette fonction dans un nouveau module :
Function
Delete_Table
(
NomTable As
String
) As
Boolean
Dim
db As
DAO.Database
Dim
tbl As
DAO.TableDef
Delete_Table =
False
Set
db =
CurrentDb
For
Each
tbl In
db.TableDefs
If
tbl.Name
=
NomTable Then
db.TableDefs.Delete
(
tbl.Name
)
Delete_Table =
True
Exit
Function
Else
Delete_Table =
False
End
If
Next
tbl
End
Function
L'appel de la fonction est réalisé de cette façon :
Dim
tbl As
String
tbl =
"Table1"
If
Delete_Table
(
tbl) =
True
Then
MsgBox
"La table "
&
tbl &
" a bien été effacée."
Else
MsgBox
"Aucune table portant le nom de "
&
tbl &
" n'a été trouvée."
End
If
Lien : Comment tester l'existence d'une requête en VBA et la supprimer ?
Lien : Comment savoir si une table existe ?