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 :

Import CSV dans une variable tableau [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 15
    Par défaut Import CSV dans une variable tableau
    Bonjour,

    Je suis un débutant sur excel et je voudrais savoir si quelqu'un savait comment faire pour importer les données d'un fichier csv stocké dans un répertoire :

    C:\Users\e552538\Desktop\Outils\ dans une variable tableau.

    En effet je vais devoir parcourir ce tableau par la suite pour effectuer des calculs.

    Je suis obligé de passer par un tableau car lorsque je fais mon import de fichier dans un de mes onglets, et que je veux utiliser les données remontées dans l'onglets; j'obtiens un bug et le message "Excel Ne répond plus". étant donnée qu'il y'a environ 800 000 données dans mon fichier.

    pour éviter ce genre de bug, j'ai donc décider de charger ce fichier dans une variable tableau et d'utiliser ce tableau pour effectuer mes calculs.

    Est ce que quelqu'un connait comment faire pour importer un fichier .csv avec séparateur ";" dans une variable tableau de vba Execl SVP ?

    Merci d'avance pour votre aide.

    Cdt,

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Est ce que quelqu'un connait comment faire pour importer un fichier .csv avec séparateur ";" dans une variable tableau de vba Execl SVP ?
    1) Confirme que par "tableau", tu entends "matrice"
    2) quel est le poids, en octets, de ton csv ?

  3. #3
    Membre averti
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 15
    Par défaut
    Il s’agit effectivement de stocker les données du fichier dans une matrice.
    Mon csv fait environ 175000 ko

  4. #4
    Membre averti
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 15
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour

    1) Confirme que par "tableau", tu entends "matrice"
    2) quel est le poids, en octets, de ton csv ?
    Salut,
    Le tableau c’est bien une matrice dans laquelle je veux stocker les donnes du csv.
    Mon fichier fait exactement 1750000o ( il est assez lourd. Il contient environ 200000 lignes)

    Merci encore pour ton aide

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Ce fichier n'est donc pas trop lourd pour être lu d'un seul coup.
    Deuxième question : combien de "colonnes" possède-t-il ? --->> le mieux est de montrer ici quelques lignes de ce fichier ouvert avec notepad --->> un copié/collé de 3 ou 4 lignes ....

  6. #6
    Membre averti
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 15
    Par défaut
    Citation Envoyé par unparia Voir le message
    Ce fichier n'est donc pas trop lourd pour être lu d'un seul coup.
    Deuxième question : combien de "colonnes" possède-t-il ? --->> le mieux est de montrer ici quelques lignes de ce fichier ouvert avec notepad --->> un copié/collé de 3 ou 4 lignes ....
    Voici en pj un extrait du fichier à importerfichiertest.zip

    merci

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Voilà donc un fichier text composé d'un certain nombre de lignes de 26 colonnes.
    Regarde ce que fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim FF As Integer, quoi As String, k As Long, n As Long
        FF = FreeFile
       Open "d:\fichiertest.csv" For Input As #FF  '---->>> remplace par ton chemin
       quoi = Input(LOF(FF), #FF)
       Close #FF
       titi = Split(quoi, vbCrLf)
       For k = 0 To UBound(titi)
         MsgBox titi(i) ' --->> on a là une ligne entière de 26 colonnes
          toto = Split(titi(i), ";")
            For n = 0 To UBound(toto)
              MsgBox "la colonne " & n & " de la ligne " & k & " contient " & toto(n)
            Next
       Next
    Voilà. Il te suffit de remplacer le second msgbox par une instruction d'alimentation de ta matrice (tu connais tant le N° de ligne (k), que le N° de colonne (N) et la valeur (toto(n)).
    A toi de faire ce petit bout classique là.

    PS : pour dimensionner ta matrice (en base 0) : 1ère dimension (lignes) : ubound(titi) - 2ème dimension (colonnes) : 25

  8. #8
    Membre averti
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 15
    Par défaut
    Lors du chargement de mon fichier dans la table, j'ai un plantage. j'ai en effet le message "Excel ne répond pas". Le problème doit être dû au fait que mon fichier contient trop de ligne car lorsque je fais un test avec un fichier plus petit je n,'ai pas ce problème.
    Est ce que tu connais un moyen d'optimiser l’exécution de cette fonction de sorte à ne plus avoir ce problème. En effet je passe par un tableau car lorsque je charge mon fichier directement dans un onglet excel. J'ai le même problème de lenteur lorsque je parcours ensuite ce fichier.

    Merci encore pour ton aide

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Lis alors ton fichier par paquets.
    Je n'ai pas le temps (c'est moi qui suis le cuistot et ce que j'ai en route est délicat) de faire moi-même cette recherche, mais je sais que j'ai montré comment sur ce forum. Fais cette recherche.

  10. #10
    Membre averti
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 15
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour
    Lis alors ton fichier par paquets.
    Je n'ai pas le temps (c'est moi qui suis le cuistot et ce que j'ai en route est délicat) de faire moi-même cette recherche, mais je sais que j'ai montré comment sur ce forum. Fais cette recherche.
    Salut,

    J'ai résolu mon problème. En fait mon csv était au format Unix, en le convertissant au format Windows, le problème est résolu.

    Merci encore pour tes réponses.


  11. #11
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Content pour toi.

    Mais l'occasion m'a été donnée de pointer du doigt les "bienfaits" (euh ..) des réponses données par invite à ouvrir des liens externes.

    Voilà ce que cela donne.
    https://www.developpez.net/forums/d1...s/#post9969578

    Belle "réponse" et belle "efficacité", n'est-il pas ?

  12. #12
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut Importet ligne à ligne un (gros) fichier csv dans un tableau
    Bonjour,

    Dans un csv, lorsqu'un champ texte contient un séparateur de champ (, ou et/ou un séparateur de ligne (CrLf) et/ou un identificateur de texte ("), il doit être placé entre deux identificateurs de texte et les identificateurs de texte situés dans le texte doivent être doublés ("")
    Dans ce cas, utiliser simplement split pour séparer les lignes et split pour séparer les champs génèr des erreurs dans les lignes et/ou les données.

    Ce code charger une à une les lignes du csv dans un tableau en tenant compte du problème ci-dessus.

    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
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    ' Établir la référence à ADODB :  Microsoft ActiveX Data Objects 6.1 Library
    ' Pour les valeurs de Stream.Charset, voir dans le registre : HKEY_CLASSES_ROOT\MIME\Database\Charset
    Option Explicit
    Option Private Module
    Public Const sepV$ = ","                                    'séparateur de valeurs
    Public Const sepL$ = vbCrLf                                 'séparateur de lignes
    Public Const idTxt$ = """"                                  'identificateur de texte = chr(34)
    Private Sub Test()
    Dim nom$
      nom = ThisWorkbook.Path & "\Fichiers texte\Test_UTF8_avec_BOM.csv"  'à adapter
      Call Charger_csv_UTF8_dans_tableau(ActiveSheet, nom)
    End Sub
    Public Sub Charger_csv_UTF8_dans_tableau(wsh As Worksheet, ByVal nomCompletFichier As String)
    Dim fUtf8 As ADODB.Stream         'flux de données Utf8
    Dim tbl As Variant                'tableau des valeurs
    Dim cel As Range                  'cellule destination
    Dim txt As String                 'texte
    Dim lgn As String                 'ligne
    Dim nbL As Long                   'nomnre de lignes
    Dim nbC As Long                   'nomnre de colonnes
    Dim lgr As Long                   'longueur
      Set fUtf8 = New Stream
      With fUtf8
        ' Définir le flux de données Utf8
        .Charset = "utf-8"                   ' ou autre
        .Mode = adModeReadWrite
        .Type = adTypeText
        .LineSeparator = adCRLF
        ' Ouvrir le flux et charger le contenu du fichier
        .Open
        .LoadFromFile nomCompletFichier
        ' Déterminer la taille du tableau
        Do Until .EOS
          lgn = txt & .ReadText(-2)   '-2 = une ligne
          lgr = Len(lgn) - Len(Replace(lgn, idTxt, ""))
          If (lgr Mod 2) = 0 Then
            ' la ligne est complète : compter les colonnes
            Call CompterColonnesCSV(lgn, nbC)
            txt = "": nbL = nbL + 1
          Else
            ' la ligne est incomplète : la concaténer avec la précédente
            txt = txt & lgn & sepL
          End If
        Loop
        ' Remplir le tableau
        ReDim tbl(1 To nbL, 1 To nbC)
        .Position = 0: nbL = 0
        Do Until .EOS
          lgn = txt & .ReadText(-2)
          lgr = Len(lgn) - Len(Replace(lgn, idTxt, ""))
          If (lgr Mod 2) = 0 Then
            ' la ligne est complète : l'enregistrer dans le tableau
            nbL = nbL + 1
            Call RemplirLigneTableauCSV(tbl, lgn, nbL)
            txt = ""
          Else
            ' la ligne est incomplète : la concaténer avec la précédente
            txt = txt & lgn & sepL
          End If
        Loop
        .Close
      End With
      Set fUtf8 = Nothing
      ' Ecrire le tableau sur la feuille
      wsh.UsedRange.Offset(1).Clear
      wsh.Cells.ClearContents
      Set cel = wsh.Range("A1")
      cel.Resize(UBound(tbl, 1), UBound(tbl, 2)).FormulaLocal = tbl   'si les date sont au format local
    '  cel.Resize(UBound(tbl, 1), UBound(tbl, 2)).Formula = tbl        'si les date sont au anglais
    End Sub
    Private Sub CompterColonnesCSV(lgn As String, nbC As Long)
    Dim txt As String                 'texte
    Dim nfo As String                 'info (champ)
    Dim lgr As Long                   'longueur
    Dim qté As Long                   'quantité de colonnes
    Dim t As Variant                  'Tableau des champs bruts
    Dim i As Long                     'index
      If lgn = "" Then Exit Sub
      t = Split(lgn, sepV)
      For i = LBound(t) To UBound(t)
        nfo = txt & t(i)
        lgr = Len(nfo) - Len(Replace(nfo, idTxt, ""))
        If (lgr Mod 2) = 0 Then
          ' le champ est complet
          txt = "": qté = qté + 1
        Else
          ' le champ est incomplet : le concaténer avec le précédent
          txt = txt & nfo & sepV
        End If
      Next i
      If qté > nbC Then nbC = qté
    End Sub
    Private Sub RemplirLigneTableauCSV(tbl As Variant, lgn As String, nbL As Long)
    Dim txt As String                 'texte
    Dim nfo As String                 'info (champ)
    Dim lgr As Long                   'longueur
    Dim nbC As Long                   'nombre de colonnes
    Dim t As Variant                  'Tableau des champs bruts
    Dim i As Long                     'index
      If lgn = "" Then Exit Sub
      t = Split(lgn, sepV)
      For i = LBound(t) To UBound(t)
        nfo = txt & t(i)
        lgr = Len(nfo) - Len(Replace(nfo, idTxt, ""))
        If (lgr Mod 2) = 0 Then
          ' le champ est complet
          If Mid(nfo, 1, 1) = idTxt Then
            ' le texte est délimité, enlever les délimiteurs
            nfo = Mid(nfo, 2, Len(nfo) - 2)
            ' remplacer les doubles délimiteurs pas un simple délimiteur
            nfo = Replace(nfo, idTxt & idTxt, idTxt)
          End If
          ' écrire le champ dans le tableau
          nbC = nbC + 1
          tbl(nbL, nbC) = nfo
          txt = ""
        Else
          ' le champ est incomplet : le concaténer avec le précédent
          txt = txt & nfo & sepV
        End If
      Next i
    End Sub

  13. #13
    Invité
    Invité(e)
    Par défaut
    Ca marche maintenant parfaitement , le seul souci est la detection des lignes


    le script me met tous sur une seul ligne , il ne semble pas détecter la fin de ligne de mon CSV

    je ne sais pas si je peux t'envoyer mon csv pour voir.

    ci dessous la config appliqué e

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Explicit
    Option Private Module
    Public Const sepV$ = ";"                                    'séparateur de valeurs
    Public Const sepL$ = vbCrLf                                 'séparateur de lignes
    Public Const idTxt$ = """"                                'identificateur de texte = chr(34)
    Private Sub Test()
    Dim nom$
      nom = Application.GetOpenFilename  'à adapter
      Call Charger_csv_UTF8_dans_tableau(ActiveSheet, nom)
     End Sub

  14. #14
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Citation Envoyé par cepiat Voir le message
    le script me met tous sur une seul ligne , il ne semble pas détecter la fin de ligne de mon CSV
    C'est cette ligne de code qui effectue la séparation des lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      With fUtf8
        ' Définir le flux de données Utf8
        .Charset = "utf-8"                   ' ou autre
        .Mode = adModeReadWrite
        .Type = adTypeText
        .LineSeparator = adCRLF
         ' Ouvrir le flux et charger le contenu du fichier
    C"est le cas général où les lignes sont séparées par CrLf (13.10) mais peuvent être séparées que par Cr (13), et rarement que par Lf (10).
    Vérifies en ouvrant ton csv avec un éditeur Ascii et hexa soit 0D 0A (CrLf), soit 0D seul (Cr), soit 0A seul (Lf).

  15. #15
    Invité
    Invité(e)
    Par défaut
    Merci du coup après test c'est bien adLF que je dois utiliser merci

  16. #16
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Citation Envoyé par cepiat Voir le message
    Merci du coup après test c'est bien adLF que je dois utiliser merci
    C'est inconvénient des csv : il n'y a pas de standard !

  17. #17
    Invité
    Invité(e)
    Par défaut
    Grrr les standards Microsoft , venant de la programmation du monde libre je me familiarise doucement avec la programmation VBA .


    Merci beaucoup Patrice pour ton partage de connaissances.

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

Discussions similaires

  1. [Shell] import CSV dans une base de données.
    Par AngeDéchu dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 18/01/2012, 21h14
  2. importer CSV dans une base
    Par altair8080 dans le forum Ruby on Rails
    Réponses: 8
    Dernier message: 20/09/2009, 14h51
  3. Comment insérer les valeurs d'une requete dans une variable tableau
    Par uptoditime dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/12/2007, 12h03
  4. recherche dans une variable tableau
    Par le petit nicolas dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/05/2007, 12h41
  5. [VBA-E]Recherche dans une variable tableau
    Par illight dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/12/2006, 17h50

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