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

Macros et VBA Excel Discussion :

Base de données Access UserForm [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Par défaut Base de données Access UserForm
    Bonjour à tous !

    Je cherche à créer une application userform qui va chercher un fichier mde et qui l'ouvre avec Excel.

    Jusque là, ça marche, mais je voudrais automatiser la suite : Créer une page excel par table.

    La tête de l'application :

    Nom : Base.png
Affichages : 648
Taille : 38,4 Ko

    On clique sur le bouton à droite du textbox, qui nous ouvre l'explorateur de fichier, on choisit son .mde/.mdb, et l'appli récupère le lien dans le textbox :

    Nom : Lien.png
Affichages : 657
Taille : 42,0 Ko

    (J'ai cache le lien, je sais pas si j'ai le droit de le montrer. Dans le doute... Bref)



    ---------- (A partir de là, je ne sais pas comment automatiser le processus) ----------

    On clique sur Ouvrir, ça va chercher le fichier via le lien du textbox, et ça l'ouvre dans Excel.

    Vu qu'il y a plusieurs tables dans le fichier mde, ça vous ouvre cette popup :

    Nom : Tables.png
Affichages : 595
Taille : 19,8 Ko

    Quand on sélectionne une ou plusieurs tables, ça nous ouvre ça :

    Nom : ImportDonnees.png
Affichages : 646
Taille : 30,3 Ko

    Si on a choisi une seule table, on peut choisir "Feuille de calcul existante" Et ça nous met la table Access dans le tableau Excel avec des titres aux colonnes, des filtres etc.

    Si on sélectionne plusieurs tables, APPAREMMENT il y a un conflit (je suis pas sur d'avoir réellement compris, mais en gros je pense qu'il essaye d'écrire sur la feuille la table suivante, sauf que la table précedente est déjà écrit sur cette feuille, donc il y a conflit)
    Je suppose donc qu'il faut cliquer sur "Nouvelle feuille de calcul" mais je n'ai pas réussi à tester car mon Excel chargeait en boucle et j'ai pas eu la patience pour attendre le résultat final.

    Je cherche donc à automatiser ce processus, afin que l'utilisateur ait juste à cliquer sur Ouvrir, et que Excel ne demande rien de plus, le logiciel ouvrirait toutes les tables contenues dans le mdb/mde, et rajoute chaque table dans une nouvelle feuille de calcul.

    En gros, quand il clique, il se retrouve avec un nouveau classeur, et X feuilles dedans (X correspond au nombre de table du fichier mdb/mde) avec pour chaque feuille, une table différente de la base de donnée Access. L'utilisateur n'aurait rien d'autre à faire que de choisir le fichier en fait.

    J'ai essayé d'enregistrer une macro pour simuler les cliques de souris sur "nouvelle feuille de calcul" et "OK" mais on ne peut pas le faire quand le programme tourne.

    Je ne m'y connais pas assez en vba pour écrire dans mon programme une connexion à Access, récupérer le nombre de table, et faire une boucle sur ces tables pour créer une feuille de calcul, puis créer des colonnes en fonction de ce que contient la table Access etc...

    C'est pourquoi je solicite votre aide, y a t-il moyen d'automatiser ce processus ?

    Voici également le code actuel de l'application :

    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
     
    Private Sub BoutonEffacer_Click()
        TextBoxChemin.Text = ""
    End Sub
     
    Private Sub BoutonGo_Click()
        Workbooks.Open Filename:=TextBoxChemin.Text
         ' Code
         'Windows(ChDir & "\" & NomFichier).Close
    End Sub
     
    Private Sub BoutonOuvrir_Click()
        Dim CheminEtTypeFichier As String, Fichier As String
        CheminEtTypeFichier = "C:"
        Fichier = BrowseFile(CheminEtTypeFichier)
        TextBoxChemin.Text = Fichier
    End Sub
     
    Function BrowseFile(CheminEtTypeFichier) As String
        With Application.FileDialog(msoFileDialogFilePicker)
     
            .AllowMultiSelect = False
            .InitialFileName = CheminEtTypeFichier
            .Filters.Clear
            .Filters.Add "Access Database", "*.mde"
            .FilterIndex = 1
            .InitialView = msoFileDialogViewProperties
            .Show
     
            If .SelectedItems.Count > 0 Then
                BrowseFile = .SelectedItems(1)
            Else
                BrowseFile = ""
            End If
        End With
     End Function
    Merci d'avance pour votre attention,

    Cordialement,

    Maxime OZENNE.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Pas certain que tu puisses utiliser cette méthode sans devoir répondre aux messages.
    Il te faudrait sélectionner Tableau en haut et Nouvelle feuille de calcul en bas.
    Tu auras donc une table par onglet.

    Autrement, tu pourrais utiliser une connexion à la base en utilisant DAO ou ADODB.
    Tu te crées un Recordset qui va chercher chaque table.
    Tu copies ce Recordset dans une nouvelle feuille (que tu crées) avec Range("A1").CopyFromRecordset MonRecordset.
    Si tu as besoin des entêtes, ça prendrait aussi des boucles pour les lire.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Par défaut
    Merci de ta réponse !

    Est-ce que tu pourrais me fournir un exemple simple de recordset ? Les tutos ont l'air assez complexe dessus, je dois importer une librairie DAO ou autre c'est ça ? Je n'ai pas l'habitude du VBA.

    Je devrais boucler pour lire les intulés, les mettres sur la premiere ligne puis faire A2 = mon recordset en gros ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    À partir de vieille source que j'ai faite en DAO, il y a longtemps...
    De nos jours, il serait préférable d'y aller avec ADODB, mais la technique est différente et je laisserai le soin à d'autres si le coeur leur en dit.

    Pour lister les tables de la base dans un combobox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Set Db = Workspaces(0).OpenDatabase("Le chemin et nom de la base", False, False)
        For Each tbDef In Db.TableDefs
            If InStr(1, tbDef.Name, "MSys") = 0 And InStr(1, tbDef.Name, "$") = 0 Then
                cboTable.AddItem tbDef.Name
            End If
        Next
    Pour charger les champs d'une table dans un autre combobox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub ChargerChamps()
        Dim Champ As Field
     
        cboChamps.Clear
        For Each Champ In Db.TableDefs(cboTable).Fields
            cboChamps.AddItem Champ.Name
        Next
     
        If cboChamps.ListCount > 0 Then cboChamps.ListIndex = 0
     
    End Sub
    Pour chercher les données d'une table sélectionnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Rs = Db.OpenRecordset("Select * from [" & cboTable.Text & "]")
    Pour inscrire les entêtes de cette table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For I = 0 To Rs.Fields.Count - 1
            Sheets("Nom de l'onglet où on copie").Range("A1").Offset(0, I) = Rs.Fields(I).Name
        Next
        'Pour les données
        Sheets("Nom de l'onglet où on copie").Range("A2").CopyFromRecordset Rs
    Et tu déclares tes variables en entête du module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Db As Database
    Dim tbDef As TableDef
    EDIT: j'oubliais de mentionner que tu dois créer une référence à DAO de la dernière version
    Menu Outils > Références > Microsoft DAO 3.6 Object Library

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Par défaut
    Un grand merci à vous !!

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Par défaut
    Bonjour, excusez moi je reviens vers vous car j'ai un autre probleme.

    Tout d'abord, j'ai reussi à resoudre mon probleme de depart.
    Pour automatiser la réponse à la popup, il suffit de faire comme cela :

    - On va dans l'onglet Developpeur>Enregistrer une macro
    - On va ensuite dans l'onglet Données>Access (pour ouvrir un .mdb sous Excel)
    - Ici, on choisit notre fichier .mdb, puis on choisit UNE table. Excel va donc générer la popup que j'avais screen plus haut (Tableau, Nouvelle feuille etc)
    - Dans la popup, on coche Tableau, et Feuille existante Cellule $A1
    - Une fois ceci fait, on a ouvert une table dans Excel. On retourne dans l'onglet Developpeur>Arreter l'enregistrement, puis on vient de récupérer le code qui ouvre une table access dans Excel et qui automatise la réponse à la popup.

    On peut ensuite appliquer une boucle pour faire ça pour toutes les tables. Moi je m'y suis pris comme suivant :

    Grace à votre code (un peu modifié), je me connecte à la base et je créer une feuille de classeur par table de la BDD, ensuite je comptais faire une espèce de For i de 0 a nbFeuille, Sheets(i) = Table(i) en appellant la methode generée par l'enregistrement de macro et en lui passant en parametre la feuille de i et la table de i.

    Sauf que j'ai un probleme...

    ça, c'est les tables de ma base de donnée :

    Nom : Sans titre.png
Affichages : 580
Taille : 10,7 Ko

    Comme vous pouvez le voir, il y a différentes Icones.

    Par deduction personnelle, (entendez par là que ce que j'en ai déduis n'a rien de sur et que c'est fort possible que je me trompe) je pense que les icones bleus sont des TABLES, et les icones verts sont des VIEW

    Les VIEW servent à montrer certaines valeurs contenues dans la table, un peu comme un SELECT [...] FROM [...], en tout les VIEW qui portent un nom ressemblant aux noms des TABLES affichent les données contenues ladites TABLE et non celles contenues dans d'autres TABLES.

    Mon probleme est le suivant :

    J'ai fais ce code, qui m'affiche ce que votre boucle parcourt :

    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
     
    Dim db As DAO.Database
        Dim ws As DAO.WorkSpace
        Dim rst As DAO.Recordset
        Set ws = DBEngine.WorkSpaces(0)
        Set db = ws.OpenDatabase(TextBoxChemin.Text, False, False)
        For Each tbDef In db.TableDefs
            If InStr(1, tbDef.Name, "MSys") = 0 And InStr(1, tbDef.Name, "$") = 0 Then
                'Dim feuille As Worksheet
                'Set feuille = Sheets.Add(After:=Sheets(Sheets.Count))
                'feuille.Name = tbDef.Name
                affich = affich & tbDef.Name & Chr(10)
            End If
        Next
        MsgBox affich
    Qui, m'affiche ceci :

    Nom : Sans titre3.png
Affichages : 573
Taille : 10,6 Ko

    Donc ça m'affiche bien les TABLES, mais pas les VIEW

    Sauf que si j'essaye d'ouvrir le .mdb à la main, j'ai remarqué qu'il me proposait d'ouvrir uniquement les VIEW :

    Nom : Sans titre2.png
Affichages : 535
Taille : 3,4 Ko

    Donc là dans mon cas, j'ai 5 TABLES pour 25 VIEW.

    Avec ma façon de faire, il créé donc 5 feuilles dans mon classeur pour ensuite y écrire 25 VIEW (il y a donc un probleme...)

    Connaissez vous un moyen pour que quand j'essaye d'ouvrir le .mdb il me propose d'ouvrir uniquement les TABLES et non les VIEW ? Ainsi, je pourrais donc mettre les TABLES dans les feuilles que je génère, sans me préoccuper des VIEW...

    Merci de votre attention

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Accès aux bases de données Access
    Par xela dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/12/2004, 09h07
  2. [débutant] Connection à une base de donnée Access
    Par Lorenzox dans le forum JBuilder
    Réponses: 1
    Dernier message: 25/10/2004, 16h28
  3. Réponses: 15
    Dernier message: 25/10/2004, 11h50
  4. [Déploiement]Base de donnée Access
    Par Giovanny Temgoua dans le forum Bases de données
    Réponses: 9
    Dernier message: 09/08/2004, 20h48
  5. associer une base de données(access) a un dbgrid
    Par ange1708 dans le forum MFC
    Réponses: 3
    Dernier message: 11/06/2002, 12h18

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