fichier csv volumineux

grotsblues

XLDnaute Occasionnel
Bonsoir le forum

J'ai un fichier csv volumineux pour ouvrir avec excel 2003, en cherchant sur les forums, j'ai trouvé un code vba que j'ai adapte, mais que je lance le code j'ai un message d'erreur (erreur d'execution 6 depassement de capacite ) je n'arrive pas à comprendre

merci pour votre aide

Sub DecouperFichier()
Dim Tbl()
Dim Chemin As String
Dim Fichier As String
Dim i As Integer
Dim J As Integer
Dim K As Integer
'adapter le chemin...
'Chemin = "F:\"
Chemin = "E:\"

Fichier = "AR 072017.csv"
'ouvre pour lecture
'Open Chemin & Fichier & ".csv" For Input As #1
Open Chemin & "AR 072017.csv" For Input As #1
'stocke dans un tableau
Do While Not EOF(1)
i = i + 1
ReDim Preserve Tbl(1 To i)
Input #1, Tbl(i)
Loop
'puis le referme
Close #1
'défini le nombre de fichiers nécessaires
If UBound(Tbl) / 1048570 <> Int(UBound(Tbl) / 1048570) Then
K = Int(UBound(Tbl) / 1048570) + 1
Else
K = Int(UBound(Tbl) / 1048570)
End If
i = 1
'boucle et réparti les valeurs
For J = 1 To K
'Open Chemin & Fichier & "_" & J & ".csv" For Output As #1
Open Chemin & "AR 072017.csv" & "_" & J & "AR 072017.csv" For Output As #1
'gère l'erreur de l'indice hors tableau
'sur le dernier fichier
On Error Resume Next
For i = i To i + 1048570
Print #1, Tbl(i)
Next i
Close #1
Next J
End Sub
 

Dranreb

XLDnaute Barbatruc
C'est probablement le Redim Preserve qui plante plutôt
Ne pourriez vous essayer dans ce cas de lire et d'écrire un seul élément chaque fois, quitte à les compter pour changer de fichier de sortie quand ça arrive à 1048570 ?

Edit: Genre comme ça :
VB:
Sub DecouperFichier()
Dim Chemin As String, Fichier As String, Texte As String, N As Long, NFic As Long
Open Chemin & "AR 072017.csv" For Input As #1
Do While Not EOF(1)
   Input #1, Texte
   N = (N + 1) Mod 1048570
   If N = 1 Then
      NFic = NFic + 1
      Close #2
      Open Chemin & "AR 072017.csv" & "_" & NFic & "AR 072017.csv" For Output As #2
      End If
   Print #2, Texte
   Loop
Close #1, #2
End Sub
 
Dernière édition:

grotsblues

XLDnaute Occasionnel
bonsoir
j ai testé le code mais je ne comprends pas pourquoi je suis obligé de changer les 1048570 par 30000 (N = (N + 1) Mod 1048570) en effet si je laisse 1048570 le fichier fait plus que 1048570 donc trop gros pour l'ouvrir et si je teste avec 30000 il m'enregistre 3 fichiers qui sont ok

merci pour vos réponse
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Je ne peux pas savoir.
C'est vous qui aviez décidé à l'origine d'écrire 1048570 valeurs dans chaque fichier, j'ignore pourquoi.
Peut être avez vous confondu le nombre de valeurs avec la longueur maxi en octets du fichier.
si 1048570 est cette longueur, 30000 valeurs permettent une longueur moyenne d'environ 35 octets pour chacune.
 

Dranreb

XLDnaute Barbatruc
À ma connaissance l'instruction Input # ne lit pas des lignes mais des variables élémentaires séparées par des virgules.
Pour lire des lignes entières terminées par vbCrLf il faut utiliser Line Input #
Par contre Print # écrit chaque fois une ligne se terminant par CrLf.
Les affichez vous par un logiciel qui va à la ligne avant le CrLf si elle est trop longue ? Je ne sais pas…
 

Discussions similaires

Réponses
11
Affichages
287

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin