- Problème pour récupérer la 65537° ligne d'un CVS [VBA Excel 2003] - VB/VBA/VBS - Programmation
Marsh Posté le 10-06-2013 à 15:58:34
Bonjour,
ne sachant pas comment sont importées les lignes (où est le code ? [avec la balise qui va bien] Cf règles du forum),
il faudrait écrire alors votre propre code scindant les lignes sur plusieurs feuilles
ou envisager de passer à une version postérieure d'Excel gérant bien plus de lignes, un poil plus d'un million !
Autre possibilité si peu de colonnes sont utilisées, importation au delà de la limite dans des colonnes libres …
Marsh Posté le 11-06-2013 à 08:44:06
Bonjour,
Le problème c'est que tu ouvres le csv avec excel donc conversion excel et limite des 65536 lignes.
Tu peux utiliser un FilesystemObject/Textstream (set csv=fso.opentextstream) de la librairie microsoft scripting pour le lire en txt.
Tu pourras lire chaque ligne séquentiellement: split(csv.readline,"," ) pour récupérer chaque ligne
A+
Marsh Posté le 11-06-2013 à 10:39:39
+1 pour la méthode scriptée qui va récupérer ligne par ligne le contenu du CSV et répartir les données dans les différents onglets.
A noter qu'il vaudrait mieux préalablement désactiver la fonction de recalcul auto d'Excel, sinon, ça pourrait le faire ramer.
Marsh Posté le 11-06-2013 à 11:15:36
Je pense aussi à un Split avec accès au fichier directement en VBA plus rapide sans FSO (mesures de rapidité ici) …
Marsh Posté le 12-06-2013 à 07:51:47
Marc L a écrit : |
Est-ce que tu peux détailler comment tu as accès au fichier directement en VBA sans scripting et sans l’ouvrir dans une worksheet ?
Ca m’intéresse
Marsh Posté le 12-06-2013 à 12:37:38
Synopsis :
(1) L'affectation du tableau et la lecture du fichier font partie d'un seul bloc d'instructions en une ligne;
pour le séparateur de fin de ligne tout dépend en fait du fichier … Un indice du tableau représente une ligne du fichier.
Le tout tient en quatre lignes de code …
Cela a l'avantage d'être très rapide et sûr, le fichier ne restant même pas ouvert une seconde !
J'évite autant que possible FSO car, dans les cas simples ou courants, VBA dispose de tout le nécessaire …
S'il y a un séparateur entre les données d'une ligne, nouvelle utilisation de la fonction Split par ligne dans une variable temporaire
afin d'alimenter une variable tableau final tel un Range ligne - colonne …
Marsh Posté le 13-06-2013 à 19:58:23
Bon j'ai tester au boulot aujourd'hui.
Pour une lecture séquentielle c'est un tout petit peu + rapide (4 sec vs 5 sec pour scripting).
Code :
|
Par contre je n'arrive pas à loader le fichier directement dans un tableau si le fichier est trop gros.
Code :
|
J'ai "out of string space".
J'ai fait le test sur un fichier de 123 MO / 2 millions de lignes / 127 millions de char
Marsh Posté le 13-06-2013 à 20:14:01
Bon on pollue un peu ce sujet mais vu que l'on n'a pas de nouvelle de son auteur ! …
Normalement le code doit s'écrire ainsi : tableau = Split(Input(LOF(Num), #Num), vbLf) …
Cette ligne remplace les lignes n°4 à 6 du code précédent;
et là c'est bien plus rapide que de lire le fichier séquentiellement ligne par ligne comme avec ces lignes n°4 à 6
et il manque aussi le traitement …
Par contre je n'ai jamais essayé avec un fichier aussi gros ‼ Tu n'as pas un fichier plus p'tit ?!
Edit : du bol qu'avec FreeFile par défaut Num vaut 1 pour la ligne n°5 ! (#1 au lien de #Num …)
Marsh Posté le 14-06-2013 à 22:27:35
oui avec un petit fichier ca marche, je retiens la méthode
Marsh Posté le 10-06-2013 à 15:24:58
Bonjour,
Dans l'optique de créer un modèle statistique, j'utilise actuellement l'outil Excel 2003. Je dispose d'importants fichiers de données CVS, et je souhaite les importer sous Excel. Je fais donc une importation de données externes, enregistrée en format macro pour la réutiliser.
Seulement, comme le logiciel Excel 2003 ne contient que 65536 lignes, j'avais pour idée de réutiliser ma macro pour récupérer mes données situées au lignes suivant la 65536° ligne, et les enregistrer dans plusieurs feuilles.
Seulement, lors de l'importation de donnée, Excel me dis que mon fichier CVS ne contient que 65536 lignes.
En gros la 65537° ligne et les autres sont considérées comme vide par Excel, ce qui n'est pas le cas.
Avez vous une idée pour résoudre ce problème?
Cordialement
Romain