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 :

Problème objet ADO


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Par défaut Problème objet ADO
    Bonjour tout le monde,

    Ca fait un bout de temps que je n'avais pas à programmer et du coup pas de questions bêtes
    Actuellement, je travaille sur des extractions de base de données. Ca fait toute l'après-midi que je fouille sur le site pour comprendre comment ça marche et d'essayer de trouver un 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
    Public Sub extraction()
     
       Dim Connexion As New ADODB.Connection
        Dim RS As New ADODB.Recordset
        Dim Cellule As Range
     
        Connexion.Open "DSN=MS Access Database;DBQ=C:\Regroupement.mdb;FIL=MS Access;"
        Set RS = Connexion.Execute("select CODE, EOG Fournisseur, EUR, annee from qrySTANDARDOUTPUTQUERY-French")
     
        Do While Not RS.EOF
            Set Cellule = Range("a65536").End(xlUp)(2)
            With RS
                Cellule(3, 1) = !EOG Fournisseur
                Cellule(3, 2) = !EUR
                .MoveNext
            End With
        Loop
     
    End Sub
    Malgré mes recherches j'ai plusieurs questions:
    1.Le nom de champ "EOG Fournisseur" semble poser des problèmes...Peut-on laisser des espaces dans le champ d'un nom? Toutefois lorsque je l'enlève l'erreur demeure...
    2.D'où ma seconde question: peut-on travailler sur des requêtes où il faut prendre les tables d'origine?
    3.Peut-on faire des tris (décroissant, somme, regroupement)?
    4.Dernière question, puis-je utiliser l'explorateur windows pour séléctionner le fichier de base de données? En fait chez nous, chaque année on prend un nouveau fichier pour stocker les données mais qui garde exactement la même structure que l'année précédente.

    Je vous remercie d'avance pour vos réponses! en attendant je continue ma fouille!

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    En espérant répondre a tes questions

    1.Le nom de champ "EOG Fournisseur" semble poser des problèmes...Peut-on laisser des espaces dans le champ d'un nom? Toutefois lorsque je l'enlève l'erreur demeure...
    un champ ne doit pas comporter d'espace. Dans ton cas il faut mettre le nom du champ entre crochets [EOG Fournisseur]

    D'où ma seconde question: peut-on travailler sur des requêtes où il faut prendre les tables d'origine?
    C'est comme tu veux, les 2 fonctionne

    3.Peut-on faire des tris (décroissant, somme, regroupement)?
    oui, il suffit de le faire dans la requete
    Ex : tri sur le code en décroissant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select CODE, EOG Fournisseur, EUR, annee from qrySTANDARDOUTPUTQUERY-French order by Code desc
    4.Dernière question, puis-je utiliser l'explorateur windows pour séléctionner le fichier de base de données? En fait chez nous, chaque année on prend un nouveau fichier pour stocker les données mais qui garde exactement la même structure que l'année précédente.
    dans ce cas le chemin de la base doit être une variable que tu chargeras de la facon que tu souhaites

  3. #3
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Citation Envoyé par sash6
    1.Le nom de champ "EOG Fournisseur" semble poser des problèmes...Peut-on laisser des espaces dans le champ d'un nom? Toutefois lorsque je l'enlève l'erreur demeure...
    Contrairement à mon prédescesseur, je vais te dire : Oui, tu en as le droit.
    Ton souci provient d'une syntaxe incorrecte.
    L'écriture avec les "!" est propre à Access.
    Elle n'est donc pas parfaitement compatible VBA (puisque spécifique Access pour conserver la compatibilité avec les premières versions d'Access)

    Utilises plutôt la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Fields("Nom Du Champs").Value
    Qui est beaucoup plus propre !

  4. #4
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Salut maxence

    Le ! n'est pas propre a access mais a ADO.
    Il fonctionne très bien avec des base de donnée SQL server, AS400, Oracle.

    Bien vu pour fields est une autre syntaxe

  5. #5
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Citation Envoyé par jfontaine
    Le ! n'est pas propre a access mais a ADO.
    Ok, je vais redire autrement cette phrase :
    Citation Envoyé par Maxence Hubiche
    Elle n'est donc pas parfaitement compatible VBA (puisque spécifique Access pour conserver la compatibilité avec les premières versions d'Access)
    Le ! n'est pas fullCompatible VBA.
    En effet, c'est un symbole qui ne permet que de simplifier une écriture qui est :
    .fields(index)
    index peut être le numéro d'ordre du champ ou son nom.

    Maintenant, puisqu'il faut être hyper précis...
    Cette syntaxe n'est pas propre à ADO puiqu'elle fonctionne aussi avec DAO. Elle est implémentée dans les bibliothèques d'Accès aux données afin de ne pas trop perturber les programmeurs Access de la première heure qui utilisaient cette syntaxe dans leurs programmes.
    Elle n'est, bien sûr, plus valable dans les évolution du langage, comme, par exemple, en DotNet.
    D'où l'intérêt de l'abandonner pour programmer comme il faut.

    Enfin, je ne pense pas que ni SQLServeur ni Oracle ni AS400 ne permettent le langage VBA. Ils permettent seulement l'accès à leur données VIA des bibliothèques qui, elles, implémentent une écriture obsolète pour des raisons de compatibiltés ascendantes (ce que j'expliquais ci-dessus) avec ACCESS, car, sauf erreur de ma part, en macrosXL4 pas plus qu'en WordBasic, on ne pouvait associer de références à nos programmes. Pourtant, on faisait déjà de l'accès aux données avec Access à cette époque, en utilisant le "!" pour référencer les champs. D'où la compatibilité Access.

  6. #6
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    merci maxence des ces précisions

    amicalement

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Par défaut
    Merci beaucoup messieurs pour l'exhaustivité de ces réponses! Malheureusement je ne peux tester aucune des deux 2 syntaxes proposées puisque mon prog bloque à la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set RS = Connexion.Execute("SELECT CODE, [EOG Fournisseur], kEUR, annee FROM qrySTANDARDOUTPUTQUERY-French")
    erreur générée:
    Erreur d'exécution '-21472117900 (80040e14)':
    [Microsoft][ODBC Microsoft Access] Erreur de syntaxe dans la clause FROM

  8. #8
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    et en faisant cette requete dans access?

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Par défaut
    la requête sous access fonctionne! je l'ai maintes fois utilisée! je capte pas là

  10. #10
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Essai avec ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RS.Open "select CODE, EOG Fournisseur, EUR, annee from qrySTANDARDOUTPUTQUERY-French", Connexion, adOpenKeyset, adLockReadOnly

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Par défaut
    Bogage de nouveau: "ODBC driver does not support the requested properties"

  12. #12
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Citation Envoyé par sash6
    Erreur d'exécution '-21472117900 (80040e14)':
    [Microsoft][ODBC Microsoft Access] Erreur de syntaxe dans la clause FROM
    Ca ne fonctionne pas mieux en mettant le nom de la table entre crochets ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set RS = Connexion.Execute("SELECT CODE, [EOG Fournisseur], kEUR, annee FROM [qrySTANDARDOUTPUTQUERY-French]")

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Par défaut
    Ca génère toujours une erreur Maxence. "Trop peu de paramètres. 1 attendu."

  14. #14
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Par défaut
    Ca y est ça marche après une légère modification du code.
    Il est largement inspiré du tutoriel de Sebastien ( ). Voici donc à quoi ça ressemble:
    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
    Dim cnx As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim cell As Range
     
    'Instanciation des variables
    Set cnx = New ADODB.Connection
    Set rst = New ADODB.Recordset
     
    'Connexion à la base de données
    cnx.Open "DSN=MS Access Database;DBQ=C:\Regroupement.mdb;FIL=MS Access;"
     
    'Exécution de la requête
    rst.Open "SELECT CODE, [EOG Fournisseur], kEUR, annee FROM [qrySTANDARDOUTPUTQUERY-French] order by kEUR desc", cnx
     
    Do While Not rst.EOF
        Set cell = Range("A65536").End(xlUp)(0)
        With rst
            cell(3, 1) = ![EOG Fournisseur]
            cell(3, 2) = !kEUR
            .MoveNext
        End With
    Loop
    En revanche je galère un peu sur les regroupements (group by, having) et les tris. Dès que j'essaie d'enchaîner les conditions (je m'inspire de l'affichage sql de ma requête), je génère des erreurs dans le code.

  15. #15
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Par défaut relance problème ADO
    Bonjour tout le monde,

    Je galère toujours à formuler une syntaxe propre afin d'extraire les données sous une forme exploitable. Voici la requête SQL, adaptée en langage VBA (ou plutôt inadaptée sic )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rst.Open "SELECT [Natures.CODE], [tblDetailLevel.NewEOGFour] AS [EOG Fournisseur], [tblDetailLevel.Annee], Sum([tblDetailLevel.MntkEUR]) AS kEUR" & _
    "FROM [tblDetailLevel] LEFT JOIN Natures ON [tblDetailLevel.NewCodeScat] = [Natures.CODE_SOUS_CATEGORIE] " & _
    "LEFT JOIN Contrats ON [tblDetailLevel.NewEOGFour] = [Contrats.CODE_GPG_FOURNISSEUR] " & _
    "LEFT JOIN Entites ON [tblDetailLevel.CdEnt] = [Entites.CODE_ENTITE_GPG] " & _
    "GROUP BY [Natures.CODE], [tblDetailLevel.NewEOGFour], [tblDetailLevel.Annee] " & _
    "HAVING [Natures.CODE]='JURID' AND [tblDetailLevel.Annee]='2007'", cnx
    Pourquoi ça ne maaaarche pâs? une idée?

  16. #16
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Par défaut
    Pour ceux que ça intéresse et qui galèreront un jour. D'abord il vaut mieux traviller sur l'ensemble des tables, plutôt que sur une requête déjà crée! ou encore mieux, afficher sur access la requête en SQL (après les modifications éventuelles en termes de champs, tris et regroupements), la copier coller dans votre code. Il y a qu'une chose à modifier éventuellement: remplacer les " " par ' '.

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

Discussions similaires

  1. problème sur ADO/Acesss
    Par rajaomakelly dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 14/02/2006, 10h15
  2. Création d'objet ADO en dynamique
    Par GoodSpeed dans le forum C++Builder
    Réponses: 4
    Dernier message: 11/01/2006, 21h18
  3. [SQL]Problème avec ADO - Order by
    Par Dnx dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 03/11/2005, 10h55
  4. Problème avec Ado, MySQL
    Par sylvain.g dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/06/2005, 10h45
  5. utilisation d'objets ADO pour CMS sur POSTGRESQL7.3.2
    Par turbok dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 10/10/2003, 09h29

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