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 :

Copier le contenu d’un objet Recordset directement dans un array


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Pôle Etude et Automatisation
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pôle Etude et Automatisation
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut Copier le contenu d’un objet Recordset directement dans un array
    Bonsoir,

    Je dois récupérer des données qui se trouvent dans plusieurs fichiers csv. Je souhaiterai pouvoir nettoyer celles-ci dans un tableau avant de les intégrer dans une feuille ou mieux de ne sélectionner que les données pertinentes.

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
     
    Sub R12()
     
        Dim rep As String
     
        txt = "[F.CSV]" & vbCrLf & "Format=Delimited(;)"
     
        rep = "C:\Users\ericm\Documents\Eric\TRAITE"
     
        If rep = "" Then Exit Sub
     
        Set Cn = CreateObject("ADODB.Connection"): Cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & rep & ";Extended Properties=""Text;HDR=YES;FMT=Delimited;"";")
     
        With Sheets(1)
     
            tbls = TableToutes
     
            If TypeName(tbls) = "Variant()" Then
     
                For i = 0 To UBound(tbls, 2)
     
                    Importer rep, .Cells(.Cells.Rows.Count, "A").End(xlUp).Offset(1), CStr(tbls(2, i)), True
     
                Next
     
            End If
     
        End With
     
    End Sub
    Sub Importer(Repertoire As String, Destination As Range, Table As String, Entete As Boolean)
     
        With Cn
     
            If Table <> "" Then
     
                NewFichierTxt Repertoire & "\schema.ini", Replace(txt, "F.CSV", Replace(Table, "#", "."))
     
                If TableExiste(Table) Then Destination.CopyFromRecordset .Execute("SELECT * FROM [" & Table & "]")
     
                Kill Repertoire & "\schema.ini"
     
            End If
     
        End With
     
    End Sub
     
    Public Property Get PremiereTableAdo() As String
     
        With Cn.OpenSchema(20)
     
            If Not .EOF Then
     
                PremiereTableAdo = .Fields("TABLE_NAME")
     
            End If
     
            .Close
     
        End With
     
    End Property
    Public Property Get TableExiste(TableName As String) As Boolean
     
        With Cn.OpenSchema(20)
     
            If Not .EOF Then
     
              .Filter = "TABLE_NAME ='" & TableName & "'"
     
               TableExiste = Not .EOF
     
            End If
     
            .Close
     
        End With
     
    End Property
    Public Property Get TableToutes()
     
        TableToutes = False
     
        With Cn.OpenSchema(20)
     
            If Not .EOF Then
     
              TableToutes = .getrows
     
            End If
     
            .Close
     
        End With
     
    End Property
    Private Sub NewFichierTxt(Fichier, txt)
     
        Dim fso, NewFichier
     
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set NewFichier = fso.OpenTextFile(Fichier, 2, True)
     
        NewFichier.Write txt
        NewFichier.Close
     
        Set NewFichier = Nothing
        Set fso = Nothing
     
    End Sub
    Je pense que la solution se trouve au niveau de la ligne 40 du code ci-dessus.

    Je voudrais que le recordset s'enregistre dans un tableau plutôt que dans un range.

    Merci pour votre aide.

    Eric

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    Notes qu'il est possible de filtrer ta requête !
    If TableExiste(Table) Then tableau= .Execute("SELECT * FROM [" & Table & "]").GetRowsIl sera peut être utile de faire un application.transpose!

  3. #3
    Membre confirmé
    Profil pro
    Pôle Etude et Automatisation
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pôle Etude et Automatisation
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Merci cela fonctionne parfaitement.

    Comme tu l'indiques je vais essayer de filtrer à partir de la requête pour n'obtenir que les données souhaitées. Par ailleurs d'autres fichiers devront venir s'ajouter à ce tableau.

    Je laisse le post ouvert pour le moment et déposerai le code final si quelqu'un est intéressé

    Encore merci

    Eric

  4. #4
    Membre confirmé
    Profil pro
    Pôle Etude et Automatisation
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pôle Etude et Automatisation
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Bonjour,

    Je n'arrive pas à exclure les lignes qui font apparaître TOT dans la chaine de caractère du champ [NATURE DES OPERATIONS]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    If TableExiste(Table) Then tableau = .Execute("SELECT SERVICE, [DATE COMPTABLE],[NATURE DES OPERATIONS], DEBITS, CREDITS,[IMPUTATION CORRESPONDANTE] FROM [" & Table & "] _
    WHERE DEBITS - CREDITS>0 AND len(SERVICE)= 7 AND NOT [NATURE DES OPERATIONS] LIKE '*TOT*' OR DEBITS - CREDITS < 0 AND len(SERVICE)= 7 AND NOT [NATURE DES OPERATIONS] LIKE '*TOT*' ").GetRows
    Merci

    Eric

  5. #5
    Membre confirmé
    Profil pro
    Pôle Etude et Automatisation
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pôle Etude et Automatisation
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Solution de contournement qui fonctionne mais pas satisfaisante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If TableExiste(Table) Then tableau = .Execute("SELECT SERVICE, [DATE COMPTABLE],[NATURE DES OPERATIONS], DEBITS, CREDITS,[IMPUTATION CORRESPONDANTE]  FROM [" & Table & "] WHERE  ([NATURE DES OPERATIONS]) NOT IN ('TOTAUX DU PRESENT BORDEREAU','TOTAL GENERAL DU PRESENT BORDEREAU','SOUS-TOTAL','TOTAUX DES BORDEREAUX ANTERIEURS', 'TOTAUX DES BORDEREAUX ADRESSES DEPUIS LE 1ER JANVIER','TOTAUX GENERAUX DES REGLEMENTS DEPUIS LE 1ER JANVIER'); ").GetRows

    La solution: ne pas utliser * mais %

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If TableExiste(Table) Then tableau = .Execute("SELECT SERVICE, [DATE COMPTABLE],[NATURE DES OPERATIONS], DEBITS, CREDITS,[IMPUTATION CORRESPONDANTE]  FROM [" & Table & "] WHERE ( [NATURE DES OPERATIONS]) NOT LIKE '%TOT%'; ").GetRows
    Eric

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/10/2007, 14h53
  2. Copier le contenu d'un fichier distant dans une variable en local
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/08/2007, 20h34
  3. Réponses: 5
    Dernier message: 07/01/2006, 16h55
  4. copier le contenu d'une page web dans un fichier texte
    Par wassila dans le forum C++Builder
    Réponses: 30
    Dernier message: 28/08/2005, 22h27
  5. Réponses: 2
    Dernier message: 16/07/2004, 09h30

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