XL 2016 VBA: Conversion Excel vers CSV (Séparateur : point-virgule)

MisterT

XLDnaute Occasionnel
Bonjour à vous ! Étant peu connaissant en VBA, j'ai besoin de votre aide. J'ai fait beaucoup de recherches pour tenter d'y arriver par moi-même mais en vain.

Ma VBA montre bien le fichier qui apparait qui a bien respecté les commandes VBA avec les datas dans les bonnes cellules et avec la fenêtre de sauvegarde en premier plan où il est bien inscrit CSV (Séparateur : point-virgule) (*.csv) pour la sauvegarde. Je clique enregistrer. . Je ferme ce fichier puis le ré-ouvre à partir de son emplacement avec Excel en CSV et tout est bien disposé, mais quoique j'ai essayé, le séparateur demeure toujours la virgule.

Dans les paramètres régionaux, "séparateur de liste" est bel et bien avec un point-virgule. J'ai essayé avec Local:=True pour respecter les paramètres et cela n'est pas respecté. J'ai lu à quelque part que c'est le setting du langage VBA en anglais qui prévaut et qui force le séparateur à virgule, ne tenant donc pas compte de la commande Local:=True.

Est-ce qu'il y aurait une façon de forcer la commande à utiliser les paramètres régionaux ?

Comme je souhaite que tout cela soit automatisé, j'ai pensé aussi à la possibilité suivante: Faire en sorte que dès que la sauvegarde et fermeture du fichier se fasse automatiquement par la VBA, que cette même VBA fasse ré-ouvrir instantanéement le fichier CSV à partir du même nom et emplacement sauvegardé et qui sera donc avec des virgules, puis ensuite, que la VBA fasse la fonction de Remplacer partout les virgules par des points-virgules.

J'ai essayé avec l'enregistreur de macros mais sans résultat, je manque beaucoup trop de connaissances VBA.

Voici donc le code de sauvegarde et le fichier est joint...
VB:
fname = Application.GetSaveAsFilename(InitialFileName:=Range("A2").Value & "_" & Range("G4").Value & Range("H4").Value & "_" & Year(Date) & Right("0" & Month(Date), 2) & Right("0" & Day(Date), 2), FileFilter:="CSV (Séparateur : point-virgule) (*.csv), *.csv", Title:="Save As")
    
    ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSV
Merci beaucoup à ceux qui prendront de leur expertise et précieux temps pour m'aider !
MisterT
 

Pièces jointes

  • TEST_CSV_Fr.xlsm
    40.1 KB · Affichages: 24

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir MisterT,
Ce problème a déjà été soulevé et résolu sur XLD.
Voir code de Staple au post #6.
 

MisterT

XLDnaute Occasionnel
Bonsoir et merci sylvanu et Staple1600 !

Comme le reste de mon code fonctionne, j'ai ajusté uniquement le bout de mon code de sauvegarde à ajuster comme ici-bas, mais dès que Local:=True, lorsque je ré-ouvre le fichier CSV sauvegardé, les datas sont demeurés dans des cellules multiples sans séparateur, au lieu d'êtres dans les cellules A1 à A9 avec les datas séparés par le séparateur.
1609718755540.png


Lorsque je mets à Local:=False, le fichier résultant est comme je veux dans les cellules A1 à A9 avec les datas séparés par le séparateur à part ce séparateur qui demeure la virgule.

1609718517825.png


Merci de m'éclairer pour une solution !

fname = Application.GetSaveAsFilename(InitialFileName:=Range("A2").Value & "_" & Range("G4").Value & Range("H4").Value & "_" & Year(Date) & Right("0" & Month(Date), 2) & Right("0" & Day(Date), 2), FileFilter:="CSV (Séparateur : point-virgule) (*.csv), *.csv", Title:="Save As")

ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSV, Local:=False: ActiveWorkbook.Close 0
 

MisterT

XLDnaute Occasionnel
Bonjour,

J'ai fait un constat intéressant de mon côté après toutes sortes d'essais:

- Ma VBA du début de fil avec Local:=True fonctionne bien avec fichier résultant avec séparateur point-virgule seulement si j'ouvre le fichier CSV avec Bloc-notes, WordPad, NotePad, etc.

- Si j'ouvre le fichier CSV avec Excel, j'obtiens le résultat comme la 1ère image en Post #4 précédent, donc, avec les datas dans des cellules et colonnes séparées.

Ma solution de rechange possible et fonctionnelle est de faire la sauvegarde directement en .txt au lieu de CSV comme ceci:
VB:
fname = Application.GetSaveAsFilename(InitialFileName:=Range("A2").Value & "_" & Range("G4").Value & Range("H4").Value & "_" & Year(Date) & Right("0" & Month(Date), 2) & Right("0" & Day(Date), 2), FileFilter:="CSV (Séparateur : point-virgule) (*.txt), *.txt", Title:="Save As")
    
    ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
    ActiveWorkbook.Close savechanges:=False

Ce serait la bienvenue si vous avez une solution qui ferait que l'ouverture du CSV se fasse dans Excel avec séparateur point-virgule comme l'image qui suit (j'ai pris le résultat Excel avec séparateur virgule et fait manuellement un REMPLACER virgule par point-virgule avec Excel):
1609778164793.png

Merci beaucoup et bonne journée !
MisterT
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

Le fil que j'avais posté en avril 2018 fonctionne toujours en 2021.
(je viens de tester)
VB:
Sub Export_CSV()
Dim fCSV As Workbook, strFichier$
With ThisWorkbook
strFichier = .Path & "\" & Split(.Name, ".")(0) & "-test.csv"
End With
ActiveSheet.Copy
Set fCSV = ActiveWorkbook
Application.DisplayAlerts = False
With fCSV
    .SaveAs Filename:=strFichier, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
    .Close False
End With
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

J'ai fait le test avec ceci
1) Dans un classeur vierge, lancer la macro ci-dessous
VB:
Sub Créer_TEST()
[A1:F1] = "=""ENTETE""&COLUMN()"
[A2:F33] = "=REPT(ADDRESS(ROW(),COLUMN(),4),3)"
[A2:F33] = [A2:F33].Value
End Sub
2) Enregistrer sous ce classeur en *.xlsm dans un répertoire de votre choix
3) Copiez dans ce classeur le code du message#6 puis exécutez le
Vous obtiendrez alors un fichier *.csv dans ce répertoire
4) Fermer Excel et dans ce répertoire, double-cliquez sur ce fichier CSV.
Le fichier est correctement ouvert dans Excel
(Les données sont bien séparées colonne par colonne)
 

chris

XLDnaute Barbatruc
Bonjour à tous
lorsque je ré-ouvre le fichier CSV sauvegardé, les datas sont demeurés dans des cellules multiples sans séparateur

Un csv doit être ouvert avec le bloc notes

Si tu l'ouvres avec Excel il est automatiquement transformé par Excel donc tu ne vois plus le csv mais le csv cuisiné par Excel à la sauce US généralement indigeste dès qu'il y a des dates et des nombres...
 

MisterT

XLDnaute Occasionnel
Merci beaucoup à vous 3 pour votre aide !!!

Merci sylvanu pour la référence du code de Staple1600 !

Merci Staple1600 pour ton code de rappel en #6 et l'ajout en #7. Je vais probablement essayer malgré mon incertitude à savoir comment bien les intégrer et tester.

ÉDITION: Finalement, j'ai suivi tes étapes bien décrites en #7 et cela fonctionne très bien, bravo et merci !!!

Merci Chris pour ton post avec la précision du csv qui doit être ouvert avec Bloc-notes ainsi que ta description de la réalité du csv cuisiné par Excel à la sauce US...Lol !!!

J'ai bien apprécié votre aide !

Cordialement,
MisterT
 
Dernière édition:

MisterT

XLDnaute Occasionnel
Re-bonjour,

J'ai encore besoin de votre aide pour ce projet...

Le résultat du fichier CSV avec séparateur de point-virgule montre plusieurs points-virgules à la fin de certaines lignes où il y avait plusieurs cellules vides du fichier Excel/CSV comme ce qui suit:
1609820557026.png
1609820722102.png

1) Est-ce possible d'ajouter un code dans ma vba actuel de conversion en CSV qui fera en sorte qu'il n'y aura pas de points-virgules générés en fin de ligne ?
2) Est-ce possible d'ajouter un code aussi pour faire en sorte que le séparateur de décimal pour les nombres soit un point au lieu d'une virgule ?

Voici le code complet actuel et fonctionnel où il y aurait les 2 ajouts à faire si cela est faisable:
Sub CSV_Fr()
Dim fname As String

Sheets("CLIENT_FR").Select
Range("B1:L37").Select
Range("B1:L37").Copy

Workbooks.Add
ActiveSheet.Range("A1").PasteSpecial (xlPasteValuesAndNumberFormats)

Range("A1:L38").UnMerge

ActiveSheet.Range("A1").Copy Destination:=ActiveSheet.Range("A1")
ActiveSheet.Range("E10").Copy Destination:=ActiveSheet.Range("A2")
ActiveSheet.Range("H10").Copy Destination:=ActiveSheet.Range("B2")
ActiveSheet.Range("J10").Copy Destination:=ActiveSheet.Range("C2")
ActiveSheet.Range("G13").Copy Destination:=ActiveSheet.Range("A3")
ActiveSheet.Range("K20").Copy Destination:=ActiveSheet.Range("H4")

ActiveSheet.Range("B21").Copy Destination:=ActiveSheet.Range("A4")
ActiveSheet.Range("D21").Copy Destination:=ActiveSheet.Range("B4")
ActiveSheet.Range("G21:K21").Copy Destination:=ActiveSheet.Range("C4:F4")
ActiveSheet.Range("B24").Copy Destination:=ActiveSheet.Range("A5")
ActiveSheet.Range("D24").Copy Destination:=ActiveSheet.Range("B5")
ActiveSheet.Range("F24").Copy Destination:=ActiveSheet.Range("C5")
ActiveSheet.Range("K24").Copy Destination:=ActiveSheet.Range("D5")
ActiveSheet.Range("B26:K26").Copy Destination:=ActiveSheet.Range("A6")
ActiveSheet.Range("B30").Copy Destination:=ActiveSheet.Range("A7")
ActiveSheet.Range("D30").Copy Destination:=ActiveSheet.Range("B7")
ActiveSheet.Range("F30").Copy Destination:=ActiveSheet.Range("C7")
ActiveSheet.Range("K30").Copy Destination:=ActiveSheet.Range("D7")
ActiveSheet.Range("B32:K32").Copy Destination:=ActiveSheet.Range("A8")
ActiveSheet.Range("B36:K362").Copy Destination:=ActiveSheet.Range("A9")

ActiveSheet.Range("A10:L38").Clear
ActiveSheet.Range("A1:L20").Select
ActiveSheet.Range("A1:L20").Copy

ActiveSheet.Range("A1").PasteSpecial (xlPasteValuesAndNumberFormats)

Application.CutCopyMode = False

fname = Application.GetSaveAsFilename(InitialFileName:=Range("A2").Value & "_" & Range("G4").Value & Range("H4").Value & "_" & Year(Date) & Right("0" & Month(Date), 2) & Right("0" & Day(Date), 2), FileFilter:="CSV (Séparateur : point-virgule) (*.csv), *.csv", Title:="Save As")

ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
ActiveWorkbook.Close savechanges:=False

End Sub
Mon fichier est joint...
Merci s'il vous est possible de m'aider à boucler ce projet !!!
MisterT
 

Pièces jointes

  • TEST_CSV_Fr .xlsm
    41.5 KB · Affichages: 7

chris

XLDnaute Barbatruc
Bonjour à tous

Un fichier csv, qui représente une table de données, doit matérialiser toutes les colonnes de la table en se basant sur la ligne qui contient le plus de colonnes
Si des lignes ont moins de colonnes, il est normal de voir des ; consécutifs pour matérialiser une ou des colonnes vides, parmis les autres ou à la fin

C'est la norme et la modifier risque fort de bloquer un import dans nombre de logiciels

Si tu en as au delà du nombre maxi de colonnes c'est en amont qu'il faut régler le problèmes en nettoyant ce qui, à droite des données utiles, n'est pas réellement vide
 

job75

XLDnaute Barbatruc
Bonjour MisterT, sylvanu, JM, chris,
Si des lignes ont moins de colonnes, il est normal de voir des ; consécutifs pour matérialiser une ou des colonnes vides, parmis les autres ou à la fin

C'est la norme et la modifier risque fort de bloquer un import dans nombre de logiciels
Téléchargez les fichiers zippés joints dans le même dossier.

Avec cette macro les points virgules à droite des textes sont enlevés :
VB:
Sub CSV()
Dim i&, x$, j%
Application.ScreenUpdating = False
With Workbooks.Open(ThisWorkbook.Path & "\FichierCSV.csv").Sheets(1)
    For i = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
        x = .Cells(i, 1)
        For j = Len(x) To 1 Step -1
            If Mid(x, j, 1) <> ";" Then Exit For
        Next j
        .Cells(i, 1) = Left(x, j) 'enlève les points-virgules à droite du texte
    Next i
    .Parent.Close True 'enregistre et ferme le fichier CSV
End With
End Sub
A priori cela ne pose pas de problème.

A+
 

Pièces jointes

  • Dossier.zip
    14.6 KB · Affichages: 13

MisterT

XLDnaute Occasionnel
Bonsoir job75,

J'ai ajouté le code à la fin de ma VBA comme ceci et ça ne fonctionne pas. Je mets le fichier joint aussi:
VB:
Sub CSV_Fr()
Dim fname As String

Sheets("CLIENT_FR").Select
    Range("B1:L37").Select
    Range("B1:L37").Copy
   
    Workbooks.Add
    ActiveSheet.Range("A1").PasteSpecial (xlPasteValuesAndNumberFormats)
   
    Range("A1:L38").UnMerge
   
    ActiveSheet.Range("A1").Copy Destination:=ActiveSheet.Range("A1")
    ActiveSheet.Range("E10").Copy Destination:=ActiveSheet.Range("A2")
    ActiveSheet.Range("H10").Copy Destination:=ActiveSheet.Range("B2")
    ActiveSheet.Range("J10").Copy Destination:=ActiveSheet.Range("C2")
    ActiveSheet.Range("G13").Copy Destination:=ActiveSheet.Range("A3")
    ActiveSheet.Range("K20").Copy Destination:=ActiveSheet.Range("H4")
   
    ActiveSheet.Range("B21").Copy Destination:=ActiveSheet.Range("A4")
    ActiveSheet.Range("D21").Copy Destination:=ActiveSheet.Range("B4")
    ActiveSheet.Range("G21:K21").Copy Destination:=ActiveSheet.Range("C4:F4")
    ActiveSheet.Range("B24").Copy Destination:=ActiveSheet.Range("A5")
    ActiveSheet.Range("D24").Copy Destination:=ActiveSheet.Range("B5")
    ActiveSheet.Range("F24").Copy Destination:=ActiveSheet.Range("C5")
    ActiveSheet.Range("K24").Copy Destination:=ActiveSheet.Range("D5")
    ActiveSheet.Range("B26:K26").Copy Destination:=ActiveSheet.Range("A6")
    ActiveSheet.Range("B30").Copy Destination:=ActiveSheet.Range("A7")
    ActiveSheet.Range("D30").Copy Destination:=ActiveSheet.Range("B7")
    ActiveSheet.Range("F30").Copy Destination:=ActiveSheet.Range("C7")
    ActiveSheet.Range("K30").Copy Destination:=ActiveSheet.Range("D7")
    ActiveSheet.Range("B32:K32").Copy Destination:=ActiveSheet.Range("A8")
    ActiveSheet.Range("B36:K362").Copy Destination:=ActiveSheet.Range("A9")
   
     
    ActiveSheet.Range("A10:L38").Clear
    ActiveSheet.Range("A1:L20").Select
    ActiveSheet.Range("A1:L20").Copy
   
    ActiveSheet.Range("A1").PasteSpecial (xlPasteValuesAndNumberFormats)
   
    Application.CutCopyMode = False
   
    fname = Application.GetSaveAsFilename(InitialFileName:=Range("A2").Value & "_" & Range("G4").Value & Range("H4").Value & "_" & Year(Date) & Right("0" & Month(Date), 2) & Right("0" & Day(Date), 2), FileFilter:="CSV (Séparateur : point-virgule) (*.csv), *.csv", Title:="Save As")
   
    ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
    ActiveWorkbook.Close savechanges:=False
   
Dim i&, x$, j%
Application.ScreenUpdating = False
With Workbooks.Open(fname)
    For i = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
        x = .Cells(i, 1)
        For j = Len(x) To 1 Step -1
            If Mid(x, j, 1) <> ";" Then Exit For
        Next j
        .Cells(i, 1) = Left(x, j) 'enlève les points-virgules à droite du texte
    Next i
    .Parent.Close True 'enregistre et ferme le fichier CSV
End With
 
End Sub

Est-ce possible de regarder pour une solution svp ?

Si possible, comment ajuster mon code pour que le séparateur de décimal des nombre devienne un point au lieu d'une virgule ?

Merci beaucoup,
MisterT
 

Pièces jointes

  • TEST_CSV_Fr_5janv18h09.xlsm
    42.7 KB · Affichages: 7
Dernière édition:

Discussions similaires