Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

Poca

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

J'ai modifié les fichiers pour que ce soit plus parlant.
A noter qu'il ya plus de colonnes dans mon fichier source réel juste pour simplifié j'ai gardé que celle q'uon utilise pour l'onglet AHFG.
 

Pièces jointes

  • Fichierfinal.xls
    63.5 KB · Affichages: 37
  • Reportsource.xlsx
    10.4 KB · Affichages: 27

Dranreb

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

Il s'agit en gros juste de reproduire le fichier source dans l'ordre où il est sauf qu'il faut ventiler la colonne F dans une des colonnes qui lui est destinée. Vous pouvez y arriver entre autres avec un Select Case. En supposant que tout est dans des tableaux :
VB:
Select Case Te(Le, 6)
   Case "Frais de gestion globale": C = 6
   Case "Frais honoraires CAC": C = 7
   Case "Frais valorisateur": C = 8
   etc.
   End Select
Ts(Ls, C) = Te(Le, 7)
 

Poca

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

Non malheureusement ce n'est pas ci simple que ça. J'ai juste simplifié le tableau source mais en réalité c'est le même que j'ai envoyé au tout début de ce post. Il contient 37 colonnes et je n'ai besoin que de certaines d'entre elles qui ne se suivent pas forcément.

Comment je peux mettre en place le code que vous suggérez dans le code qui me permet d'importer les données du csv ?

Private Sub CommandButton1_Click()
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 27, 1 To 10)
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, ";")
L = L + 1
For C = 1 To 5
'Select Case T(L, 7)
Case "Frais de gestion globale": C = 6
Case "Frais honoraires CAC": C = 7
Case "Frais valorisateur": C = 8
'End Select
Z = TSpl(Choose(C, 2, 4, 32, 13, 21) - 1)
If IsNumeric(Z) Then T(L, C) = CDbl(Z) Else T(L, C) = Z
Next C: Loop
Close #1
Feuil1.Range("A624").ClearContents
Feuil1.Cells(6, 1).Resize(L, 4).Value2 = T
End Sub
 

Dranreb

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

Pas dans le For C = 1 To 5 en tout cas, puisque celui ci ne sert qu'à transférer des colonnes fixes.
Mais en séparant Next C: Loop en deux instructions, ce serait pas mal de mettre ce Select Case derrière la Next C, avant la Loop. Il ne devrait pas y avoir de problème ensuite pour affecter à T(L, C) un poste particulier de TSpl, converti au besoin en nombre par la fonction CDbl.

P.S: pour me permettre de relire plus aisément des extraits de code, veuillez les encadrer de balises :
VB:
Le Code[/ highlight] 
Mais sans l'espace que j'ai mis entre "/" et "highlight" pour qu'il ne soit pas interprété comme tel ici, afin de vous montrer les balises.
 
Dernière édition:

Staple1600

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

Bonsoir à tous


Je plussoie
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)
C'est beaucoup plus simple, non ?
Voir exemple ci-dessous
Code:
Sub OuvrirCSV()
Dim ficCSV As Workbook
Set ficCSV = Workbooks.Open(Filename:="C:\Temp\FichierTEST.csv", local:=True)
ficCSV.Sheets(1).Copy
ficCSV.Close False
Range("B:B,E:E,G:G").Delete Shift:=xlToLeft
End Sub
 

Poca

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

Bonjour à tous,

Encore une fois merci pour votre aide et votre temps!!
Je me suis creusée la tête toute la soirée sur ce code; J'arrive à avoir quelque chose de cohérent mais ce n'est pas encore ça.
@JM : en fait je ne récupère pas toutes les colonnes telquel pour la colonne 5 ( equivalente à la colonne G du reportSource ) en fait elle n'est renseignée que si dans la colonne F j'ai Frais de Gestion Globale et la colonne 6 ( éqivalente à la colonn G égalemen,t du report) n'est renseignée que si dans la colonne F j'ai Frais honoraire CAC etc...

donc il ya une condition à l'import
J'ai ce code ci-dessous qi me permet de récupérer les données dans les bonnes colonnes sauf qu'il me met automatiquement toutes les données de la colonne G dans la colonne 5 du fichier final
je vous joins un exemple pour voir et le code si vous voyez pourquoi il fait ça svp corrigez moi
VB:
Private Sub CommandButton1_Click()
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 27, 1 To 10)
 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, ";")
    L = L + 1
    For C = 1 To 5
       Z = TSpl(Choose(C, 2, 4, 32, 13, 21) - 1)
       If IsNumeric(Z) Then T(L, C) = CDbl(Z) Else T(L, C) = Z
       Next C: Select Case TSpl(8)
    Case "Frais de gestion globale                         ": T(L, 5) = TSpl(18)
    Case "Frais honoraires CAC                              ": T(L, 6) = TSpl(18)
    Case "Frais valorisateur                                ": T(L, 7) = TSpl(18)
    End Select
    Loop
 Close #1
 Feuil2.Range("A6:L26").ClearContents
 Feuil2.Cells(6, 1).Resize(L, 12).Value2 = T
 End Sub
 

Pièces jointes

  • testreport.xlsm
    32.1 KB · Affichages: 24

Dranreb

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

Bonjour.
Je ne vous suis pas.
La colonne G, dans un csv ? Par analogie avec Excel, la 7ième donc, soit TSpl(6) ? Il n'est pas récupéré dans votre code !
Dans la colonne 5 (E) vous récupérez TSpl(20) et non TSpl(18) comme dans une des 3 suivantes.
 

Poca

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

Bonjour à tous,

J'ai réussi à trouver une solution à mon problème, je met le code pour ceux que ça intéresse. C'est un peu laborieux mais ça marche plutôt bien

VB:
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 27, 1 To 10)
 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, ";")
    L = L + 1
       T(L, 1) = TSpl(1)
       T(L, 2) = "FRAIS DE GEST.A"
       T(L, 3) = TSpl(3)
        If IsNumeric(TSpl(31)) Then T(L, 4) = CDbl(TSpl(31)) Else T(L, 4) = TSpl(31)
        If IsNumeric(TSpl(12)) Then T(L, 5) = CDbl(TSpl(12)) Else T(L, 5) = TSpl(12)
       Select Case TSpl(8)
    Case "Frais de gestion globale                          ": If IsNumeric(TSpl(18)) Then T(L, 6) = CDbl(TSpl(18)) Else T(L, 6) = TSpl(18)
    Case "Frais dépositaire                                 ": If IsNumeric(TSpl(18)) Then T(L, 7) = CDbl(TSpl(18)) Else T(L, 7) = TSpl(18)
    Case "Frais valorisateur                                ": If IsNumeric(TSpl(18)) Then T(L, 8) = CDbl(TSpl(18)) Else T(L, 8) = TSpl(18)
    End Select
       Loop
       
 Close #1
 Feuil2.Range("A6:L26").ClearContents
 Feuil2.Cells(6, 1).Resize(L, 10).Value2 = T
 End Sub

@Dranreb merci beaucoup pour ton aide. Malgré le fait que je n'ai pas réellement du retranscrire mon problème comme il faut c'est grâce à ton code initial dont je me suis inspirée que j'ai réussi à trouver une solution.

Très belle fin de journée à tous.
 

Discussions similaires

Réponses
7
Affichages
591
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…