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 :

Créer une fonction Excel d'instruction SELECT sur une base ACCESS (ADO?)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 27
    Par défaut Créer une fonction Excel d'instruction SELECT sur une base ACCESS (ADO?)
    Bonjour,

    Fort de l’aide précieuse que m’ont apportée bidou et fring, j’apprends doucement le VBA. La deuxième phase (sur 3) nécessite plus que du VBA, je demande donc encors votre aide afin d’avoir un exemple… proche de mes besoins.
    Je pense devoir utiliser ADO pour réaliser ce qui suit, toutefois merci de me corriger si je fais fausse route.

    Toujours sous Excel 2000 ( )
    Une base de données Access2000 DBmyCREA située dans V:

    Objectif :
    Créer une fonction avec paramètres : SQLmyCREA(annee ;mois ; champ ; table ;autre).
    Où SQLmyCREA exécute la requête suivante sur DBmyCREA:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT champ
    FROM table
    WHERE X=annee , Y=mois , Z=autre ;
    Avez-vous un exemple de code qui donnerait ça ?

    Merci d’avance
    Bien à vous

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Après avoir coché la référence à Microsoft ADO 2.x, on peut s'inspirer de ceci
    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
    Sub RequeteAccess()
        Dim cn As New ADODB.Connection
        Dim rs As New ADODB.Recordset
     
     
        ' Choisir une des deux lignes suivantes, selon que tu as créé un dsn ou pas
        ' Le dsn est plus simple à gérer lors du déploiement sur plusieurs postes qui
        ' pointent vers une même base
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\Données\bd1.mdb;"
        cn.Open "dsn=tests access"
     
        rs.Open "select cle, nom from table1 where cle<10", cn
     
        ...
        ...
     
        rs.Close
        cn.Close
        Set rs = Nothing
        Set cn = Nothing
    End Sub
    Si tu souhaites en faire une fonction, alors, il faut faire attention à refermer les connexions lorsque tu n'en as plus besoin, mais pas avant, car ton recordset (le résultat de la requête SQL) sera perdu à la fermeture de la connexion.

    Tu pourras avoir une fonction pour obtenir la connexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function GetConnexion() As ADODB.Connection
        Dim cn As New ADODB.Connection
     
        ' Choisir une des deux lignes suivantes, selon que tu as créé un dsn ou pas
        ' Le dsn est plus simple à gérer lors du déploiement sur plusieurs postes qui
        ' pointent vers une même base
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\Données\bd1.mdb;"
        cn.Open "dsn=tests access"
     
        Set GetConnexion = cn
        Set cn = Nothing
    End Function
    Une autre pour obtenir le jeu d'enregistrements selon ton critère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function GetEnregistrementsTable1(cn As ADODB.Connection, Cle As Long) As ADODB.Recordset
        Dim rs As New ADODB.Recordset
     
        rs.Open "select nom from table1 where cle < " & Cle, cn
        Set GetEnregistrementsTable1 = rs
        Set rs = Nothing
    End Function
    Les deux fonctions étant utilisées au sein d'une procédure
    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
    Sub UtiliserFonctions()
        Dim cn As New ADODB.Connection
        Dim rs As New ADODB.Recordset
     
        Set cn = GetConnexion()
        Set rs = GetEnregistrementsTable1(cn, 10)
     
        ...
        ...
     
        rs.Close
        cn.Close
        Set rs = Nothing
        Set cn = Nothing
    End Sub
    Comme tu le vois dans les ouvertures de connexion, l'utilisation d'un DSN s'avère plus simple que de créer la chaine de connexion, puisque c'est le dsn qui gère une fois pour toute l'emplacement du fichier. En cas de modification de cet emplacement, tu modifies une seule fois le dsn sans devoir modifier tous les applicatifs qui se connecteront à la base.

    Ok?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre averti
    Inscrit en
    Février 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 27
    Par défaut
    Bonjour et merci d’avoir répondu.

    Je ne suis malheureusement pas allé bien loin.
    J’ai coché MS ADO dans référence, copier le premier code, exécuté puis message d’erreur :

    Erreur de compilation

    Type défini par l’utilisateur non défini
    En googlant je tombe sur un site de MS… Il semblerait que je n’ai pas sélectionné la bonne bibliothèque. Pourtant c’est bien “Microsoft ADO Ext. 2.7 for DDL and security ». Et c’est la seule référence comportant le nom ADO.


    Sinon j’ai le plus grand mal le comprendre le code. Quel est le nom de ma fonction ? Quelles serons les paramètres ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    La bonne référence est
    Microsoft Active Data Objects Library 2.7

    Quel code ne comprends-tu pas? Il n'y a même pas dix lignes de code effectif sur l'ensemble de ce que je t'ai donné...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre averti
    Inscrit en
    Février 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 27
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    La bonne référence est
    Microsoft Active Data Objects Library 2.7
    Ok merci je testerai.
    Citation Envoyé par Pierre Fauconnier Voir le message
    Quel code ne comprends-tu pas? Il n'y a même pas dix lignes de code effectif sur l'ensemble de ce que je t'ai donné...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function GetConnexion() As ADODB.Connection
        Dim cn As New ADODB.Connection
     
        ' Choisir une des deux lignes suivantes, selon que tu as créé un dsn ou pas
        ' Le dsn est plus simple à gérer lors du déploiement sur plusieurs postes qui
        ' pointent vers une même base
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\Données\bd1.mdb;"
        cn.Open "dsn=tests access"
     
        Set GetConnexion = cn
        Set cn = Nothing
    End Function
    Ouvrir la connexions ok.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function GetEnregistrementsTable1(cn As ADODB.Connection, Cle As Long) As ADODB.Recordset
        Dim rs As New ADODB.Recordset
     
        rs.Open "select nom from table1 where cle < " & Cle, cn
        Set GetEnregistrementsTable1 = rs
        Set rs = Nothing
    End Function
    Concrètement, lorsque je voudrais utiliser le module je devrais écrire dans une cellule:
    GetEnregistrement(nom;table;cle)
    et ça donnerait le résultat de la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom from table1 where cle < " & Cle, cn
    ?

    Mais à quoi correspond " & Cle, cn?

    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
    Sub UtiliserFonctions()
        Dim cn As New ADODB.Connection
        Dim rs As New ADODB.Recordset
     
        Set cn = GetConnexion()
        Set rs = GetEnregistrementsTable1(cn, 10)
     
        ...
        ...
     
        rs.Close
        cn.Close
        Set rs = Nothing
        Set cn = Nothing
    End Sub
    Et là une procédure pour enchainer... ok.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function GetEnregistrementsTable1(cn As ADODB.Connection, Cle As Long) As ADODB.Recordset
        Dim rs As New ADODB.Recordset
     
        rs.Open "select nom from table1 where cle < " & Cle, cn
        Set GetEnregistrementsTable1 = rs
        Set rs = Nothing
    End Function
    Concrètement, lorsque je voudrais utiliser le module je devrais écrire dans une cellule:
    GetEnregistrement(nom;table;cle)
    et ça donnerait le résultat de la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom from table1 where cle < " & Cle, cn
    ?

    Mais à quoi correspond " & Cle, cn?
    Là, c'est du VBA. Je ne connais pas ton niveau en ce domaine.
    Non, la fonction n'est pas utilisable telle quelle dans une cellule Excel. Elle renvoie un jeu d'enregistrements. Ce jeu peut contenir un enregistrement unique ou plusieurs enregistrements ou aucun enregistrement, selon la clause WHERE de la requête SQL. Si tu veux renvoyer la valeur d'un champ en particulier, il faut adapter la fonction ou le code...

    Mais à quoi correspond " & Cle, cn?

    Cle représente la valeur passée en paramètre de la fonction, et sert à filtrer les enregistrements de la requête.
    cn est l'objet connexion dont a besoin l'objet recordset rs pour pouvoir se connecter à la source de données.

    Connais-tu VBA et as-tu déjà travaillé avec les objets ADO?

    Pourrais-tu préciser ce que tu souhaites réaliser? Pas ce que tu penses devoir faire pour obtenir le résultat, mais le résultat lui-même, ainsi que la situation de laquelle tu pars pour arriver au résultat? Car il y a peut-être plus simple que ce à quoi tu penses.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. Relancer une fonction à partir d'un clique sur une checkbox
    Par yop3112 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 25/06/2015, 11h45
  2. Réponses: 2
    Dernier message: 21/09/2014, 22h52
  3. appeler une fonction js dans un select sur onChange
    Par laurentSc dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/04/2011, 13h51
  4. Aide sur une fonction excel
    Par vanessb dans le forum Excel
    Réponses: 9
    Dernier message: 27/11/2008, 10h11
  5. Requete sur une table qui pointe 2 fois sur une autre
    Par Satch dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/01/2006, 08h48

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