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 :

Insérer les données d'un Recordset dans une ADOX.Table [XL-2002]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut Insérer les données d'un Recordset dans une ADOX.Table
    Bonjour tout le monde,
    Je fais appel à votre savoir car le mien est un peu limité sur le sujet.
    J'ai créé via ADOX un mdb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Cat = New ADOX.Catalog    
        Cat.create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\USERS\toto.mdb;"
    J'ai récupéré des données dans un recordset créé via ADODB qui se connecte à un fichier texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set Cn = New ADODB.Connection
        Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\;" & _
    "extended properties=""Text;CharacterSet=ANSI;HDR=YES;DMT=Delimited;"""
        Set Rs = New ADODB.Recordset
        Rs.Open "SELECT * FROM titi.txt", Cn
    Comment je fais pour insérer les données de mon recordset dans une ADOX.Table?

    D'avance merci

  2. #2
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 133
    Points : 160
    Points
    160
    Par défaut Methode addnew
    bonjour

    Il suffit d 'invoquer la méthode addnew
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Set Cn = New ADODB.Connection
        Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\;" & _
    "extended properties=""Text;CharacterSet=ANSI;HDR=YES;DMT=Delimited;"""
        Set Rs = New ADODB.Recordset
        Rs.Open "SELECT * FROM titi.txt", Cn
        rs.Addnew
        rs.flieds(1)="toto"
        .......
        ........
        rs.flieds(n)=5
        rs.update
    En principe il faut que les entêtes soient définies elles serviront de champs nommés pour la collection fields.

    Voilà pour le principe

    Bon développement

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Bonjour Lynx92260,

    Merci pour ton aide.
    Mais je ne souhaites pas ajouter de champs à mon recordset Rs mais de prendre les fields et les items de mon Rs pour implementer une ADOX.table crée au préalable.

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 133
    Points : 160
    Points
    160
    Par défaut
    Citation Envoyé par -={-_-}=- Voir le message
    Bonjour Lynx92260,

    Merci pour ton aide.
    Mais je ne souhaites pas ajouter de champs à mon recordset Rs mais de prendre les fields et les items de mon Rs pour implementer une ADOX.table crée au préalable.
    Bon ok

    il suffit d'adapter ce 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
     
        Set Cn = New ADODB.Connection
        Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\;" & _
    "extended properties=""Text;CharacterSet=ANSI;HDR=YES;DMT=Delimited;"""
        Set rsCible = Cn.openrecordet("TableSource")
        Set rs = New ADODB.Recordset
        rs.Open "SELECT * FROM titi.txt", Cn
        While Not rs.EOF()
               rsCible.Addnew
               rsCible.flieds(1) = rs.fields("klklkl")
               '.......
               '.......
               rsCible.flieds(n) = rs.fields("klkldkslklsll")
               rsCible.Update
               rs.movenext
        Wend
    Cette approche permet de piloter tout les champs que l on veut

    Sinon une commande de SQL pure fera l'affaire INSERT INTO FROM ........

    Il existe egalement des commandes d'importation dans l'objet adodb ..........

    Bref beaucoup de solutions existent pour inserer des recordsets de fichier texte dans une base de type mdb...


    Il suffit de faire le bon choix adapté au contexte du projet


    Bonne continuation



    Voilà

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Je suis désolé d'insister mais justement c lorsque j'essaye de faire communiquer mon Rs et mon ADOX.
    Quelques sont les objets ADOX qui me permettent de prendre les valeurs de mon Recordset?
    C vraiment la dessus que je bloque.
    Merci.

  6. #6
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 133
    Points : 160
    Points
    160
    Par défaut No comprendo
    J 'essaye de t'aider mais l'objet field permet de récupérer les valeurs de ton recordset . Regarde les proprietes de l'objet

    Sinon montre un bout de ton fichier ascii et un fichier excel pour mieux comprendre le probleme


    Un développeur soucieux d'aider

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Bonjour Lynx92260,
    Je sais que tu essayes de m'aider et je t'en suis tres reconnaissant.
    Tu a mis le doigt sur mon problème pricinpal.
    Je sais parcourir mon recordset (je l'utilise dans toutes mes macros) et je sais faire pas mal de choses en ADODB.

    Le souci de l'ADODB est que tu ne peux pas faire de requete sql hormis un SELECT. DOnc pas de DELETE, pas de UPDATE, pas de ADD.
    Pourquoi? Car en ADODB lorsque tu fais ta connection vers un fichier Text ou un Excel, la réference considére que c'est une LINK TABLE.

    Donc pour palier à ce souci de requete SQL, j'ai pensé passer par ADOX.
    ADOX.Catalog.Create te permet de créer un fichier MDB.
    ADOX.Table te permet de créer une table (Access) dans laquelle tu peux déterminer les différentes colonnes.

    Tu peux faire le lien en un objet ADOX et ADODB grace à l'un de ces deux codes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set Cn       = New ADODB.Connection
      Set Cat      = New ADOX.Catalog
      Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=biblio.mdb"
      Set Cat.ActiveConnection = Cn
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set Cn       = New ADODB.Connection
      Set Cat      = New ADOX.Catalog
      Cat.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=biblio.mdb"
      Set Cn = Cat.ActiveConnection
    et je pense qu'avec ca c'est presque gagné.

    en gros tu créés une autre connection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set CnASCII       = New ADODB.Connection
     
      CnASCII.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=biblio.mdb"
     
        Set Rs = New ADODB.Recordset
        Rs.Open "SELECT * FROM titi.txt", CnASCII
    donc j'ai ma table de créer (partie zappée) mais vide.
    J'ai les données voulues dans un recordset. Aucun changement a faire car je veux importer tout mon ASCII dans une table ADODB.
    J'ai des références qui "communiquent".

    Le seul souci c'est que je sais pas quels attributs ou méthode ou même object de ADOX utiliser pour récupérer dans une ADOX.Table les informations présentes dans un recordset.

    C'est vraiment mon seul point bloquant.
    Pour l'instant

  8. #8
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 133
    Points : 160
    Points
    160
    Par défaut
    bon je vois le topo


    Je cherche a comprendre .

    Tu veux piloter une base de donnée format MsAccess sous vba excel ?

    Le fichier ascci tu veux insérer tous les données dans une table vide préalablement structure comme pour le fichier ASCII

    La Vrai question est que veux tu faire de cette table une fois remplie sous ton application excel ?

    J'ai déjà beaucoup d applications sous excel avec des liens de données externes oracle , sql server et fichier CsV etc ........

    Je pense pourvoir d'aider en te fournissant un exemple concret dans fichier excel avec ton modele de fichier ascii.......


    Dans l'attente de t'aider passe une bonne journée

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par Lynx92260 Voir le message
    La Vrai question est que veux tu faire de cette table une fois remplie sous ton application excel ?
    Je fais cette base Access pour pouvoir faire principalement des UPDATE et des DELETE sur mes données ce que je ne peux pas avec ADODB.
    De plus lorsque j'ai x fichiers sources (csv, txt ou xls) je peux les centraliser en 1 seule base Access. Cela m'evite d'avoir plein de connection dans tout les sens à gérer et la "communication" entre les tables et bien plus facile.

    Quand je fais une macro, je vois toujours la macro comme un outil de pilotage. Donc aucune manip de données n'est faite directement sur le Excel en question, il ne sert qu'à piloter les données et à génerer un reporting final.

    Merci

  10. #10
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 133
    Points : 160
    Points
    160
    Par défaut un peu de cours sur adodb
    bonjour,

    N affirme pas rapidement l'impossibilite de insert , delete et update est impossible avec une base access sinon ca sert à rien qu à lire des des donnees

    Volia un tutoriel complet sur le recorset ado http://vb.developpez.com/bidou/recordset-ado/

    Je t" encourage à lire pour parfaire tes connaissances sur ADODB

    Bon lecture

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Merci Lynx92260,
    J'ai bien vu que je pouvais faire des INSERT, des DELETE et des updates dans mes recordset.
    J'ai mis ce lien en favori !!!

    Par contre, j'aimerais quand même savoir si on peut insérer des données d'un recordset dans ADOX.table.
    Je suis assez curieux techniquement et je pense que c'est possible.

    Mais en tout cas merci pour ce tutoriel sur les recordset!!

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par -={-_-}=- Voir le message
    J'ai bien vu que je pouvais faire des INSERT, des DELETE et des updates dans mes recordset.
    Ben justement, j'ai essayé et je n'y arrive vraiment pas pour les updates.
    Si j'essaye de le faire en suivant ton tuto, il me dit que je suis en read only.
    Donc on revient au souci de la link table!!
    Toi de ton coté, tu y arrives à updater des champs dans un recordset si tu pointes vers un txt, csv, ou xls??
    Merci

  13. #13
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 133
    Points : 160
    Points
    160
    Par défaut Patience
    je ne te lâche pas je suis un peu débordé ces derniers temps .......

    J'ai compris que tu veux lire un fichier ascii format csv pour insérer les données dans une table titi msaccess toto.mdb.


    Mais je t'ai mis sur la piste pourtant tu crées deux connexions

    CnCible de type adodb.connexion qui pointe sur la base toto.mdb et via la table titi

    CnSource de type adodb.connexion qui pointe sur le fichier asccii

    Tu parcours les recordsets du cnsource pour ajouter par la méthode addnew du recordset du cncible

    Voilà le principe que j'ai exposé dans mon code exemple ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
        Set rsCible = CnCible.openrecordet("TableSource")
        Set rs = New ADODB.Recordset
        rs.Open "SELECT * FROM titi.txt", CnSource
        While Not rs.EOF()
               rsCible.Addnew
               rsCible.flieds(1) = rs.fields("klklkl")
               '.......
               '.......
               rsCible.flieds(n) = rs.fields("klkldkslklsll")
               rsCible.Update
               rs.movenext
        Wend
    Bon courage

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Hello mister,
    Moi non plus j'ai pas laché l'affaire et j'ai trouvé :
    Et tout ce grace à la magie DAO.
    Voici comment ca marche :

    1° Tu ajoutes la référence DAO
    2) Voici un code exemple :

    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
    Public oDAO As DAO.DBEngine            'Object DAO permettant de piloter Access
    Public Base As DAO.Database            'Base de données Access
     
    Sub MagieDAO()
     
     
        Dim XLTable As DAO.TableDef
        Dim strSQL As String
     
          'Creation de la base
          Set oDAO = New DAO.DBEngine
          Set Base = oDAO.CreateDatabase("C:\Temp.mdb", ";LANGID=0x0409;CP=1252;COUNTRY=0", 64)
     
          'Création d'une link table vers mon excel
          Set XLTable = Base.CreateTableDef("TempXL")
          XLTable.Connect = "Excel 8.0;DATABASE=P:\p.xls"
          XLTable.SourceTableName = "Sheet1$"
          Base.TableDefs.Append XLTable
     
          'Creation d'une table (une vraie) qui reprend extactement le format de mon excel
          Set oIdx = Base.CreateTableDef("FichierExtract")
    With oIdx
        For i = 0 To XLTable.Fields.Count - 1
            If XLTable.Fields(i).Type = dbText Then
                .Fields.Append .CreateField(XLTable.Fields(i).Name, dbText, 255)
            Else
                .Fields.Append .CreateField(XLTable.Fields(i).Name, XLTable.Fields(i).Type)
            End If
        Next i
        .Fields.Append .CreateField("MontantDollar", dbDouble)
    End With
     
    Base.TableDefs.Append oIdx
     
          'Copie des données de la link table vers ma vrai table
          strSQL = "Insert into FichierExtract Select * FROM TempXL"
     
          Base.Execute strSQL
     
          'Suppresion de la table liée (on en a plus besoin).
          Base.TableDefs.Delete "TempXL"
     
          'ET CA, ENFIN CA MARCHE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          strSQL = "UPDATE FichierExtract Set MontantDollar = Montant*1.34"
          Base.Execute strSQL
     
          Base.Close
     
       End Sub
    Ta solution est pas mal mais elle est super longue si le fichier titi.txt est enorme.
    Par exemple, il arrive que j'ai des fichiers de + de 300 000 lignes donc la bonjour le temps d'execution!!!!

  15. #15
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 133
    Points : 160
    Points
    160
    Par défaut Bravo
    Moi aussi je suis passé par le moteur jet de MsAccess DAO mais avec une petite variante en utilisant la lecture directe du fichier (plusieurs méthodes)

    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 oFSO As Scripting.FileSystemObject
    Dim oFl As Scripting.File
    Dim oTxt As Scripting.TextStream
    'Instanciation du FSO
    Dim sLig() as variant
    Set oFSO = New Scripting.FileSystemObject
    Set oFl = oFSO.GetFile("D:\Essai\monfichier.txt")
    Set oTxt = oFl.OpenAsTextStream(ForReading)
    With oTxt
        While Not .AtEndOfStream
             ' Creation d'un tableau
             sLig=Split(.Read(1),";")
             rscible.addnew()
             rsCible("Nom")=sLig(0)
             ......
             rsCible("Montant")=sLig(n) 
             rscible.update
             .Skip 1
        Wend
    End With
    Cela fonctionne bien cette approche

    Mais attention les limites d'excel en matiere de nbr de lignes environ 64000.....

    Sinon Bravo pour la solution et Bon courage pour la suite de ton projet

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Problème résolu en DAO.
    Merci à Lynx du 9²
    Je mets la balise

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/02/2015, 17h44
  2. [AC-2007] Placer les données d'un recordset dans une table
    Par sk8bcn dans le forum VBA Access
    Réponses: 0
    Dernier message: 02/08/2012, 17h39
  3. [MySQL] Afficher toutes les données d'un champ dans une liste déroulante
    Par Touareg dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 19/03/2007, 12h42
  4. Réponses: 6
    Dernier message: 27/09/2006, 20h27

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