importer données d'un fichier csv vers un fichier Excel

Poca

XLDnaute Nouveau
Bonjour à tous,


J'ai besoin d'aide pour écrire une macro qui me permettrai d'importer certaines colonnes d'un fichier csv ( toujours même format mais le nom change) vers un fichier Excel sous un format tableau Excel.
Je m'explique mon fichier source est un fichier csv extrait d'une appli chauqe fin de mois qui contient plus colonnes avec une entête spécifique. J'aimerai pouvoir importer les données de certaines colonnes ( 1 , 2 ,4, 9, 12,22,27,32,37) sur le fichier Excel dont les entêtes seront différentes de celles du fichier source.

J'ai trouvé cette macro qui me permet de récupérer toutes les données du fichier mais je voudrais l'adapter à ce qui m'est demandé c-a-d un tableau Excel capable de récupérer les colonnes que j'ai mentionné au dessus et qui va sauté une ligne pour calculer un Total sur la colonne 9 à chaque fois que la donnée de la colonne 1 change.
Je ne sais pas du tout si c'est clair ce que je raconte :) je m'en excuse mais mes connaissances en VBA sont très très limités j'ai vraiment besoin de votre aide: SOS terrienne en détresse :(

Je vous joins la macro + les fichiers csv et Excel pour que ce soit plus clair :S

merci infiniment d'avance pour votre aide.

Macro:
Option Explicit

Sub Csv()
Dim Fichier As Variant
ChDir ThisWorkbook.Path
Fichier = Application.GetOpenFilename("Fichier CSV (*.csv), *.csv")
If Fichier <> False Then
LireCSV Fichier
End If
End Sub

Private Sub LireCSV(ByVal NomFichier As String)
Dim Chaine As String
Dim Ar() As String
Dim i As Long
Dim iRow As Long, iCol As Long
Dim NumFichier As Integer
Dim Separateur As String * 1

Separateur = ";"
Cells.Clear
Application.ScreenUpdating = False
NumFichier = FreeFile

iRow = 0
Open NomFichier For Input As #NumFichier
Do While Not EOF(NumFichier)
iCol = 1
iRow = iRow + 1
Line Input #NumFichier, Chaine
Ar = Split(Chaine, Separateur)
For i = LBound(Ar) To UBound(Ar)
Cells(iRow, iCol) = Ar(i)
iCol = iCol + 1
Next i

Loop
Close #NumFichier
Application.ScreenUpdating = True

End Sub
 

Pièces jointes

  • Fichier_attendu.xlsx
    9.1 KB · Affichages: 56
  • Fichiersoure.xlsx
    11.4 KB · Affichages: 43
  • Fichiersoure.xlsx
    11.4 KB · Affichages: 54
  • Fichiersoure.xlsx
    11.4 KB · Affichages: 54

Dranreb

XLDnaute Barbatruc
Re : importer données d'un fichier csv vers un fichier Excel

Bonjour.

Voici déjà de quoi récupérer les colonnes souhaitées :
VB:
Sub Csv()
Dim Fichier As Variant, Chaine As String, T(), TSpl() As String, L As Long, C As Long, Z As String
ChDrive ThisWorkbook.Path: ChDir ThisWorkbook.Path
Fichier = Application.GetOpenFilename("Fichier CSV (*.csv), *.csv")
If VarType(Fichier) <> vbString Then Exit Sub
ReDim T(1 To 5000, 1 To 9)
Open Fichier For Input As #1
Do While Not EOF(1)
   Line Input #1, Chaine
   TSpl = Split(Chaine, ";")
   L = L + 1
   For C = 1 To 9
      Z = TSpl(Choose(C, 1, 2, 4, 9, 12, 22, 27, 32, 37) - 1)
      If IsNumeric(Z) Then T(L, C) = CDbl(Z) Else T(L, C) = Z
      Next C: Loop
Close #1
ActiveSheet.Rows("1:5000").Delete
ActiveSheet.Cells(1, 1).Resize(L, 9).Value2 = T
End Sub
À tester.
Je regarde pour y ajouter des totaux.
 

mutzik

XLDnaute Barbatruc
Re : importer données d'un fichier csv vers un fichier Excel

salut les gens

pourquoi tu n'importe pas tout ton fichier et tu supprimes ensuite les colonnes qui te servent pas avec
Range("C:C,H:M,S:W").Delete Shift:=xlToLeft (c'est un exemple)
 
Dernière édition:

Poca

XLDnaute Nouveau
Re : importer données d'un fichier csv vers un fichier Excel

Merci beaucoup Dranreb et bertrand pour vos réponses.C'est vraiment gentil d'avair pris le temps d'y réfléchir.

@Dranreb ton code marche très bien merci beaucoup à toi. J'attend du coup ton retour sur les totaux. Aussi saurais-tu comment je fais pour changer les entêtes de colonne pour qu'elles soient comme celle que j'ai indique sur le Fichier attendu?

Cordialement,
 

Dranreb

XLDnaute Barbatruc
Re : importer données d'un fichier csv vers un fichier Excel

Bon ben sans pouvoir vérifier si les titres, à mettre à la main une bonne fois pour toutes, son ceux des bonnes colonnes :
VB:
Sub Csv()
Dim Fichier As Variant, Chaine As String, T(), LDéb As Long, TSpl() As String, L As Long, C As Long, Z As String
ReDim T(1 To 5000, 1 To 9)
LDéb = 2
ChDrive ThisWorkbook.Path: ChDir ThisWorkbook.Path
Fichier = Application.GetOpenFilename("Fichier CSV (*.csv), *.csv")
If VarType(Fichier) <> vbString Then Exit Sub
Open Fichier For Input As #1
Line Input #1, Chaine ' ignore la ligne de titres du csv
Do While Not EOF(1)
   Line Input #1, Chaine
   TSpl = Split(Chaine, ";")
   If L > 0 Then If TSpl(0) <> T(L, 1) Or TSpl(1) <> T(L, 2) Then GoSub Total
   L = L + 1
   For C = 1 To 9
      Z = TSpl(Choose(C, 1, 2, 4, 9, 12, 22, 27, 32, 37) - 1)
      If IsNumeric(Z) Then T(L, C) = CDbl(Z) Else T(L, C) = Z
      Next C: Loop
GoSub Total
Close #1
Feuil1.Rows("2:5001").Delete
Feuil1.Cells(2, 1).Resize(L, 9).Value2 = T
Dim A As Range, Cel As Range
For Each A In Feuil1.Columns("I").SpecialCells(xlCellTypeFormulas, 1)
   For Each Cel In A
      Cel.FormulaR1C1 = "=SUBTOTAL(9,R" & Cel.Value & "C:R[-1]C)"
      Cel.Offset(, -1).HorizontalAlignment = xlRight: Next Cel, A
Exit Sub
Total:
L = L + 1: T(L, 8) = "Total": T(L, 9) = "=" & LDéb
If EOF(1) Then Return
L = L + 1: LDéb = L + 2: Return
End Sub
 

Poca

XLDnaute Nouveau
Re : importer données d'un fichier csv vers un fichier Excel

Merci infiniment ton code marche parfaitement... J'ai rien à ajouter !! Chapeau

Si tu as encore un petit moment, je suis curieuse de savoir comment tu poses la condition sur le total
If L > 0 Then If TSpl(0) <> T(L, 1) Or TSpl(1) <> T(L, 2) Then GoSub Total

Comment ferai-tu si par exemple tu asdeux conditions un changement sur la colonne 1 et un autre sur la colonne 2: dans cet exemple ça serait si c'est un fonds diférrents faire le total et aussi si c'est un code isin différent.

Et encore une fois , vraiment merci pour ton aide.
 

Dranreb

XLDnaute Barbatruc
Re : importer données d'un fichier csv vers un fichier Excel

C'est le cas, là : si un des deux change on met un total.
Il y a une incohérence dans mon code.
Il faut mettre soit, si ça marche bien, simplement :
VB:
Dim Cel As Range
For Each Cel In Feuil1.Columns("I").SpecialCells(xlCellTypeFormulas, 1)
   Cel.FormulaR1C1 = "=SUBTOTAL(9,R" & Cel.Value & "C:R[-1]C)"
   Cel.Offset(, -1).HorizontalAlignment = xlRight: Next Cel
soit alors pour la bonne forme :
VB:
Dim A As Range, Cel As Range
For Each A In Feuil1.Columns("I").SpecialCells(xlCellTypeFormulas, 1).Areas
   For Each Cel In A
      Cel.FormulaR1C1 = "=SUBTOTAL(9,R" & Cel.Value & "C:R[-1]C)"
      Cel.Offset(, -1).HorizontalAlignment = xlRight: Next Cel, A
J'avais oublié le .Areas
 

Poca

XLDnaute Nouveau
Re : importer données d'un fichier csv vers un fichier Excel

Oui effectivement autant pour moi ,donc la condition est sur la première colonne et la seconde c'est bien ça ?

Ok j'ai changé le code mais ça marchait déjà très bien ;)
 

Poca

XLDnaute Nouveau
Re : importer données d'un fichier csv vers un fichier Excel

Bonjour Dranreb,

J'ai encore besoin de tes lumières pour quelques choses d'encore plus compliqués sur le même principe d'import de données csv car je suis vraiment bloquée.
Je dois cette fois ci récupérer dans certaines colonnes du fichier attendu ( nouveau modèle ci dessous) les données du fichiersource avec des conditions.

Fichier attendu
Portefeuille Date Calcul Actif de reference Taux moyen Provision nature de frais 1 Provision nature de frais 2
X
X
X
Total somme provision somme provision

les colonnes provisions sont renseignées en fonction des natures de frais( colonne K dans le fichiersource) donc dans la colonne 6 il n'y a que les prov qui concernent la nature de frais 1 et ainsi de suite.
Peux-tu stp me guider sur le code qui m'aiderait à récuperer ça ?

Merci beaucoup d'avance.
 

Dranreb

XLDnaute Barbatruc
Re : importer données d'un fichier csv vers un fichier Excel

Bonsoir.

Pourriez vous joindre un classeur modèle du résultat souhaité en indiquant quelque part pour chacune de ses colonnes la colonne correspondante du csv. Ne pourriez vous y écrire une procédure qui lit le csv dans un tableau de Variant, et le vide provisoirement dans une feuille ? Ça me permettrait de tester ma programmation sans avoir le csv en ma possession. Il se pourrait que l'écriture de la procédure soit facilitée par quelques modules de service que je vous fournirai, surtout s'il faut faire l'inventaire des libellés de natures de frais existant dans le csv pour les mentionner dans une ligne de titres, et si vous ne voyez pas d’inconvénient à ce que tout soit reclassé.
Cochez aussi la référence Microsoft Scripting Runtime: je subodore qu'on va avoir besoin d'une variable déclarée As Dictionary.
 
Dernière édition:

Poca

XLDnaute Nouveau
Re : importer données d'un fichier csv vers un fichier Excel

Bonjour Dranreb,

Merci pour votre réponse. Je ne suis pas sure d'avoir bien tout compris par rapport à votre proposition. En tout cas je vais joindre de nouveau le fichier source modifié avec toutes les valeurs possibles des natures de frais. Sachant que le fichier ne va pas contenir forcément toutes les natures de frais c'est juste pour info car les colonnes du fichier attendu elles seront fixes et représentent toutes le natures de frais possibles.

Si vous ouvrez le fichier attendu vous verrez qu'il y a deux onglet pour le premier j'ai utilisé le code que vous aviez suggéré plus haut dans cett discussion et ça marche très bien.
j'ai bien plus de mal avec le second onglet :S

Pourriez-vous m'expliquer votre proposition d'avantage ? Mais j'ai complétement confiance , juste pour mieux comprendre et pouvoir le réproduire si jamais je suis face de nouveau à ce genre de contraintes.

Merci à vous pour votre aide.
 

Pièces jointes

  • Fichiersoure.xlsx
    12.8 KB · Affichages: 33
  • Fichier attendu.xls
    62 KB · Affichages: 46
  • Fichiersoure.xlsx
    12.8 KB · Affichages: 42
  • Fichiersoure.xlsx
    12.8 KB · Affichages: 48

Dranreb

XLDnaute Barbatruc
Re : importer données d'un fichier csv vers un fichier Excel

Bonjour.

À part les "Dates_VNI" qui semblent correspondre à la colonne "Date", je ne comprends rien à la relation entre le Fichiersource.xls sensé représenter le csv et la feuille AHFG souhaitée, désolé.
 

Poca

XLDnaute Nouveau
Re : importer données d'un fichier csv vers un fichier Excel

Bonjour,

Excusez moi je n'ai pas réellement détaillé les liens. Et effectivement, le fichier source est bien en CSV juste par souci de rapidité à vous répondre je l'ai copié dans un fichier Excel :S

Alors dans l'onglet AHFG, la colonne A correspond à la colonne B du Fichier source. La colonne B(Basis) est fixe pas de dépendance avec le fichier source ; La date vous l'avez bien remarqué c'est la colonne D du fichier source ; l'onglet D Nav correspond à la colonne AD dans le fichier source et le rate c'est la colonne M du fichier source. Pour la partie la plus importante les colonnes suivantes ; Provision gestion globale par exemple est renseignée quand dans le fichier source colonne nature de frais (K) on a frais de gestion globale alors on va chercher la donnée dans la colonne S du fichier source et ainsi de suite donc quand on a la nature des frais "frais honoraire CAC, la colonne Provision CAC dans le fichier attendu sera renseignée par la donnée (colonne S)

J'espère que c'est plus claire :S Préfériez-vous que je remette plus de détail dans les fichiers ?

Merci infiniment pour votre dispo et votre temps
 

Discussions similaires

Statistiques des forums

Discussions
312 205
Messages
2 086 199
Membres
103 156
dernier inscrit
Ludo94130