Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
996 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2193553
stcoeur
Posté le 10-06-2013 à 15:24:58  profilanswer
 

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

mood
Publicité
Posté le 10-06-2013 à 15:24:58  profilanswer
 

n°2193563
Marc L
Posté le 10-06-2013 à 15:58:34  profilanswer
 

 
           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
n°2193690
tarteflamb​ee
Posté le 11-06-2013 à 08:44:06  profilanswer
 

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
n°2193711
rufo
Pas me confondre avec Lycos!
Posté le 11-06-2013 à 10:39:39  profilanswer
 

+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
n°2193725
Marc L
Posté le 11-06-2013 à 11:15:36  profilanswer
 

 
           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
n°2193902
tarteflamb​ee
Posté le 12-06-2013 à 07:51:47  profilanswer
 

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:

n°2193958
Marc L
Posté le 12-06-2013 à 12:37:38  profilanswer
 

 
          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
n°2194178
tarteflamb​ee
Posté le 13-06-2013 à 19:58:23  profilanswer
 

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:

n°2194180
Marc L
Posté le 13-06-2013 à 20:14:01  profilanswer
 

 
           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
n°2194455
tarteflamb​ee
Posté le 14-06-2013 à 22:27:35  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
[VBA] Faisabilité d'une appli VBA multiclientsProblème de mise en ligne d un site local
[VBA] Ouverture et copie informations à partir d'un répertoire[VBA Excel 2002] Formater le résultat d'une fonction perso
Problème portée de variableRecuperer liste des documents
[Vba Excel 2010] Génération d'un pdf avec envoi d'email 
Plus de sujets relatifs à : [VBA Excel 2003] - Problème pour récupérer la 65537° ligne d'un CVS


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR