Problème d'import csv

Kobal

XLDnaute Junior
Bonjour à tous !
Comme d'habitude, j'ai un soucis.
Cette fois, j'ai un fichier csv, créé automatiquement par un logiciel, et j'aimerai l'importer par une macro dans un feuillet excel, et faire la mise en forme du tableau obtenu.
Avec le logiciel, je peux aussi obtenir un fichier txt, contenant ces mêmes informations. La macro fonctionne parfaitement avec le txt, mais le fichier csv pose problème.

Voici la partie du code chargée d'importer les lignes des fichiers, et de les ranger en colonnes.
Code:
'Ouverture et lecture du fichier à importer
Open Fichier For Input As #1
While Not EOF(1)
    Line Input #1, a
    'Copie des lignes dans excel
    ActiveSheet.Cells(NumRow + i, NumCol).Value = a
    i = i + 1
Wend
Close #1

'Conversion des données délimitées par une virgule
Set Plage = Range(Cells(NumRow, NumCol), Cells(NumRow + i, NumCol))
Plage.TextToColumns DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Comma:=True
Lorsque j'applique cela au csv, j'obtiens que la première ligne du document. En enlevant le TextToColumns, tout le document est copié dans une seule cellule .

La principale différence que je vois entre le csv et le txt est que le csv contient une ligne "sautée" au début, et trois à la fin. Les données (séparateurs, guillemets,...) sont identiques ensuite.

Quelqu'un a une idée pour m'aider?
Merci d'avance...
 

Kobal

XLDnaute Junior
Re : Problème d'import csv

Bonjour Renauder,
En effet, il semble plus facile de travailler avec le txt, mais l'utilisateur final se fait toujours un malin plaisir de prendre le mauvais fichier, donc j'aimerai trouver une solution pour le csv.
Mais si ça complique vraiment trop, je limiterai la macro aux fichiers txt, comme ça, le problème n'existera plus !
 

kiki29

XLDnaute Barbatruc
Re : Problème d'import csv

Jour Bon, Sans doute à adapter et améliorer
Code:
Option Explicit
 
Sub Tst()
Dim Fichier As Variant
    ChDir ThisWorkbook.Path
    Fichier = Application.GetOpenFilename("Fichier CSV (*.csv), *.csv")
    If Fichier <> False Then Lire Fichier
End Sub
 
Private Sub Lire(ByVal sNomFichier 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
Const Separateur  As String * 1 = ";"
 
    Cells.Clear
    Application.ScreenUpdating = False
     
    Close
    NumFichier = FreeFile
 
    iRow = 0
    Open sNomFichier 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)
                If IsNumeric(Ar(i)) Then
                    Cells(iRow, iCol) = CDec(Ar(i))
                Else
                    Cells(iRow, iCol) = Ar(i)
                End If
                iCol = iCol + 1
            Next
        Loop
    Close #NumFichier
     
    Application.ScreenUpdating = True
End Sub
 

Kobal

XLDnaute Junior
Re : Problème d'import csv

Bonjour kiki29,
Merci pour ce code, je l'avais déjà vu en cherchant sur le forum avant, mais il y a un problème:
il me sépare bien chaque élément et les mets dans les cellules, mais le tout sur la même ligne.
(et j'obtiens une erreur car j'atteins la dernière cellule de la ligne du coup)
Je suppose qu'excel, en lisant le csv, n'y voit qu'une seule ligne.

Je vous joins un exemple de mon fichier csv problématique.
 

Pièces jointes

  • export test.zip
    445 bytes · Affichages: 31
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Problème d'import csv

Bonjour à tous.


Dans ce cas, Il y a un test à faire.
Kobal as tu essayé de renommer ton fichier CSV en TXT puis de l'ouvrir avec l'importation texte?
En enregistrant le code, tu devrais pouvoir y arriver.
 

Kobal

XLDnaute Junior
Re : Problème d'import csv

Bonjour MJ13,
J'avais déjà essayé ça, excel importe une ligne vide (visible car la mise en forme appliquée ensuite ajoute des bordures sur une ligne)
En lisant le fichier txt obtenu avec le bloc note, là où on est censé retrouver un retour chariot, on obtient un rectangle, comme pour des caractères inconnus, le tout sur une même ligne.
(par contre, sous notepad ++, il lit bien le fichier, avec les lignes comme il faut)

Une méthode pour transformer ce retour chariot exotique en un retour chariot plus conventionnel?
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : Problème d'import csv

bonjour a tous

A tester (apres adaptation concernant le Chemin)

Code:
Sub import()
   Workbooks.Add
    With ActiveSheet.QueryTables.Add(Connection:="[COLOR=red][COLOR=black]TEXT;[/COLOR]F:\texcel[/COLOR]\export test.csv" _
        , Destination:=Range("A1"))
        .Name = "export test"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = xlWindows
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1)
        .Refresh BackgroundQuery:=False
    End With
End Sub
 

Kobal

XLDnaute Junior
Re : Problème d'import csv

Bonsoir Pierrejean et merci !
ça marche !
J'ai adapté à mon code, ça passe.
Mais encore un problème: le tableau s'insère en ajoutant autant de colonne qu'il faut, décalant ainsi toutes les données existant déjà sur ma fiche. (la fiche contient plusieurs tableau du même type)
Comment empêcher cet ajout de colonne?
Je n'ai jamais joué avec les query tables, je suppose qu'il s'agit d'un des paramètres à configurer...
Merci d'avance.
 

pierrejean

XLDnaute Barbatruc
Re : Problème d'import csv

Re

Normalement l'insertion doit se faire dans un nouveau fichier du fait de
Workbooks.Add
Si tu importes sur le fichier ou est la macro, alors je suppose qu'il faut jouer sur
Destination:=Range("A1")
en mettant par exemple
Destination:=Range("A65536").End(xlup).Offset(1,0)

Et tu sais, je me suis essentiellement servi de l'enregistreur de macro pour avoir ce code

teste et dis-moi
si ça ne gaze pas je pousserais plus loin
 

Kobal

XLDnaute Junior
Re : Problème d'import csv

En fait, pour la destination, j'utilise une Range sélectionnée préalablement par l'utilisateur, dans un userform.
Il sélectionne l'endroit où il veut mettre le tableau, et celui ci s'ajoute en ajoutant assez de ligne pour qu'il ait de la place, mais vu que les tableaux sont supposés rangés verticalement, l'insertion de colonne n'est pas utile.

Là, ta macro ressemble à ça:
Code:
Sub import(Fichier As String, CelTarg As Range)

    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & Fichier _
        , Destination:=CelTarg)
        .Name = "export test"
        .FieldNames = True
        .PreserveFormatting = True
        .RefreshStyle = xlInsertEntireRows
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1)
        .Refresh BackgroundQuery:=False
    End With
End Sub

J'ai filtré un peu les paramètres, mais je ne les ai pas tous parcouru encore...
Sur ce, bonne soirée :)
Et merci à tous pour votre aide, déjà.
 

Gil79

XLDnaute Nouveau
Re : Problème d'import csv

Bonsoir,
Je mets un bout de code que j'ai utilisé , à adapter

fic="c:\toto\toto.csv" ' exemple
Set wHST = Application.Workbooks.Open(fic) '*** Ouverture du fichier Fic
wHST.Activate
Set shHST = wHST.Sheets(1) ' 1ere feuille du classeur (feuille unique normalement)
' Formatage des colonnes
shHST.Columns("A:A").TextToColumns Destination:=shHST.Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=True

En esperant que cela convienne
 

Kobal

XLDnaute Junior
Re : Problème d'import csv

Bonjour Gil79,
Merci pour ce code, mais j'ai beau adapter, je ne trouve pas le moyen à partir de ça de copier les lignes du csv dans mon fichier excel déjà existant.
J'aimerai éviter le plus possible de créer un document pour chaque csv, car le but est justement de mettre plusieurs csv dans un même feuillet.
 

Kobal

XLDnaute Junior
Re : Problème d'import csv

Bonjour à tous,
Finalement, j'ai trouvé une solution.
Je suis bien obligé d'ouvrir le csv pour recopier les données. Mais ça marche, donc c'est le principal.

Voila le code:
Code:
Set Wbtarg = ActiveSheet 'classeur où je veux copier les données
Set Wbcsv = Application.Workbooks.Open(Fichier) 'Fichier est le nom du fichier csv

Wbcsv.Activate
PremiereLigne = Range("A1").End(xlDown).Row
DerniereLigne = Range("A65536").End(xlUp).Row
DerniereColonne = Range("IV2").End(xlToLeft).Column
i = DerniereLigne - PremiereLigne + 1 'cette variable me permet de connaitre le nombre de lignes copiées. Non utilisé dans ce bout de code.
Set Cible = Range("A1:" & Cells(DerniereLigne, DerniereColonne).Address)
Cible.Copy
Wbtarg.Activate
CelTarg.Offset(1, 0).PasteSpecial 'CelTarg est la zone où on veut copier les données.
'L'offset est pour un souci de présentation
Application.CutCopyMode = False
Wbcsv.Close

Merci à tous !
 

Escarlate

XLDnaute Nouveau
Re : Problème d'import csv

Bonjour...:(

Ne pigeant pas tout de vos propositions de codes.. je voulais simplement vous faire part de mon expérience en matière de csv.. (elle n'est pas très pointue...mais bon !)
En général, quand le fichier CSV est "propre" au sens qu'il ne contient pas des champs avec des codes RC/LF dans du texte, je trouve que le filtre standard d'importation fonctionne bien.
Par contre j'ai eu les pires soucis avec des fichiers "impropres" car le filtre ne dit rien et import tout en vrac dans un seule colonne quelque soit le séparateur indiqué. D'ailleurs la mise en colonne dans le wizzard ne se fait pas.
En nettoyant bien le fichier csv... jusqu'à présent je n'ai jamais eu de souci avec le filtre Excel standard.

Mais je continue à vous lire, car cela me cultive et me rappelle quelques "vieux" souvenirs.... !

Pour l'instant j'en suis à me creuser les méninges :rolleyes: pour me rappeler la syntaxe de base des pricipales fonctions VBA... J'ai trouvé un tutoriel pas mal.. ici !
J'aimerais bien trouver un tutoriel à intégrer dans l'aide (F1) de excel..
Quelqu'un connait ?
Merci
:)
 

Discussions similaires

Réponses
2
Affichages
286

Statistiques des forums

Discussions
312 548
Messages
2 089 494
Membres
104 186
dernier inscrit
SEven22