Liste déroulante de Tables

alx781 Messages postés 3 Date d'inscription mercredi 28 avril 2010 Statut Membre Dernière intervention 28 mai 2012 - 28 avril 2010 à 14:34
c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 3 octobre 2013 - 29 avril 2010 à 03:34
Bonjour,

J'ai une liste déroulante dans un Formulaire, sauf que j'aimerais ( en code VBA ) qu'au lieu qu'elle m'affiche par exemple, les différents enregistrement d'un champ, qu'elle m'affiche les différentes Tables ouvertes dans le Fichier Access où il y a le Formulaire que j'utilise.
Puis si je sélectionne une Table de la liste, que les noms des Champs de celle-ci s'affichent dans des zones textes distinctes ( ex : NomChamp1 dans ZoneTexte1, NomChamp2 dans ZoneTexte2 etc... )

J'utilise Access 2007 et cela fait seulement une semaine que j'ai découvert Access et le Visual Basic donc je suis un Débutant en la matière, mais je dois faire celà pour mon stage donc si vous avez des idées je suis preneur n'hésitez pas à bien détailler,

Merci d'avance pour votre aide

Coordialement, Alex

1 réponse

c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 3 octobre 2013 1
29 avril 2010 à 03:34
Bonjour
Voici une fonction qui récupère dans des tables les informations des tables d'une base.
C'est en 2003 mais fonctionne en 2007

Function ListeTable()
'ListeTable id_Base_remote, type_base, clean
'
' Clean True> la table Liste_table est nettoyée pour les
' éléments appartenant à la base sélectionnée
'
'-----------------------------------------------------------------------------
Const Property_NonExistent = 3270
Dim dbs As Database
Dim Dbs_remote As Database
Dim str_dbs_remote As String
Dim Id_base_remote As Long
Dim T_base_remote As Recordset
Dim T_liste As Recordset
Dim T_liste_Champs As Recordset
Dim T_liste_Index As Recordset
Dim tdf As TableDef
Dim idx As index
Dim fld As Field
Dim iNumChamp As Integer
Dim inumTDF As Long
Dim inumIdx As Long
Dim Id_table As Long
Dim Hdebut As Date
Dim chMsg As String
Dim maxTdf As Long
Dim varRetournée As Variant
Dim retval As String
Dim attrib
Hdebut = Now()
Set dbs = CurrentDb()
str_dbs_remote = NomBaseclient
'initialisation barre progression
chMsg = " Liste tables ..."
maxTdf = base.CurrentDb.TableDefs.Count
varRetournée = SysCmd(acSysCmdInitMeter, chMsg, maxTdf)
dbs.Execute "delete * from Liste_table"
Set T_liste = dbs.OpenRecordset("Liste_table", , dbAppendOnly)
Set T_liste_Champs = dbs.OpenRecordset("Liste_table_champs", , dbAppendOnly)
Set T_liste_Index = dbs.OpenRecordset("Liste_table_index", , dbAppendOnly)
inumTDF = 0
For Each tdf In base.CurrentDb.TableDefs '''''permet d'explorer les tables et leur caractéristiques
T_liste.AddNew
T_liste![Id_base_remote] = Id_base_remote
T_liste![Num_TDF] = inumTDF
Id_table = inumTDF
'déterminer id_table
T_liste!Id_table = inumTDF
T_liste![nom] = tdf.Name
attrib = ""
If tdf.Attributes = 0 Then
attrib = "locale"
Else
If tdf.Attributes = 537001984 Then
attrib = "attachée ODBC"
End If
If tdf.Attributes = 1073741824 Then
attrib = "attachée DATABASE"
End If
If tdf.Attributes = 2 Then
attrib = "système"
End If
End If
T_liste![connecte] = tdf.Connect
T_liste![type] = tdf.Attributes
T_liste![LibType] = attrib
T_liste![Record_Count] = tdf.RecordCount
On Error GoTo errr
On Error Resume Next
T_liste![Id_base_remote] = Id_base_remote
T_liste![Id_base_attache] = -1
T_liste.Update
iNumChamp = 0
For Each fld In tdf.Fields ''''''permet d'explorer une table pour récupérer les champs et leur caractéristiques
T_liste_Champs.AddNew
T_liste_Champs![Id_base_remote] = 0
T_liste_Champs![Id_table] = inumTDF
T_liste_Champs![Num_TDF] = inumTDF
T_liste_Champs![position] = iNumChamp
T_liste_Champs![champ] = fld.Name
T_liste_Champs![longueur] = fld.Size
retval = FieldType(fld.type)
T_liste_Champs![type_champ] = retval
T_liste_Champs!nomtable = tdf.Name
T_liste_Champs![ChaîneVideAutorisée] = fld.AllowZeroLength
T_liste_Champs![Attributs] = fld.Attributes
T_liste_Champs![AautoincrField] = fld.Attributes And dbAutoIncrField
T_liste_Champs![AfixedField] = fld.Attributes And dbFixedField
T_liste_Champs![AupdatableField] = fld.Attributes And dbUpdatableField
T_liste_Champs![AvariableField] = fld.Attributes And dbVariableField

T_liste_Champs![DefaultValue] = fld.DefaultValue
T_liste_Champs![Required] = fld.Required
T_liste_Champs![Source] = fld.Properties.Item("RowSource").Value
T_liste_Champs![description] = fld.Properties.Item("Description").Value
T_liste_Champs.Update
iNumChamp = iNumChamp + 1
Next fld
inumIdx = 0
Dim idx_fields As String
For Each idx In tdf.Indexes ''''' permet de récupérer les index d'une table et leur caractéristiques
If Left$(idx.Name, 1) <> "{" Then
idx_fields = ""
For Each fld In tdf.Indexes(idx.Name).Fields
idx_fields = idx_fields & fld.Name & " ; "
Next fld
T_liste_Index.AddNew
T_liste_Index![Id_base_remote] = Id_base_remote
T_liste_Index![Num_TDF] = inumTDF
T_liste_Champs![Id_table] = Id_table
T_liste_Index![position] = inumIdx
T_liste_Index![index] = idx.Name
T_liste_Index![type_index] = 0
T_liste_Index![description] = idx.Properties("description")
T_liste_Index![champs] = idx_fields
T_liste_Index![prp_distinctcount] = idx.DistinctCount
T_liste_Index![prp_Foreign] = idx.Foreign
T_liste_Index![prp_IgnoreNulls] = idx.IgnoreNulls
T_liste_Index![prp_Primary] = idx.Primary
T_liste_Index![prp_Required] = idx.Required
T_liste_Index![prp_Unique] = idx.Unique
T_liste_Index.Update
inumIdx = inumIdx + 1
End If
Next idx
inumTDF = inumTDF + 1
varRetournée = SysCmd(acSysCmdUpdateMeter, inumTDF)
Next tdf
varRetournée = SysCmd(acSysCmdClearStatus)
''-----------------------------------------------------------------------------
Debug.Print "c'est fini pour liste Tables" '
T_liste.Close
T_liste_Champs.Close
T_base_remote.Close
dbs.Close
Dbs_remote.Close
Exit Function
errr:
MsgBox Err.Number & Err.description
Resume Next
End Function

en final
la table "Liste_table" contient les noms et les caractèristiques des tables
la table "Liste_table_champs" contients les champs des tables avec leurs caractèristiques
la table "Liste_table_index" contient les index des tables et leur caractèristiques.

Dans le formulaire une rquête du genre "SELECT liste_table.nom, Liste_table_Champs.champ
FROM liste_table INNER JOIN Liste_table_Champs ON liste_table.Num_TDF = Liste_table_Champs.Num_TDF;"
associe les tables et les champs.

Attention : la fonction est a adapter. Celle-ci est prévue pour récupérer les info d"une base externe.

Bonne journée
0
Rejoignez-nous