FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
Sommaire→Tables et Champs→Tables- 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 FunctionLien : 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 FunctionLien : 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").RecordCountTout 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 FunctionUtilisation :
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 FunctionUtilisation :
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 FunctionLien : 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 FunctionUtilisation :
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 FunctionLien : 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 FunctionLien : 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 SubLien : 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 SubLa 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").RefreshLinkLe 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 VieilleColonneLa 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 FunctionL'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 IfLien : Comment tester l'existence d'une requête en VBA et la supprimer ?
Lien : Comment savoir si une table existe ?



