[VBA Excel 2003] - Problème pour récupérer la 65537° ligne d'un CVS

- 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: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

Reply

Marsh Posté le 10-06-2013 à 15:24:58   

Reply

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 …


Message édité par Marc L le 10-06-2013 à 16:03:40
Reply

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+


Message édité par tarteflambee le 11-06-2013 à 08:44:41
Reply

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.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

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) …

Message cité 1 fois
Message édité par Marc L le 11-06-2013 à 17:17:17
Reply

Marsh Posté le 12-06-2013 à 07:51:47    

Marc L a écrit :

 
           Je pense aussi à un  Split  avec accès au fichier directement en VBA plus rapide sans FSO (mesures de rapidité ici) …


 
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  :jap:

Reply

Marsh Posté le 12-06-2013 à 12:37:38    

 
          Synopsis :
 

  •   Affectation à une variable d'un n° de fichier libre (voir l'aide VBA de la fonction FreeFile).
  •   Ouverture du fichier en mode de lecture séquentielle (cf instruction Open).
  •   Lecture de l'intégralité du fichier (cf fonctions Input & LOF)
  •   Affectation à une variable d'un tableau créé par la séparation en sous-chaînes (cf fonction Split) de cette lecture, séparateur vbLf. (1)
  •   Fermeture du fichier (cf méthode Close).


     (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 …


Message édité par Marc L le 12-06-2013 à 17:36:43
Reply

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 :
  1. Num = FreeFile
  2. Open "D:\GVR_SVAR_20130531_20101117_shockrel_1" For Input As #Num
  3. Do Until EOF(Num)
  4.     Line Input #1, sline
  5. Loop
  6. Close #Num


 
Par contre je n'arrive pas à loader le fichier directement dans un tableau si le fichier est trop gros.

Code :
  1. tableau = Split(Input(LOF(Num), Num), vbLf)


 
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  :whistle:

Reply

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 …)


Message édité par Marc L le 13-06-2013 à 22:00:07
Reply

Marsh Posté le 14-06-2013 à 22:27:35    

oui avec un petit fichier ca marche, je retiens la méthode  :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed