IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

[Excel + vba + Access]afficher table et colonnes en ADO(X)


Sujet :

Access

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut [Excel + vba + Access]afficher table et colonnes en ADO(X)
    Bonjours,

    Dans une listbox sous Excel, je voudrais afficher toutes les tables de données de ma BDD Access : comment faire (en ADO(X))?

    Dans une autre listbox, j'ai deux collonnes : "Element" et "Type". Je
    voudrais pour une table donnée, que ça me liste toutes les colonnes ainsi
    que leur type : comment faire ?

  2. #2
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Bonjour,

    J'utilise ça pour les tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    ' Tableau des tables
    Set DBConn = CreateObject("ADODB.Connection")
    DBConn.Open DSNODBC
    Set rstSchema = DBConn.OpenSchema(20)
    NbTables = 0
    Do Until rstSchema.EOF
    	If rstSchema("TABLE_TYPE") = "TABLE" Then
    		NbTables = NbTables + 1
    		redim preserve Table(NbTables)
    		Table(NbTables) = rstSchema("TABLE_NAME")
    	End If
    	rstSchema.MoveNext
    Loop
    Set rstSchema = Nothing
    DBConn.Close
    Set DBConn = Nothing
    et pour les colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	Set Conn = CreateObject("ADODB.Connection")
    	Set FieldsRs = CreateObject("ADODB.Recordset")
    	Conn.Open DSNODBC
    	' Récupération des noms de champs
    	SQL = "Select * from MaTable where 1=2"
    	fieldsrs.Open SQL, Conn, 0, 1
    	For j = 0 to fieldsrs.Fields.count-1
    		' Remplissage de la liste
    		fieldsrs.Fields(j).Name & vbcrlf
    	Next
    	fieldsrs.Close
    	Conn.Close
    	Set Conn = Nothing

  3. #3
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Autre possiblité :

    Utiliser l'objet Catalog et parcourir les objets Table et Column d'une table

  4. #4
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    quelle est la methode la plus "propre" ?

    De plus, il me semble que la methode de PC75 ne permet pas d'avoir le type des colonnes...

    Tofalu, tu peux devlopper un peu plus sur ta methode ?

  5. #5
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    Pour le type des colonnes, tu te crées cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    	' Définition des types de champs
    	Function GetFieldType(FieldType)
    		Select Case FieldType
    			Case 200
    				GetFieldType= "VarChar"
    			Case 139
    				GetFieldType= "Number"
    			Case 131, 2, 3, 5
    				GetFieldType= "Number"
    			Case 135
    				GetFieldType= "Date"
    			Case 201
    				GetFieldType= "Clob"
    			Case Else
    				GetFieldType= "Unknown"
    		End Select
    	End Function
    Puis pour l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       For j = 0 to fieldsrs.Fields.count-1 
          ' Remplissage de la liste 
          msgbox fieldsrs.Fields(j).Name & GetFieldType(FieldsRs.Fields(j).type) & vbcrlf 
       Next

  6. #6
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    merci ça à l'air de marcher

    mais je ne comprend pas la requete :
    SQL = "Select * from MaTable where 1=2"

    ça veut dire quoi exactement ? Dans MaTable je recherche dans toutes les colonnes les endroits où 1 = 2 ? 1 n'est jamais égal à 2 non ?

  7. #7
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Citation Envoyé par Emcy
    merci ça à l'air de marcher

    mais je ne comprend pas la requete :
    SQL = "Select * from MaTable where 1=2"

    ça veut dire quoi exactement ? Dans MaTable je recherche dans toutes les colonnes les endroits où 1 = 2 ? 1 n'est jamais égal à 2 non ?
    ça veut dire simplement que PC75 ouvre un recordset sur la table pour récupérer les noms des colonnes. ça marche mais c'est peut être pas le plus propre

    Pour ce qui est de l'objet catalog, cet exemple modifie la valeur par défaut d'un champ d'une table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Sub changerValeurDefaut() 
    On Error GoTo err 
    Dim oCat As New ADOX.Catalog 
    Set oCat.ActiveConnection = CurrentProject.Connection 
    oCat.Tables("NomDeLaTable").Columns("NomChampDate").Properties("Default") = "Now()" 
    GoTo fin: 
    err: 
      MsgBox "Impossible d'accéder au champ" 
    fin: 
    Set oCat = Nothing 
    End Sub
    Il n'a rien à voir avec ce que tu recherches mais te fait bien apparaitre les différents objets et leur hierarchie.

    Le catalog contient donc les tables qui contiennent des colonnes. Tu peux facilement tout parcourir à l'aide de boucle for each

  8. #8
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    merci,

    c'est vrai que l'utilisation de l'objet catalog est beaucoup mieux adapté...

    par contre, comment fait-on pour connaitre la clef primaire (en utilisant l'objet catalog si possible) ?

  9. #9
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    http://www.developpez.net/forums/vie...399094#2399094

    C'est prévu pour la prochaine version de la FAQ

  10. #10
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    je comprend pas la reponse qu'il y a dans l'exemple que tu m'a cité ....

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Private Function ListerChamps(MonChemin As String, MaTable As String) As Variant
    'liste tous les champs d'une table
     
        Dim MaADOConnection As New ADODB.Connection
        Dim MonCatalog As New ADOX.Catalog
        'Dim MonIndex As Variant
        Dim MaTableADOX As New ADOX.Table
        Dim MonElement As Object
        Dim MonMessageErreur As String
        Dim i As Integer
        Dim ListerTableTemp() As String
     
        On Error GoTo ErreurOuvrirConnection
     
        'Définition du pilote de connexion (fournisseur)
        MaADOConnection.Provider = "Microsoft.Jet.Oledb.4.0"
     
        'Définition de la chaîne de connexion : chemin complet du .mdb
        MaADOConnection.ConnectionString = MonChemin
     
        'Ouverture de la base de données
        MaADOConnection.Open "Data Source=" & MonChemin
     
        Set MonCatalog.ActiveConnection = MaADOConnection
        Set MaTableADOX = MonCatalog.Tables(MaTable)
     
        ReDim ListerChampsTemp(MonCatalog.Tables(MaTable).Columns.Count - 1, 1)
     
        i = 0
     
        'For Each MonIndex In MaTableADOX.Columns
        '    ListerChampsTemp(0, 0) = MonIndex
        '    ListerChampsTemp(0, 0) = MonIndex
        'Next MonIndex
     
        For Each MonElement In MonCatalog.Tables(MaTable).Columns
            ListerChampsTemp(i, 0) = MonElement.Name
     
            If MonElement.Indexes.PrimaryKey = True Then
                ListerChampsTemp(i, 0) = ListerChampsTemp(i, 0) & " (Clef)"
            End If
     
            ListerChampsTemp(i, 1) = GetFieldType(MonElement.Type)
            i = i + 1
        Next MonElement
     
        ListerChamps = ListerChampsTemp
     
        Set MonCatalog = Nothing
        MaADOConnection.Close
        Set MaADOConnection = Nothing
     
        Exit Function
     
    ErreurOuvrirConnection:
        MonMessageErreur = "BDD : " & MonChemin & vbCr & Err.Description
        MsgBox MonMessageErreur
        End
     
    End Function

    lorsque je vais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each MonIndex In MaTableADOX.Indexes
            MsgBox ("Index " & MonIndex.Name)
            MsgBox ("Primary key = " & MonIndex.PrimaryKey)
            MsgBox ("Unique = " & MonIndex.Unique)
        Next MonIndex
    => ça ne me donne pas le nom de la colonne qui a la clef primaire

  11. #11
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    j'ai trouvé une solution mais je ne la trouve pas très "clean"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'recherche la clef primaire
        For Each MaClef In MonCatalog.Tables(MaTable).Keys
            For Each MonElement In MaClef.Columns
                MonNomClef = MonElement.Name
            Next MonElement
        Next MaClef
    je trouve un peu bete de devoir balayé les elements...

Discussions similaires

  1. [AC-2010] Filtre type Excel dans Access sur table liée SQL
    Par Fredo67 dans le forum IHM
    Réponses: 4
    Dernier message: 20/12/2014, 14h03
  2. Réponses: 6
    Dernier message: 02/05/2011, 08h40
  3. [VBA ACCESS]Export Table sous Excel
    Par mathieu44800 dans le forum VBA Access
    Réponses: 2
    Dernier message: 14/02/2008, 14h57
  4. [VBA Access] Export Table sous Excel avec fenetre de dialogue
    Par trihanhcie dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/07/2007, 14h14
  5. Excel VBA - Dernière ligne d'une colonne
    Par sat478 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/12/2005, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo