Problème import fichier CSV

grhum29

XLDnaute Junior
Bonjour,

Je fais de nouveau appel au forum car je suis confronté à un problème que je parviens pas à résoudre.

J'ai fait une macro qui importe des fichiers CSV dans une feuille (Je précise que c'est une macro que j'ai déjà utilisé dans d'autres projets et qui fonctionnait bien)

Mais dans le cas du fichier CSV que j'essaye d'intégrer aujourd'hui, j'ai un problème d'affichage des données. En effet, j'ai des données qui devraient être sur la même ligne que les autres données sauf qu'elles se retrouvent à la ligne (exemple : les données qui se retrouvent dans la cellule A3 devraient être en réalité à la suite du texte présent en cellule "AA2).

Ce fichier CSV que je trouve un peu bizarre dans sa conception est un fichier issu d'un soft. Je ne peux donc pas y toucher avec intégration.

Je vous mets les fichiers en pièces jointes (fichier XSLM et fichier CSV). Pour infos, j'ai fait un user form dans Visual Basic pour appeler le fichier.

Pouvez-vous m'aider s'il vous plait?

Merci,

Bonne soirée à tous
 

Pièces jointes

  • Test.zip
    41.4 KB · Affichages: 36

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour GRhum,R@chid,
Si le fichier est "un peu spécifique" autant créer une macro "un peu spécifique". Ca évite les ennuis.
Avec simplement cette macro issue de l'enregistreur :
VB:
Sub OuvrirCSV()
    NomFichier = "C:\Users\PC_PAPA\Desktop\Test.csv"
   
    Workbooks.OpenText Filename:=NomFichier, Origin:= _
        65001, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=True, Comma:=False, _
        Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array( _
        3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10 _
        , 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), _
        Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1), Array( _
        23, 1), Array(24, 1), Array(25, 1)), TrailingMinusNumbers:=True
End Sub
 

Pièces jointes

  • OuvrirFichierCSV.xlsm
    16.2 KB · Affichages: 6

grhum29

XLDnaute Junior
Bonjour sylvanu etR@chid,

Tout d'abord, merci pour vos réponses.

Oui j'ai oublié de le préciser dans mon 1er post, j'ai essayé de passer par l'enregistreur et effectivement l'import fonctionne très bien en passant par là. Par contre, @sylvanu, sur Excel 2016, l'enregistreur a créé du code PowerQuery qui est différent de ton code (cf le code généré ci-dessous). Est-ce que cela est lié à la version d'Excel?


VB:
'
    ActiveWorkbook.Queries.Add Name:="Test", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Csv.Document(File.Contents(""C:\Users\grhum\Desktop\Exempl_QHSE\Test.csv""),[Delimiter="";"", Columns=25, Encoding=65001, QuoteStyle=QuoteStyle.Csv])," & Chr(13) & "" & Chr(10) & "    #""En-têtes promus"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & "    #""Type modifié"" = Table.TransformColumnTypes(#""En-têtes promus"",{{""Nom"", type text}, {""Numéro de NCR" & _
        """, Int64.Type}, {""Statut de la NCR"", type text}, {""Niveau de Gravité"", type text}, {""Type de NCR"", type text}, {""Fournisseur"", type text}, {""Projet"", type text}, {""Causes de la NCR"", type text}, {""Modifié le"", type datetime}, {""Etape Workflow"", type text}, {""Créé le"", type datetime}, {""Coût estimé (k euro)"", type number}, {""Coût estimé en Analy" & _
        "se (k euro)"", type number}, {""Coût estimé en Décision (k euro)"", type number}, {""Coût réel (k euro)"", type number}, {""Date de déclaration de la NCR"", type date}, {""Date d'analyse"", type date}, {""Date de la décision"", type date}, {""Date de vérification qualité"", type date}, {""Date d'exécution"", type date}, {""Date de remédiation"", type date}, {""Date " & _
        "de clôture de la NCR"", type date}, {""Type d'actions (décision NCR)"", type text}, {""Commentaires de la décision"", type text}, {""Actions complementaires"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Type modifié"""
    ActiveWorkbook.Worksheets.Add
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Test;Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [Test]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "Test"
        .Refresh BackgroundQuery:=False
    End With
End Sub

Mais j'ai essayé ensuite d'adapter ce code à mes besoins. C'est à dire de remplacer le chemin et le nom du fichier par un variable qui me permet d'aller chercher ce fichier ou un autre fichier nommé différemment à l'endroit que je souhaite.

Mais c'est à ce niveau que je me suis retrouvé bloqué car je ne parviens pas à faire ce que je souhaite.

Pouvez-vous m'éclairer?

Merci de votre retour.

Cordialement,
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Si on regarde le csv avec Notepad, on voit que "Des : Long term : repair. robable) Ption OS"" est sur une nouvelle ligne et pas séparé du terme précédent par point virgule.
Donc à la lecture du csv, "Des : Long term : repair. robable) Ption OS"" est sur une nouvelle ligne ( A3 ) et n'a aucune raison d'être en ligne 2;
Sinon il faudrait en ligne 2 du csv :
Code:
....20/02/2020;20/02/2020;05/03/2020;Reprise;"Stru cal / mesh : Scrap = define;Des : Long term : repair. robable) Ption OS"
Donc l'import du csv est correct vis à vis du csv fourni.
Vous ne pourrez pas modifier l'import pour que le résultat soit celui que vous voulez.
Il vous faut reprendre les valeurs dans le tableau XL.
 

grhum29

XLDnaute Junior
Le fichier CSV étant malheureusement ainsi fait, je ne peux pas le reprendre avant traitement car mon but est d'automatiser l'intégration de ce fichier CSV dans un fichier Excel pour pouvoir ensuite rajouter des colonnes et y faire des calculs.

L'import via Power Query (Excel 2016) fonctionne et intègre le fichier normalement.

Pouvez-vous m'aider à rajouter des variables dans le code Power Query généré par l'enregistreur de façon à ce que je puisse automatiser cette intégration.

Voici le code généré par l'enregistreur :

VB:
Sub Macro5()
'
' Macro5 Macro
'

'
    Application.CutCopyMode = False
    Application.CutCopyMode = False
    ActiveWorkbook.Queries.Add Name:="Test (2)", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Csv.Document(File.Contents(""C:\Users\jlouedoc\Desktop\Exempl_QHSE\Test.csv""),[Delimiter="";"", Columns=25, Encoding=65001, QuoteStyle=QuoteStyle.Csv])," & Chr(13) & "" & Chr(10) & "    #""En-têtes promus"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & "    #""Type modifié"" = Table.TransformColumnTypes(#""En-têtes promus"",{{""Nom"", type text}, {""Numéro de NCR" & _
        """, Int64.Type}, {""Statut de la NCR"", type text}, {""Niveau de Gravité"", type text}, {""Type de NCR"", type text}, {""Fournisseur"", type text}, {""Projet"", type text}, {""Causes de la NCR"", type text}, {""Modifié le"", type datetime}, {""Etape Workflow"", type text}, {""Créé le"", type datetime}, {""Coût estimé (k euro)"", type number}, {""Coût estimé en Analy" & _
        "se (k euro)"", type number}, {""Coût estimé en Décision (k euro)"", type number}, {""Coût réel (k euro)"", type number}, {""Date de déclaration de la NCR"", type date}, {""Date d'analyse"", type date}, {""Date de la décision"", type date}, {""Date de vérification qualité"", type date}, {""Date d'exécution"", type date}, {""Date de remédiation"", type date}, {""Date " & _
        "de clôture de la NCR"", type date}, {""Type d'actions (décision NCR)"", type text}, {""Commentaires de la décision"", type text}, {""Actions complementaires"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Type modifié"""
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""Test (2)"";Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [Test (2)]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "Test__2"
        .Refresh BackgroundQuery:=False
    End With
End Sub

Merci de votre aide.
 

R@chid

XLDnaute Barbatruc
Bonjour @ tous,
VB:
let
    Source = Csv.Document(File.Contents("Chemin d'accès complet"),[Delimiter=";", Columns=25, Encoding=65001, QuoteStyle=QuoteStyle.Csv]),
    #"En-têtes promus" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Autres colonnes supprimées" = Table.SelectColumns(#"En-têtes promus",{"Date de clôture de la NCR", "Type d'actions (décision NCR)", "Commentaires de la décision", "Actions complementaires"}),
    #"Type modifié" = Table.TransformColumnTypes(#"Autres colonnes supprimées",{{"Date de clôture de la NCR", type date}, {"Type d'actions (décision NCR)", type text}, {"Commentaires de la décision", type text}, {"Actions complementaires", type text}})
in
    #"Type modifié"

C'est ça le code du PQ.
Il faut aller dans l'onglet "Données" / Afficher les requêtes, puis Bouton droit sur la requête / Modifier.
Une l'éditeur Power Query est ouvert, tu dois sélectionner Source et parcourir ton fichier CSV.
En fin, Fermer et Charger.


Cordialement
 

Pièces jointes

  • grhum29_PowerQuery.xlsm
    37.5 KB · Affichages: 4

D.D.

XLDnaute Impliqué
Bonjour,

Pour ma part je n'utilise jamais powerquery mais uniquement l'ancienne méthode d'import des fichiers. je la trouve plus compréhensible et compatible avec du VBA.
Cependant, elle n'est plus vraiment accessible en natif dans les nouveaux Excel.
il faut la mettre manuellement
1605187174888.png

1605187206044.png

Et la, on peut faire ce qu'on veut et faire ajouter des formules sur les colonnes adjacentes automatiquement.
 

Statistiques des forums

Discussions
312 104
Messages
2 085 349
Membres
102 869
dernier inscrit
radyreth