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 de boucle sur un Recordset [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 48
    Points : 40
    Points
    40
    Par défaut Problème de boucle sur un Recordset
    Bonjour,

    J'ai un petit soucis pour exploiter un recordset, qui se passe de la façon suivante :


    J'ai une connexion Jet 4.0 pour lire des fichiers Excel qui me servent de source, je crée un Recordset "Rst" à partir de cela.
    Je voudrais, sans passer par une feuille Excel de transition, envoyer directement ce Recordset dans ma base de données MySQL.

    La connexion à la base marche, et j'arrive à insérer une ligne. Mais c'est tout... donc je pense être proche du but, mais ma boucle doit être mauvaise.
    De plus, j'aimerais ne lire les informations dans mon Recordset qu'à partir de la 3ème ou 4ème entrée, est ce possible avec un Move... ? Ou Dois je supprimer les lignes du Recordset que je ne veux pas ?

    Voilà ce que j'ai en gros :


    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
     
    Sub testrecordset()
        Dim Cn As ADODB.Connection
        Dim cnbis As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Import_sql As String
        Dim Rst As ADODB.Recordset
        Dim rst2 As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = "Y:\Chemin\Fichier.xls"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "saisie"
     
        Set Cn = New ADODB.Connection
     
    With Cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=" & Fichier & ";Extended Properties=Excel 8.0;"
    .Open
    End With
     
     
        'Définit la requête
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)

    Cette partie marche bien, ensuite j'ai fait 2 essais :

    Set rst2 = New ADODB.Recordset
    Set cnbis = New ADODB.Connection
    cnbis.Open "dsn=testvba"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    While Not Rst.EOF
        cnbis.Execute (Import_sql)
        ligne = ligne + 1
        Rst.MoveNext
        Wend
    Et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Rst.MoveFirst
    Do Until Rst.EOF = True
    Set rst2 = cnbis.Execute(Import_sql), True
    Rst.MoveNext
    Loop
    Dans les deux cas, seule la première ligne semble copiée (j'ai sans arrêt la même date : "2009-01-02" qui est copiée dans la base.

    D'ailleurs je me demande bien pourquoi ce n'est pas "2009-01-01".

    Je ne pense pas que le problème vienne des propriétés des Recordset (j'ai lu des limitations par rapport à ceux créés via Microsoft Jet), mais plutôt un problème pour passer à la ligne suivante dans recordset. Je pensais que celui ci pouvait être traité comme un ensemble d'ailleurs, suis je donc obligé de faire ligne par ligne ?

    Merci bien pour votre aide.

  2. #2
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Bonjour

    A priori, la boucle devrait fonctionner...

    Le problème ne viendrait-il pas de cette ligne?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cnbis.Execute (Import_sql)
    Il faut vérifier la chaine Import_sql que tu passes, car elle n'est pas mise à jour dans la boucle, donc, elle est la même tout le temps...
    "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 du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Bonjour et merci pour lvotre réponse déjà.

    La chaine "Import_SQL" est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Import_sql = "Insert Into saisie (Journee, Imputation, Tache, Lieu, Notes, Collaborateur) VALUES ('" & Format(Rst.Fields(0).Value, "YYYY/MM/DD") & "', '" & Rst.Fields(1) & "', '" & Rst.Fields(2) & "', '" & Rst.Fields(3) & "', '" & Rst.Fields(4) & "', '" & Rst.Fields(6) & "');"
    Je ne vois pas trop comment faire si ça ne vient pas de la boucle.
    Le soucis étant que je veux utiliser mon Recordset créé depuis la feuille Excel pour l'envoyer sur la base.

    Si je ferme la connexion de Rst : ça fait une erreur.
    Si j'ouvre une autre connexion pour Rst : ça fait une erreur

    Mon idée était alors de copier Rst dans un deuxième Recordset (Rst2).

    Ou sinon il faudrait que je fasse une boucle 'avant' en faisant un movefirst/movenext pour relancer la commande à chaque fois ? (enfin c'est déjà ce qu'il se passe là).

    Cela va me faire plus de charge pour le serveur que si le Recordset était traité comme un ensemble non ? Mais peut être n'ai je pas le choix.

  4. #4
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Tu dois insérer la ligne que tu me donnes dans ta boucle, sinon, elle n'a pas mise à jour à l'intérieur de la boucle avec le bon enregistrement, avant d'être exécutée par le Execute

    Ton code doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    While Not Rst.EOF
        Import_sql = "Insert Into saisie (Journee, Imputation, Tache, Lieu, Notes, Collaborateur) VALUES ('" & Format(Rst.Fields(0).Value, "YYYY/MM/DD") & "', '" & Rst.Fields(1) & "', '" & Rst.Fields(2) & "', '" & Rst.Fields(3) & "', '" & Rst.Fields(4) & "', '" & Rst.Fields(6) & "');"    
        cnbis.Execute Import_sql
        ligne = ligne + 1
        Rst.MoveNext
    Wend
    "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 du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Effectivement Pierre avec votre remarque je venais de tester cela !

    Et... ça marche ! Je suis vraiment c...llon quand je m'y mets!
    Je pensais que ça mettait quand même ma ligne à jour mais en fait, il est logique que non d'une certaine façon...

    Voilà mon qui marche, si ça peut aider (j'ai rajouté un "On Duplicate Key Update" au passage)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Rst.MoveFirst
    Do Until Rst.EOF = True
    Import_sql = "Insert Into saisie (Journee, Imputation, Tache, Lieu, Notes, Collaborateur) VALUES ('" & Format(Rst.Fields(0).Value, "YYYY/MM/DD") & "', '" & Rst.Fields(1) & "', '" & Rst.Fields(2) & "', '" & Rst.Fields(3) & "', '" & Rst.Fields(4) & "', '" & Rst.Fields(6) & "')" & _
    "ON DUPLICATE KEY UPDATE Journee = '" & Format(Rst.Fields(0).Value, "YYYY/MM/DD") & "', Imputation = '" & Rst.Fields(1) & "', Tache = '" & Rst.Fields(2) & "', Lieu = '" & Rst.Fields(3) & "', Notes = '" & Rst.Fields(4) & "', Collaborateur = '" & Rst.Fields(6) & "';"
    cnbis.Execute (Import_sql), adOpenDynamic
    Rst.MoveNext
    Loop

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

Discussions similaires

  1. problème de boucle sur une table
    Par alexphi dans le forum VBA Access
    Réponses: 7
    Dernier message: 02/06/2010, 15h40
  2. [AC-2003] Problème de recordcount sur un recordset sfr
    Par patbeautifulday dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/05/2009, 18h07
  3. Réponses: 1
    Dernier message: 12/11/2008, 10h45
  4. [DAO] problème avec Requery sur mon recordset
    Par vcattin dans le forum VBA Access
    Réponses: 8
    Dernier message: 03/04/2007, 23h08
  5. Problème de boucle sur une checkbox
    Par jeremie74 dans le forum Flash
    Réponses: 3
    Dernier message: 05/03/2007, 14h58

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