[VBA] - import .csv très gros document

Bonsoir,

Simple petite question..

Savez-vous s'il est possible d'importer les informations contenues dans un document au format csv, dont le nombre de lignes dépasse les 780 000 pour un poids de 380mo ?

J'utilise ce code :

Set so = Worksheets("Source")
lrso = so.Cells(Rows.Count, 1).End(xlUp).Row

'Nettoyer le tableau avant calculs
                so.Cells(1).CurrentRegion.Offset(1).ClearContents

                Application.FileDialog(msoFileDialogFilePicker).Show
                myfile = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)

                With ActiveSheet.QueryTables.Add(Connection:= _
                                                 "TEXT;" & myfile, _
                                                 Destination:=Range("$A$1"))
                    .TextFileParseType = xlDelimited
                    .TextFilePlatform = 65001 '1252 '850
                    .TextFileSemicolonDelimiter = True
                    .Refresh
                End With

End Sub

J'imagine qu'il n'y a pas vraiment de solution, mais je pose la question sait-on jamais !

Pour info, quand je lance ce code, Excel cesse de répondre au bout d'un moment.

L'ouverture du csv, (double clic) ne cause pas de problème.

L'objectif derrière tout ça, c'est de pouvoir importer toutes les données dans une document .xlsm, pour ne conserver que les lignes où, en colonne P, il est écrit "Plantae".

Merci de votre attention, bonne fin de journée !

A plus tard

Bonsoir,

Serais t'il possible de savoir quels sont les entêtes de ton fichier et le séparateur utiliser ?

Bonsoir,

Fichier .csv séparateur " ; "

30 en-têtes :

[A] CD_NOM Utile

CD_REF Utile

[C] CD_SUP Inutile

[D] CD_TYPE_STATUT Utile

[E] LB_TYPE_STATUT Utile

[F] REGROUPEMENT_TYPE Utile

[G] CODE_STATUT Utile

[H] LABEL_STATUT Utile

[I] RQ_STATUT Inutile

[J] CD_SIG Inutile

[K CD_DOC Inutile

[L] LB_NOM Utile

[M] LB_AUTEUR Utile

[N] NOM_COMPLET_HTML Inutile

[O] NOM_VALIDE_HTML Inutile

[P] REGNE Inutile (Facultatif)

[Q] PHYLUM Inutile

[R] CLASSE Inutile

[S] ORDRE Inutile

[T] FAMILLE Inutile

[U] GROUP1_INPN Inutile

[V] GROUP2_INPN Inutile

[W] LB_ADM_TR Utile

[X] NIVEAU_ADMIN Utile

[Y] CD_ISO3166_1 Utile

[Z] CD_ISO3166_2 Inutile

[AA] FULL_CITATION Inutile

[AB] DOC_URL Inutile

[AC] THEMATIQUE Inutile

[AD] TYPE_VALUE Inutile

[/u]

[/u](Tout est au format texte et doit le rester)

A plus tard ![/u]

Pour empêcher que ton appli bug et ton fichier devienne trop lourd, tu peut procéder comme suit :

Une première macro qui importe le fichier dans une feuille "Tempo" (qui se créer et ce supprime à la fin du traitement dans le même fichier ou un classeur tampon) excel et qui supprime les colonnes inutiles.

Une macro qui importe les données de la feuille "Tempo" moins lourd en colonne.

Ce type de traitement se fera très rapidement si ton fichier csv à moins de ligne.

Bonjour

voila une vielle macro a voir

A+

Maurice

18importcsv1.zip (14.92 Ko)

Bonjour à tous

C'est faisable par PowerQuery intégré à ta version.

J'ai dépanné un fil sur de très gros csv et cela marche bien...

Il faudrait poster un exemple

Bonjour,

Une première macro qui importe le fichier dans une feuille "Tempo" (qui se créer et ce supprime à la fin du traitement dans le même fichier ou un classeur tampon) excel et qui supprime les colonnes inutiles.

C'est cette première étape d'import qui pose problème.

Si je me base sur le document que vous avez transmis, je peut importer 65 000 lignes, ce qui équivaut au maximum autorisé sur la feuille de calcul.

Si j'utilise ce code sur une feuille Excel 2016, la limite de ligne est plus grande, donc toutes les données sont récupérables. Ça plante Excel prendant minutes, mais ça fonctionne. Je me demande s'il est directement possible de ne rechercher que certaines colonnes, pour accélérer la procédure.

Je ne peux pas donner d'exemple ; si je joins dans cette discussion, un fichier de taille réduite, alors n'importe quel code pourra fonctionner. Je joins quand même un document avec les en-têtes et quelques lignes, au cas où !

10test.csv (17.99 Ko)

RE

Ton exemple ne contenant pas Plantae dans le colonne REGNE, le résultat est vide...

Change le chemin et le nom du csv puis teste chez toi avec Données, actualiser Tout

17importcsv.xlsx (20.07 Ko)

Bonsoir,

Testé avec un nouveau document "test" ; ça fonctionne très bien. La vitesse d'exécution est extrêmement rapide !

En revanche, il n'y a rien qui m'indique comment tout ça s'exécute .

Si je veux pouvoir m'en servir, je vais devoir comprendre comment cela fonctionne ! Un document qui fait tout, tout seul, ça m'inquiète, surtout pour la suite.

Comme vous écrivez :

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Je n'y connais rien en PowerQuery. Serait-il possible de m'indiquer la procédure que vous avez suivi pour obtenir ce résultat ?

Merci beaucoup pour la proposition en tout cas !

A plus tard

RE

Je m'absente.

Je te dis dans 45mn...

RE

Utiliser Données, Requêtes et Connexions : cela affiche à droite la liste des requêtes

Double clic sur la requête : cela ouvre PowerQuery

J'ai défini 2 variables afin de rendre modifiable le chemin d'accès au fichier (j'avais pour cela au préalable nommé chacune des 2 cellules en jaune) et ait modifié la ligne Source (volet de droite PowerQuery).

J'avais obtenu la ligne Source directement depuis Excel avec Données, A partir d'un fichier texte/CSV.

Les lignes sous, Source, En-têtes promus et Type modifié, sont automatiques après choix du fichier csv.

Après, comme on le ferait dans Excel, on supprime les colonnes inutiles et on ajoute le filtre sur REGNE

On ferme PowerQuery et on récupère automatiquement le résultat dans un tableau sur un nouvel onglet.

Si on veut plutôt créer un TCD, on sort par Fermer et Charger dans, TCD

Je vais essayer ça !

Je reviens quand j'aurai compris et testé

Ou si quelque chose cloche.

Merci !

Bonsoir,

J'ai créé un nouveau document pour travailler,

Je nomme :

  • la cellule [B1] : "Dossier"
  • la cellule [B2] : "Fichier"

J'importe mes données en cliquant sur "A partir d'un fichier texte / CSV" puis en clique sur "Transformer mes données".

Je modifie la ligne source en tapant {Dossier} et {Fichier} je me retrouve avec l'erreur :

"DataFormat.Error : URI non valide : Impossible d'analyser le nom d'hôte.

Détails : {Dossier}{Fichier}.csv"

Ou alors Excel mouline sans résultat.

Je ne trouve pas d'autre moyen de changer la source pour le moment.

J'ai aussi remarqué dans le fichier que vous avez transmis, que lorsque je supprime les données et que j'actualise tout à nouveau, il ne se passe rien. Il faut alors éviter de supprimer les en-têtes pour que ça continue à fonctionner. Comment faut-il s'y prendre pour éviter que ça ne s'arrête de fonctionner si on supprime les données ? Déclarer un tableau suffit ?

Bonne soirée !

RE

J'ai créé un nouveau document pour travailler,

Je nomme :

  • la cellule [B1] : "Dossier"
  • la cellule [B2] : "Fichier"

J'importe mes données en cliquant sur "A partir d'un fichier texte / CSV" puis en clique sur "Transformer mes données".

Je modifie la ligne source en tapant {Dossier} et {Fichier} je me retrouve avec l'erreur :

"DataFormat.Error : URI non valide : Impossible d'analyser le nom d'hôte.

Détails : {Dossier}{Fichier}.csv"

Regarde mon exemple : j'ai défini les 2 variables Dossier et Fichier avant de les utiliser et la syntaxe de Source doit être respectée.

On définit en passant par l'éditeur avancé

J'ai aussi remarqué dans le fichier que vous avez transmis, que lorsque je supprime les données et que j'actualise tout à nouveau, il ne se passe rien. Il faut alors éviter de supprimer les en-têtes pour que ça continue à fonctionner. Comment faut-il s'y prendre pour éviter que ça ne s'arrête de fonctionner si on supprime les données ? Déclarer un tableau suffit ?

Tu supprimes quoi, où ? Ta question n'est pas claire ?

Une requête lit le contenu du csv : si les en-têtes changent d'un csv à l'autre, effectivement cela ne marchera pas...

Bonjour,

Merci pour les précisions, tout fonctionne trés bien a priori !

Votre solution est ultra efficace ! Excel est en mesure de gérer les 800 000 lignes pour ne garder que ce qui est nécessaire en 10 secondes !

Quand je parlais de supprimer les données, je voulais dire, supprimer manuellement (sélectionner et supprimer les lignes) le tableau généré par PowerQuery. Mais si on ne le touche pas, on a pas de problème et on peut charger un nouveau tableau. Et dans mon cas je n'aurai pas besoin de supprimer le tableau de toute manière.

Pour que tout soit automatisé, j'ai associé du code VBA (pour aller chercher le chemin d'accès toujours correctement) avec la requête PowerQuery.

Encore merci pour votre aide

Bonne journée !

Rechercher des sujets similaires à "vba import csv tres gros document"