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 :

[Excel 2003-2007] requêtes SQL vers une base access depuis Excel


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
    Avril 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 35
    Par défaut [Excel 2003-2007] requêtes SQL vers une base access depuis Excel
    Bonjour,

    Je poste ici car je sèche !

    En effet, je dois effectuer une requête SQL (d'abord, un SELECT puis par la suite un Update).
    J'utilise ADODB, qui visiblement fonctionne par Recordset... le concept est encore un peu flou pour moi, mes recherches Google m'ont aidées à écrire un nouvel enregistrement dans la base mais pas à utiliser des requêtes textuelles.

    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
     
    Sub enregistrer_bdd()
     
        Dim Tableau_date() As String
        Dim Tableau_heure() As String
        Dim Tableau_date_heure(5) As String
        Dim i As Integer
        Dim cn As ADODB.Connection, rs As ADODB.Recordset
        Dim sql As String
     
        'Connexion à la BDD Access
        Set cn = New ADODB.Connection
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=Mes projets\Feuille de quart\quart.mdb;"
        'Open a recordset
        Set rs = New ADODB.Recordset
        'On ouvre la table Quart
        rs.Open "quart", cn, adOpenkeyset, adLockOptimistic, adCmdTable
     
        'extraire la date de la feuille de quart
        Tableau_date() = Split(Range("B8").Value, "/")
        'extraire l'heure de la feuille de quart
        Tableau_heure() = Split(Range("C8").Value, "_")
        'on crée un tableau intermédiaire avec le bon ordre
        Tableau_date_heure(0) = Tableau_date(2)
        Tableau_date_heure(1) = Tableau_date(1)
        Tableau_date_heure(2) = Tableau_date(0)
        Tableau_date_heure(3) = Tableau_heure(0)
        Tableau_date_heure(4) = Tableau_heure(1)
     
        Set rsselect = New ADODB.Recordset
        sql = "Select * From quart Where date_du_jour = '" & Join(Tableau_date_heure, "") & "'"
     
    'Ensuite je fais quoi ? un rsselect.open ? quels arguments ?? Je sèche ici...
     
        'On ferme le RecordSet
        rs.Close
        Set rs = Nothing
        'On ferme la connexion à la base
        cn.Close
        Set cn = Nothing
    End Sub
    Je ne vous ai pas copié tout le code où j'ajoute un enregistrement, inutile pour ma question.
    Bref, une fois que j'ai défini ma requête, je fais quoi ?
    Ce sera ensuite la même combat pour ma requête UPDATE.

    En fait, je veux vérifié si dans ma base l'enregistrement dont la date_du_jour est égale à ce que j'ai calculé dans la première partie de mon code, est présent.
    Si présent, j'e mets à jour cet enregistrement avec des valeurs provenant de la feuille Excel.
    Si pas présent, j'ajoute une enregistrement avec toujours ces mêmes valeurs.

    Je ne recherche pas forcément un code tout fait, mais au moins de quoi savoir comment fonctionne ADO avec les Recordset. Je mélange aussi avec DAO (l'ancêtre de ADO ??) en recherchant sur Google...

    Merci d'avance pour votre aide !

    Edit: bon après tentative de rss.open, j'obtiens une erreur.

    Après ma requête, j'ajoute cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsselect.Open sql, cn, adOpenkeyset, adLockOptimistic, adCmdTable
    Erreur d'exécution : Erreur syntaxe dans la clause FROM.
    Donc en gros, le nom de la table ne convient pas... pourtant c'est bien ce nom !

  2. #2
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 402
    Par défaut
    Salut,

    tu trouveras un point de départ ici sans oublier la FAQ.

  3. #3
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 35
    Par défaut
    Merci pour ta réponse rapide !

    Cependant, du coup mon problème de "recordset" est en stand-by puisque j'ai une erreur dans le "FROM" indéterminée...
    Le nom de ma table est correct (j'ai tenté de la renommer pour voir si ce n'était pas dû à un mot réservé du langage SQL, ça m'est déjà arrivé...), je ne vois pas ce qui cloche.

    J'ai tenté de remplacer le nom de variable "sql" directement par la requête, mais forcément, en toute logique, ça ne marche pas.

    Curieux quand même...


    EDIT: bah non en fait j'ai trouvé, ce sont tous mes paramètres derrière, que j'ai mis pour je ne sais quelle raison (c'est pas de ne pas comprendre ce qu'on fait...) qui me foiraient ma commande.
    Je n'ai plus d'erreur sur le FROM, je continue à avancer, lentement mais sûrement.
    Merci.

  4. #4
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 35
    Par défaut
    Encore moi...

    Juste pour dire que j'avais réussi à faire tout ce que je voulais, l'UPDATE marche (ce n'est même pas via une requête SQL), bref, tout fonctionne.

    Je mets le code utilisé, ça pourra peut-être en aider quelques uns.

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    Sub enregistrer_bdd()
     
        Dim Tableau_date() As String
        Dim Tableau_heure() As String
        Dim Tableau_date_heure(5) As String
        Dim i As Integer
        Dim cn As ADODB.Connection, rs As ADODB.Recordset
        Dim sql As String
     
        'Connexion à la BDD Access
        Set cn = New ADODB.Connection
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=Mes projets\Feuille de quart\quart.mdb;"
        'Open a recordset
        Set rs = New ADODB.Recordset
        'On ouvre la table Quart
        rs.Open "feuilledequart", cn, adOpenKeyset, adLockOptimistic, adCmdTable
     
     
        'extraire la date de la feuille de quart
        Tableau_date() = Split(Range("B8").Value, "/")
        'extraire l'heure de la feuille de quart
        Tableau_heure() = Split(Range("C8").Value, "_")
        'on crée un tableau intermédiaire avec le bon ordre
        Tableau_date_heure(0) = Tableau_date(2)
        Tableau_date_heure(1) = Tableau_date(1)
        Tableau_date_heure(2) = Tableau_date(0)
        Tableau_date_heure(3) = Tableau_heure(0)
        Tableau_date_heure(4) = Tableau_heure(1)
     
        Set rsselect = New ADODB.Recordset
        sql = "SELECT * FROM feuilledequart WHERE date_du_jour = '" & Join(Tableau_date_heure, "") & "'"
        rsselect.Open sql, cn, adOpenKeyset, adLockOptimistic
        'adLockOptimistic nécessaire ici, sinon le recordset est en lecture seule (par défaut il est en adLockReadOnly)
        If rsselect.BOF = True Then 'si l'enregistement en cours est positionné avant le premier de l'objet. ie il n'y a pas d'enregistrement...
            rs.AddNew 'Nouvel enregistrement (un par validation de feuille) et on se positionne dessus
            'On ajoute à chaque champ de la table les valeurs correspondantes
            rs.Fields("date_du_jour") = Join(Tableau_date_heure, "") 'le champ date est créé en une chaine grâce à Join()
            rs.Fields("compteur_forage") = Range("F72").Value
            rs.Fields("niveau_cuve_fuel_domestique") = Range("C77").Value
            rs.Fields("niveau_cuve_fuel_nouvelle_installation") = Range("F77").Value
            rs.Fields("compteur_fuel_four1") = Range("F103").Value
            rs.Fields("compteur_fuel_four2") = Range("F108").Value
            rs.Fields("concordance_mesure_O2_four1") = Range("F119").Value
            rs.Fields("concordance_mesure_O2_four2") = Range("F122").Value
            rs.Fields("pression_vapeur_NH4OH_four1") = Range("F126").Value
            rs.Fields("pression_vapeur_NH4OH_four2") = Range("F129").Value
            rs.Fields("niveau_bac_grenaille_four1") = Range("F135").Value
            rs.Fields("niveau_bac_grenaille_four2") = Range("G135").Value
            rs.Fields("nombre_sacs_injectes_four1") = Range("F136").Value
            rs.Fields("nombre_sacs_injectes_four2") = Range("G136").Value
            rs.Fields("niveau_bac_phosphate") = Range("E144").Value
            rs.Fields("niveau_acide") = Range("G161").Value
            rs.Fields("niveau_soude") = Range("G162").Value
            rs.Fields("eau_de_ville") = Range("G167").Value
            rs.Fields("eau_de_forage") = Range("G168").Value
            rs.Fields("cumul_eau_deminee_vers_bache_alimentaire") = Range("G237").Value
            rs.Fields("niveau_reduc_O2_index_pompe") = Range("G242").Value
            rs.Fields("niveau_amines_index_pompe") = Range("G243").Value
            rs.Update 'On enregistre !
        Else
            rsselect.Fields("date_du_jour") = Join(Tableau_date_heure, "") 'le champ date est créé en une chaine grâce à Join()
            rsselect.Fields("compteur_forage") = Range("F72").Value
            rsselect.Fields("niveau_cuve_fuel_domestique") = Range("C77").Value
            rsselect.Fields("niveau_cuve_fuel_nouvelle_installation") = Range("F77").Value
            rsselect.Fields("compteur_fuel_four1") = Range("F103").Value
            rsselect.Fields("compteur_fuel_four2") = Range("F108").Value
            rsselect.Fields("concordance_mesure_O2_four1") = Range("F119").Value
            rsselect.Fields("concordance_mesure_O2_four2") = Range("F122").Value
            rsselect.Fields("pression_vapeur_NH4OH_four1") = Range("F126").Value
            rsselect.Fields("pression_vapeur_NH4OH_four2") = Range("F129").Value
            rsselect.Fields("niveau_bac_grenaille_four1") = Range("F135").Value
            rsselect.Fields("niveau_bac_grenaille_four2") = Range("G135").Value
            rsselect.Fields("nombre_sacs_injectes_four1") = Range("F136").Value
            rsselect.Fields("nombre_sacs_injectes_four2") = Range("G136").Value
            rsselect.Fields("niveau_bac_phosphate") = Range("E144").Value
            rsselect.Fields("niveau_acide") = Range("G161").Value
            rsselect.Fields("niveau_soude") = Range("G162").Value
            rsselect.Fields("eau_de_ville") = Range("G167").Value
            rsselect.Fields("eau_de_forage") = Range("G168").Value
            rsselect.Fields("cumul_eau_deminee_vers_bache_alimentaire") = Range("G237").Value
            rsselect.Fields("niveau_reduc_O2_index_pompe") = Range("G242").Value
            rsselect.Fields("niveau_amines_index_pompe") = Range("G243").Value
            rsselect.Update 'On enregistre !
        End If
     
     
        'On ferme le RecordSet
        rs.Close
        Set rs = Nothing
        'On ferme la connexion à la base
        cn.Close
        Set cn = Nothing
    End Sub
    Donc finalement, c'est vraiment les codes trouvés sur internet qui me faisaient mélanger DAO et ADO, parce-que c'est pas compliqué au final.

    Bonne soirée à vous !

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/10/2010, 16h38
  2. Requête SQL sur une base Access, where sur un champ date
    Par digital prophecy dans le forum Bases de données
    Réponses: 1
    Dernier message: 09/05/2008, 16h47
  3. Requête sur une base access dans excel
    Par adrien.gendre dans le forum Excel
    Réponses: 3
    Dernier message: 23/07/2007, 12h06
  4. [VBA Excel]Interroger une base access depuis Excel
    Par Stephane_123 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 12/02/2007, 10h43
  5. Impossible d'ouvrir une base Access depuis Excel
    Par vciofolo dans le forum Access
    Réponses: 8
    Dernier message: 14/12/2005, 12h09

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