XL 2016 convertir un fichier .csv en .xlms

scoubidou35

XLDnaute Occasionnel
Bonjour à tous,

J'ai des fichiers en .csv que je dois modifier en .xlsm après avoir effectué des modifications sur la structure du fichier.
J'ai donc fait un enregistrement des actions pour obtenir la macro que j'ai légèrement modifié
Donc maintenant j'ai un fichier "convertir" dans lequel je copie les info contenu dans le fichier .csv dans l'onglet "FichierOrigine" puis j'exécute la macro et j'obtiens le résultat que je veux c'est à dire un nouveau fichier .xls près à être utilisé
Mais je dois refaire la manip pour chacun des fichiers csv j'entends par là que je suis obligé de copier le fichier csv dans mon fichier "convertir"
Est ce que quelqu'un serait s'il est possible d'ouvrir le fichier csv et par un moyen de bouton dans la barre de commande par exemple d'exécuter la macro et d'obtenir ainsi le résultat plus rapidement ou comment faire pour que la macro réalise le travail sans avoir à nommer le fichier car pour l'instant je suis obligé de copier le fichier csv sur une feuille bien précise (avec un nom : ici FichierOrigine)pour indiquer à dans la macro les info à convertir.

Je ne suis pas sûr d'être clair mais je me tiens à votre dispo pour toutes informations complémentaires bien sûr.
Merci
 

Pièces jointes

  • test pour convertir les fichiers échantillons.xlsm
    26.3 KB · Affichages: 36
Solution
Fichier (4) avec utilisation du Dictionary pour traiter les nouveaux codes :
VB:
Sub Convertir()
Dim chemin$, fichier$, d As Object, tablo, i&, ncol%
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = Dir(chemin & "*.csv") '1er fichier CSV du dossier
'---listes des anciens et nouveaux codes---
Set d = CreateObject("Scripting.Dictionary")
tablo = Feuil2.[A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide, à adapter
For i = 2 To UBound(tablo)
    d(tablo(i, 1)) = tablo(i, 2)
Next
'---traitement des fichiers CSV___
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si le fichier a déjà été créé
While fichier <> ""
    With Workbooks.Open(chemin & fichier)
        With .Sheets(1).Cells(1).CurrentRegion...

Dudu2

XLDnaute Barbatruc
J'ai ouvert ton fichier et cliqué sur "le bouton "conversion CSV" il me demande de sélection le dossier, je sélectionne donc le dossier où sont tous les fichiers CSV
En effet, c'est correct.
Ensuite il ouvre chaque .CSV de ce dossier sans rien demander à personne, renomme la 1ère feuille "FICHIERORIGINE" et créé un 2ème feuille "NOUVEAU TABLEAU" pour être dans la configuration requise par la fonction Convertisseur puis appelle ta fonction Convertisseur avant d'enregistrer le fichier en tant que .XLS.

puis à l'étape suivante je sélectionne le fichier CSV que je veux convertir mais après je ne comprends ce qui m'est demandé.
Non, ça c'est ta fonction Convertisseur qui le fait mais je ne sais pas pourquoi. Je n'ai pas essayé de comprendre ce que fait cette fonction, j'ai juste créé les conditions pour l'appeler.
 

Dudu2

XLDnaute Barbatruc
Voir Call Convertisseur dans la boucle.

VB:
    'Conversion des CSV en XLS
    For i = 1 To UBound(TabNomFichiers)
        NomFichier = TabNomFichiers(i)
    
        'Fichier .xls existe déjà
        If Len(Dir(NomRépertoire & Left(NomFichier, Len(NomFichier) - 4) & Extension)) Then
            Kill NomRépertoire & Left(NomFichier, Len(NomFichier) - 4) & Extension
        End If
    
        'Workbooks.OpenText NomRépertoire & NomFichier, DataType:=xlFixedWidth
        Workbooks.Open NomRépertoire & NomFichier, local:=True
        With ActiveWorkbook
            .Worksheets(1).Name = NomFeuille1
            .Worksheets.Add after:=.Worksheets(NomFeuille1)
            ActiveSheet.Name = NomFeuille2

            '-----------------
            Call Convertisseur
            '-----------------
        
            .SaveAs NomRépertoire & Left(NomFichier, Len(NomFichier) - 4), ExtenstionXlFileFormat
            .Close
        End With
    Next i
 

Pièces jointes

  • Conversion CSV.xlsm
    23 KB · Affichages: 12
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour scoubidou35, Dudu2,

Cette nouvelle macro dans le fichier (2) tient compte de vos demandes :
VB:
Sub Convertir()
Dim chemin$, fichier$, ncol%
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = Dir(chemin & "*.csv") '1er fichier CSV du dossier
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si le fichier a déjà été créé
While fichier <> ""
    With Workbooks.Open(chemin & fichier)
        With .Sheets(1)
            .Columns(1).Replace "_", ",", xlPart
            ncol = Len(.Cells(2, 1)) - Len(Replace(.Cells(2, 1), ",", "")) + 2 'nombre de colonnes
            .Columns(2).Cut .Columns(ncol) 'couper-coller
            .Columns(1).TextToColumns .Cells(1), xlDelimited, Comma:=True 'commande Convertir
            .Columns(ncol).Replace ".", Application.DecimalSeparator
            .Cells(1) = "Field": .Cells(1, 2) = "Row": .Cells(1, 3) = "Column": .Cells(1, 4) = "Value"
            .Columns.AutoFit 'ajustement largeurs
        End With
        .SaveAs chemin & Left(.Name, Len(.Name) - 4), 56 'fichier.xls
        .Close
    End With
    fichier = Dir 'fichier suivant
Wend
End Sub
A+
 

Pièces jointes

  • Dossier(2).zip
    16.5 KB · Affichages: 4

scoubidou35

XLDnaute Occasionnel
Bonjour scoubidou35, Dudu2,

Cette nouvelle macro dans le fichier (2) tient compte de vos demandes :
VB:
Sub Convertir()
Dim chemin$, fichier$, ncol%
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = Dir(chemin & "*.csv") '1er fichier CSV du dossier
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si le fichier a déjà été créé
While fichier <> ""
    With Workbooks.Open(chemin & fichier)
        With .Sheets(1)
            .Columns(1).Replace "_", ",", xlPart
            ncol = Len(.Cells(2, 1)) - Len(Replace(.Cells(2, 1), ",", "")) + 2 'nombre de colonnes
            .Columns(2).Cut .Columns(ncol) 'couper-coller
            .Columns(1).TextToColumns .Cells(1), xlDelimited, Comma:=True 'commande Convertir
            .Columns(ncol).Replace ".", Application.DecimalSeparator
            .Cells(1) = "Field": .Cells(1, 2) = "Row": .Cells(1, 3) = "Column": .Cells(1, 4) = "Value"
            .Columns.AutoFit 'ajustement largeurs
        End With
        .SaveAs chemin & Left(.Name, Len(.Name) - 4), 56 'fichier.xls
        .Close
    End With
    fichier = Dir 'fichier suivant
Wend
End Sub
A+

Merci beaucoup Job75.
J'ai rajouté ceci dans le code pour ne plus avoir le "g" dans la colonne "value" :
.Columns(4).Replace " g", "", xlPart

Je ne sais pas si c'est possible mais je voulais savoir si au niveau du nom du fichier excel de ne pas avoir exactement celui du fichier CSV.
par exemple ne pas avoir 20200710-dm020720 mais seulement DM020720.

Et par rapport à mon fichier de départ j'avais mis une formule dans le code pour faire une rechercheV pour modifier le code de la colonne Field
Par exemple modifier 2020LFD18S3 en ne prenant que les 10 premiers caractères en partant de la gauche soit 2020LFD18S en Rennes For LFD 18 S avec l'aide d'un fichier à part je pense car il y aura une mise à jour annuelle. Est ce que c'est toujours possible également.
Merci encore pour votre aide.
 

job75

XLDnaute Barbatruc
1) On peut en effet remplacer dans ma macro :
VB:
.Columns(ncol).Replace ".", Application.DecimalSeparator
par :
VB:
.Columns(ncol).Replace " g", ""
2) Pour le nom du fichier xls, s'il y a toujours un tiret dans la nom du fichier CSV, utiliser :
VB:
.SaveAs chemin & UCase(Trim(Split(Left(.Name, Len(.Name) - 4), "-")(1))), 56 'fichier.xls
3) Si l'on veut un maximum de 10 caractères en colonne A il suffit de faire une boucle :
Code:
            With .Cells(1).CurrentRegion
                tablo = .Columns(1).Resize(, 2) 'matrice plus rapide, au moins 2 éléments
                For i = 2 To UBound(tablo)
                    tablo(i, 1) = Left(tablo(i, 1), 10)
                Next
                .Columns(1) = tablo
            End With
Fichier (3).
 

Pièces jointes

  • Dossier(3).zip
    17.5 KB · Affichages: 3

scoubidou35

XLDnaute Occasionnel
1) On peut en effet remplacer dans ma macro :
VB:
.Columns(ncol).Replace ".", Application.DecimalSeparator
par :
VB:
.Columns(ncol).Replace " g", ""
2) Pour le nom du fichier xls, s'il y a toujours un tiret dans la nom du fichier CSV, utiliser :
VB:
.SaveAs chemin & UCase(Trim(Split(Left(.Name, Len(.Name) - 4), "-")(1))), 56 'fichier.xls
3) Si l'on veut un maximum de 10 caractères en colonne A il suffit de faire une boucle :
Code:
            With .Cells(1).CurrentRegion
                tablo = .Columns(1).Resize(, 2) 'matrice plus rapide, au moins 2 éléments
                For i = 2 To UBound(tablo)
                    tablo(i, 1) = Left(tablo(i, 1), 10)
                Next
                .Columns(1) = tablo
            End With
Fichier (3).

Merci encore, çà fonctionne comme mon souhait. Pour terminé j'essai de changer le code de la colonne Field avec une formule rechercheV avec les correspondance pour avoir le bon code à l'aide de la feuille 2 (Code_convertion) que je mettrai un fois par an à jour.
Mais je n'obtiens pas le nouveau code et en plus j'ai un message pour mettre à jour des laisons. Je dois mal interpréter chaque phrase de votre code ce qui fait que soit j'ai mal placé mon code et/ou je ne m'y prends mal.
 

Pièces jointes

  • Convertir(4).xlsm
    18.7 KB · Affichages: 2

job75

XLDnaute Barbatruc
Fichier (4) avec utilisation du Dictionary pour traiter les nouveaux codes :
VB:
Sub Convertir()
Dim chemin$, fichier$, d As Object, tablo, i&, ncol%
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = Dir(chemin & "*.csv") '1er fichier CSV du dossier
'---listes des anciens et nouveaux codes---
Set d = CreateObject("Scripting.Dictionary")
tablo = Feuil2.[A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide, à adapter
For i = 2 To UBound(tablo)
    d(tablo(i, 1)) = tablo(i, 2)
Next
'---traitement des fichiers CSV___
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si le fichier a déjà été créé
While fichier <> ""
    With Workbooks.Open(chemin & fichier)
        With .Sheets(1).Cells(1).CurrentRegion
            .Columns(1).Replace "_", ",", xlPart
            ncol = Len(.Cells(2, 1)) - Len(Replace(.Cells(2, 1), ",", "")) + 2 'nombre de colonnes
            .Columns(2).Cut .Columns(ncol) 'couper-coller
            .Columns(1).TextToColumns .Cells(1), xlDelimited, Comma:=True 'commande Convertir
            tablo = .Columns(1).Resize(, 2) 'matrice plus rapide, au moins 2 éléments
            For i = 2 To UBound(tablo)
                tablo(i, 1) = d(Left(tablo(i, 1), 10)) 'utilisation des nouveaux codes
            Next
            .Columns(1) = tablo
            .Columns(ncol).Replace " g", ""
            .Cells(1).Resize(, 4) = Array("Field", "Row", "Column", "Value")
            .Columns.AutoFit 'ajustement largeurs
        End With
        .SaveAs chemin & UCase(Trim(Split(Left(.Name, Len(.Name) - 4), "-")(1))), 56 'fichier.xls
        .Close
    End With
    fichier = Dir 'fichier suivant
Wend
End Sub
Nota : conversion s'écrit avec un s...
 

Pièces jointes

  • Dossier(4).zip
    19.1 KB · Affichages: 5
Dernière édition:

scoubidou35

XLDnaute Occasionnel
Fichier (4) avec utilisation du Dictionary pour traiter les nouveaux codes :
VB:
Sub Convertir()
Dim chemin$, fichier$, d As Object, tablo, i&, ncol%
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = Dir(chemin & "*.csv") '1er fichier CSV du dossier
'---listes des anciens et nouveaux codes---
Set d = CreateObject("Scripting.Dictionary")
tablo = Feuil2.[A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide, à adapter
For i = 2 To UBound(tablo)
    d(tablo(i, 1)) = tablo(i, 2)
Next
'---traitement des fichiers CSV___
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si le fichier a déjà été créé
While fichier <> ""
    With Workbooks.Open(chemin & fichier)
        With .Sheets(1).Cells(1).CurrentRegion
            .Columns(1).Replace "_", ",", xlPart
            ncol = Len(.Cells(2, 1)) - Len(Replace(.Cells(2, 1), ",", "")) + 2 'nombre de colonnes
            .Columns(2).Cut .Columns(ncol) 'couper-coller
            .Columns(1).TextToColumns .Cells(1), xlDelimited, Comma:=True 'commande Convertir
            tablo = .Columns(1).Resize(, 2) 'matrice plus rapide, au moins 2 éléments
            For i = 2 To UBound(tablo)
                tablo(i, 1) = d(Left(tablo(i, 1), 10)) 'utilisation des nouveaux codes
            Next
            .Columns(1) = tablo
            .Columns(ncol).Replace " g", ""
            .Cells(1).Resize(, 4) = Array("Field", "Row", "Column", "Value")
            .Columns.AutoFit 'ajustement largeurs
        End With
        .SaveAs chemin & UCase(Trim(Split(Left(.Name, Len(.Name) - 4), "-")(1))), 56 'fichier.xls
        .Close
    End With
    fichier = Dir 'fichier suivant
Wend
End Sub
Nota : conversion s'écrit avec un s...

Bonjour Job75,
C'est exactement ce que j'ai besoins. Maintenant en un simple clique les fichiers CSV sont converti en xls avec la mise en forme qu'il faut pour l'importation dans la base...ça va me faire un sacré gain de temps.
Un grand merci pour le temps passé et l'aide fourni. Je remercie également Dudu2.
Bonne journée
 

Discussions similaires

Réponses
13
Affichages
354

Statistiques des forums

Discussions
312 199
Messages
2 086 160
Membres
103 147
dernier inscrit
tubaman