Combiner 2 fichiers CSV, VBA Error 9

Signaler
Messages postés
3
Date d'inscription
vendredi 26 février 2010
Statut
Membre
Dernière intervention
26 janvier 2011
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour à tous et merci par avance pour vos réponses...

Objectif:
combiner deux fichiers CSV aux colonnes identiques en 1 seul fichier CSV
en additionnant si nécessaire les lignes redondantes.

Exemple des fichiers CSV:

fichier 1:
DE_A;2010;12;YTD;BEABB__PTSY;EUR;UU0600;[ICP None];1789;[None];[None];IN;546

fichier 2:
DE_A;2010;12;YTD;BEABB__PTSY;EUR;UU0600;[ICP None];1789;[None];[None];IN;4

le fichier créé devrait donc me donner:
DE_A;2010;12;YTD;BEABB__PTSY;EUR;UU0600;[ICP None];1789;[None];[None];IN;550

Si les lignes étaient différentes (sauf dernière colonne)...les deux lignes devraient rester dans le fichier combiné :)

Le Code:
Dim sFileContent As String
Dim xsLines() As String
Dim i As Long
Dim k As Long
Dim xsFields1() As String
Dim xsFields2() As String

Open "C:\Documents and Settings\nljecou\Desktop\TEST - exampl P1012 BE.csv" For Input As #1
sFileContent = Input(LOF(1), 1)
Close #1

Open "C:\Documents and Settings\nljecou\Desktop\TEST - exampl P1012 LU.csv" For Input As #1
sFileContent = sFileContent & vbNewLine & Input(LOF(1), 1)
Close #1


'# A ce stade, on a stocké dans sFileContent la totalité des deux fichiers.
'# Reste a fusionner les lignes donc le code coincide.
xsLines = Split(sFileContent, vbNewLine)

'# On parcoure les lignes une a une
For i = 0 To UBound(xsLines)
If LenB(xsLines(i)) Then
'# On manipulera plus facilement la ligne.
xsFields1 = Split(xsLines(i), vbTab)

'# On parcoure les autres lignes.
For k = i + 1 To UBound(xsLines)
If LenB(xsLines(k)) Then
xsFields2 = Split(xsLines(k), vbTab)
'# Si les codes coïncident, on supprime la ligne 'k'
If xsFields1(1) = xsFields2(2) Then
xsFields1(2) = Val(xsFields1(2)) + Val(xsFields2(2))
xsFields1(3) = Val(xsFields1(3)) + Val(xsFields2(3))

xsLines(k) = vbNullString
End If
End If
Next k

'# On recolle les champs, pour mettre a jour la ligne
xsLines(i) = Join(xsFields1, vbTab)
End If
Next i

sFileContent = Join(xsLines, vbNewLine)

'# La suppression des lignes fusionnée a généré des lignes vierges.
Do While InStr(sFileContent, vbNewLine & vbNewLine)
'# On les supprime donc
sFileContent = Replace(sFileContent, vbNewLine & vbNewLine, vbNewLine)
Loop

Open "C:\Documents and Settings\nljecou\Desktop\Combined.csv" For Output As #1
Print #1, sFileContent;
Close #1

End Sub

PROBLEME:

pour la ligne de code: xsFields1(2) = Val(xsFields1(2)) + Val(xsFields2(2))
VBA m'affiche: Subscript Out of range

Apréès avoir essayé diverses solutions...je ne trouve toujours pas

Quel au'un aurait'il une solution?

Merci beaucoup et bonne soirée


JDC

1 réponse

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
78
Salut

Ce n'est pas du code VB.Net ça.
Alors, quel langage utilises-tu ?

La prochaine fois que tu colles du code, utilise la coloration syntaxique (3è icone à droite) qui respectera les indentations = plus facile à lire|comprendre. Merci.

Ton erreur vient du fait que l'une de tes variables indexées ne comporte pas autant de membre que demandé : xsFields1 et|ou xsFields2 n'a pas d'élément d'indice 2.

Rappel : les tableaux commencent à l'index 0 : 2 est donc le 3ème élément.
Mieux vaudrait connaitre le contenu de tes lignes sources, xsLines(i) et xsLines(k), pour savoir si c'est normal.

Que valent i et k ? Est-ce que ton programme fonctionne pour quelques dizaines de lignes puis l'erreur survient-elle en plein milieu = info importante pour savoir s'il s'agit d'une erreur de programmation (mauvais choix de type de variable) ou s'il s'agit d'une particularité de tes données.

A mon avis, cela vient de la première ligne du second fichier que tu 'ajoute' au premier : il est possible que cette première ligne n'aie pas le même format que les données ou soit vide.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)