Autres Convertir un fichier CSV en XLSX avec un macro

Shadow81

XLDnaute Nouveau
Bonjour,
Je vous explique mon problème :
J'ai créé une macro permettant de faire appel à un fichier CSV et de le mettre dans un tableau.
Mon problème est que tous les fichiers qui me sont fournis sont au format CSV n'est donc pas exploitable directement j'aimerais donc pouvoir ajouter une macro permettant la conversion des fichiers automatiquement cependant impossible de trouver une solution sur le forum ou sur le web en général la seule piste que j'ai c'est :
Lien 1
Lien 2
Seulement les fichiers résultants sont bien au bon format, mais ne sont pas exploitables par rapport au délimitateur.
Je vous envoie l'Excel sur lequel je travaille et des fichiers CSV avec lequel je teste mon code.
Ce que j'aimerais faire ça serait convertir le fichier CSV en XLSX en forme via l'Excel crée avec les macros déjà existantes ou d'enregistrer une feuille/tableau de CSV à XLSX.

En vous remerciant par avance,
Cordialement,
Shadow81
 

Pièces jointes

  • Excel.zip
    29.1 KB · Affichages: 21

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Shadow81

Un exemple qui traite un fichier
VB:
Const sPath As String = "C:\Users\STAPLE\Downloads\Excel\"
Public NomX$
Sub Traitement()
Application.ScreenUpdating = False
Import_CSV
SaveAs_XLSX
End Sub
Private Sub Import_CSV()
Dim Fichier_CSV$
Fichier_CSV = "Extraction 040522 MASTER1.csv"
NomX = Split(Fichier_CSV, ".")(0)
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & sPath & Fichier_CSV, Destination:=Range("$A$1"))
        .Name = "Extraction 040522 MASTER1"
        .FieldNames = True
        .PreserveFormatting = True
        .RefreshStyle = xlInsertDeleteCells
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileSemicolonDelimiter = True
        .TextFileDecimalSeparator = "."
        .Refresh BackgroundQuery:=False
    End With
End Sub
Private Sub SaveAs_XLSX()
ActiveSheet.Copy
ActiveWorkbook.SaveAs sPath & NomX & " .xlsx", 51
ActiveWorkbook.Close False
End Sub
Pour tester, adapter au préalable le chemin du dossier
(cf la constante sPath en début de code)

NB: Pour la suite, on peut envisager sur cette base, une boucle qui traite les N fichiers CSV contenus dans un dossier.
 

Shadow81

XLDnaute Nouveau
Merci Staple1600 pour t'as rapidité.
J'ai testé le code avec mes chemins, mais soit j'obtiens des erreurs au compilage du code.
Ou la mise en page est cassée.
Donc, je me demandais est-ce que c'est possible soit d'enregistrer un tableau qu'on importe d'un fichier CSV en XLSX ou d'enregistrer la feuille du classeur pour X fichier ?
 

Shadow81

XLDnaute Nouveau
J'ai fait une tambouille et ça marche, voici mon code pour peut-être aider d'autres personnes :

VB:
Sub ConvertCSVToXlsx()
    Dim myfile As String
    Dim oldfname As String, newfname As String
    Dim workfile
    Dim folderName As String
    
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    
'   Capture name of current file
    myfile = ActiveWorkbook.Name
    
'   Set folder name to work through
    folderName = "C:\Users\Shadow81\Documents\Excel extraction\CSV\" 'adapter chemin du dossier où se trouve les CSV
    
'   Loop through all CSV filres in folder
    workfile = Dir(folderName & "*.CSV")
    Do While workfile <> ""
'       Open CSV file
        Workbooks.Open Filename:=folderName & workfile
'   delimiteur avec ";"
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
    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), Array(26, 1), _
    Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array( _
    33, 1)), TrailingMinusNumbers:=True
'       Capture name of old CSV file
        oldfname = ActiveWorkbook.FullName
'       Convert to XLSX
        newfname = folderName & Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) & ".xlsx"
        ActiveWorkbook.SaveAs Filename:=newfname, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        ActiveWorkbook.Close
'       Delete old CSV file
        'Kill oldfname
        Windows(myfile).Activate
        workfile = Dir()
    Loop

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

Good Day Reaction GIF by MOODMAN
 

ESCOUGER2022

XLDnaute Nouveau
Bonjour,
J'ai repris cette macro qui correspond exactement à mon besoin.
J'ai cependant un dernier souci, car, dans le fichier CSV que je souhaite transformer en xlsx j'ai des valeurs numériques avec des décimales.
Il apparaît que la virgule soit considérée comme un séparateur, comme l'est le point virgule.
Ainsi par exemple le texte "BlaBla;18,53;abcd" se traduit sur 4 colonnes:
BlaBla 18 53 abcd
alors que je voudrais recevoir seulement 3 colonnes:
BlaBla 18,53 abcd.

J'ai bien essayé de rajouter de rajouter colon:=False sans succès
J'ai bien vu aussi que comma:=False était bien en place dans votre macro
J'ai aussi testé en direct l'importation du fichier csv via powerquery, et là cela fonctionne.

Je ne doute pas que vous aurez-vous une idée de ce qu'il convient de faire ?
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Cette discussion concerne une version excel dont on ne sait rien
Suivant votre version vous avez power query qui peut vous importer des données csv
Cerise sur le gâteau : vous serez non dépendant de quelqu'un qui connaît le VBA.

Ouvrez votre propre fil de discussion et indiquez votre version excel.

Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 885
Membres
101 830
dernier inscrit
sonia poulaert