VBA convient parfaitement pour automatiser certaines tâches répétitives dans le domaine de Microsoft Office. Ainsi, il peut arriver que l’on souhaite enregistrer les données d’un fichier Excel ou d’une feuille de calcul sous forme de fichier CSV ou simplement les exporter au format CSV pour un traitement ultérieur. Selon les besoins et le cas d’application, il existe ici plusieurs possibilités.
Les exemples de code présentés ci-dessous doivent bien entendu être adaptés au cas d’utilisation individuel. Il peut également y avoir des exigences différentes concernant le formatage dans le fichier CSV et le séparateur. Le cas échéant, les valeurs doivent également être placées entre guillemets si le séparateur, comme une “comma“, peut également apparaître à l’intérieur des valeurs.
Exemple de fichier Excel
Les exemples de code présentés ci-dessous sont réalisés à l’aide d’un petit fichier Excel contenant différentes données formatées sur les produits et leurs prix. Cela permet de voir ce qui peut se passer avec le formatage lors de l’exportation dans un fichier *.csv.
Dans tous les exemples de code, une gestion des erreurs (Application.DisplayAlerts
) est insérée afin de supprimer les messages d’erreur pendant l’enregistrement. Mais on peut aussi omettre ce code.
Le fichier CSV est enregistré sous le même chemin que le fichier Excel (fileNameCSV = ThisWorkbook.Path
). Mais cela peut être adapté à volonté.
Enregistrer la feuille de calcul en tant que fichier CSV
Le code VBA suivant permet d’enregistrer une feuille de calcul complète en tant que nouveau fichier CSV. C’est pratique et le code VBA est relativement léger.
Code
Dans notre exemple, la feuille de calcul s’appelle “ProductList“. C’est pourquoi nous l’activons avec ce nom avant l’exportation.
Dans ce cas, c’est la méthode SaveAs qui remplit la fonction principale. Avec le paramètre FileFormat:=xlCSV, on détermine qu’il doit être enregistré au format CSV. Le paramètre Local est également important dans ce cas. Si l’on ne définit pas ce paramètre, la valeur par défaut est false et les paramètres de langue et de pays de l’éditeur VBA sont utilisés, qui sont par défaut English/USA. Cela peut avoir pour conséquence que si la devise est formatée en euros, le fichier CSV contiendra des dollars.
Sub exportWorksheetToCSV()
Dim fileNameCSV As String
Dim myWorksheet As Workbook
'utiliser ceci pour supprimer les messages d'erreur lors de l'exécution de la macro
Application.DisplayAlerts = False
On Error GoTo gestion des erreurs
'définir le chemin et le nom du fichier csv ici
fileNameCSV = ThisWorkbook.Path & "\" & "products.csv"
'activer la feuille de calcul regardante
ThisWorkbook.Sheets("ProductList").Activate
ActiveSheet.Copy
Set myWorksheet = ActiveWorkbook
'utiliser le paramètre Local pour obtenir les paramètres locaux d'excel, la valeur defaulf est fausse
'(Le paramètre local de VBA utilisé est par défaut l'anglais (USA))
myWorksheet.SaveAs Filename:=fileNameCSV, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
myWorksheet.Close
errorhandling :
Application.DisplayAlerts = True
Fin Sub
Résultat
Dans les images suivantes, nous voyons que lors de l’enregistrement des données CSV, on essaie de conserver le formatage. Cependant, dans ce cas, le paramètre Local était défini sur False. Cela a pour conséquence que les caractères en euros deviennent soudainement des caractères en dollars dans le fichier CSV.
Si l’on définit Local sur True, on obtient le résultat suivant. On voit que le signe dollar a disparu. A la place, il y a maintenant <0x80> ;, ce qui correspond selon tableau ASCII au symbole .
Exporter seulement une certaine partie d’une feuille de calcul au format CSV
Cette variante est très similaire à la variante précédente, à la différence près qu’au lieu d’enregistrer la feuille de calcul complète, on n’enregistre qu’une certaine partie (“Range“) au format CSV. Cela permet de déterminer un peu plus précisément ce qui doit être exporté et ce qui doit être exclu.
Code
La plage est définie par la variable myRange. Ensuite, on copie le contenu de myRange dans une nouvelle feuille de calcul créée par VBA. Le reste consiste simplement à enregistrer la nouvelle feuille de calcul, comme dans l’exemple précédent.
Sub exportRangeToCSV()
Dim fileNameCSV As String
Dim myWorkbook As Workbook
Dim myRange As Range
'utiliser ceci pour supprimer les messages d'erreur lors de l'exécution de la macro.
Application.DisplayAlerts = False
On Error GoTo gestion des erreurs
'définir le chemin et le nom du fichier csv ici
fileNameCSV = ThisWorkbook.Path & "\" & "products_range.csv"
'définir et copier la gamme dans un nouveau classeur.
Set myRange = Range("A1:E5")
myRange.Copy
Set myWorkbook = Application.Workbooks.Add(1)
myWorkbook.Sheets(1).Range("A1").PasteSpecial xlPasteValues
'utiliser le paramètre Local pour obtenir les paramètres locaux d'excel, la valeur defaulf est false
'(Le paramètre local de VBA utilisé est par défaut l'anglais (USA))
myWorkbook.SaveAs Filename:=fileNameCSV, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
myWorkbook.Close
errorhandling :
Application.DisplayAlerts = True
Fin Sub
Résultat
Le résultat est toutefois légèrement différent. En copiant la zone dans une nouvelle feuille de calcul, le formatage est perdu. C’est pourquoi on ne voit ici aucun symbole de devise ou de pourcentage, mais seulement les valeurs brutes.
Composer manuellement les données CSV et les éditer
Dans la variante de code suivante, les données CSV sont d’abord compilées manuellement dans une variable de type chaîne de caractères au moyen de boucles For, puis enregistrées dans un fichier. Cette méthode offre la plus grande flexibilité, d’une part parce que l’on peut choisir exactement les champs Excel qui doivent être exportés et d’autre part parce que l’on peut formater les valeurs exactement comme on en a besoin plus tard dans le CSV en insérant du code supplémentaire. On peut par exemple déterminer soi-même si l’on exporte un signe monétaire ou un signe de pourcentage ou si l’on exporte uniquement des valeurs brutes.
Dans cette variante, on peut également définir soi-même le caractère de séparation.
Code
Sub exportRangeManuallyToCSV()
Dim FSO As New FileSystemObject ' besoin de mettre une référence à la librairie d'exécution de script "Microsoft Scripting runtime" de VB
Dim fileNameCSV As String
Dim myWorkbook As Workbook
Dim myRange As Range
Dim rowNum As Integer
Dim colNum As Integer
Dim csvText As String
'utiliser ceci pour supprimer les messages d'erreur lors de l'exécution de la macro.
Application.DisplayAlerts = False
On Error GoTo gestion des erreurs
'définir le chemin et le nom du fichier csv ici
fileNameCSV = ThisWorkbook.Path & "\" & "products_range_manuelly.csv"
'définir et copier la gamme dans un nouveau classeur.
Set myRange = Range("A1:E5")
rowNum = myRange.Rows.Count
colNum = myRange.Columns.Count
csvText = ""
For i = 1 To rowNum
For j = 1 To colNum
csvText = csvText & ; Chr(34) & ; myRange(i, j).Value & ; Chr(34) & ; Chr(59)
Next
'supprimer le dernier signe séparateur
csvText = Left(csvText, Len(csvText) - 1)
csvText = csvText & ; vbCrLf
Next
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FileToCreate = FSO.CreateTextFile(fileNameCSV)
FileToCreate.Write csvText
FileToCreate.Close
errorhandling :
Application.DisplayAlerts = True
End Sub
Dans ce code, on parcourt colonne par colonne et ligne par ligne la plage Excel souhaitée (variable myRange). Les valeurs Excel d’une cellule sont placées entre guillemets via Chr(34). Chr(59) est le caractère de séparation, dans ce cas un point-virgule.
Le placement entre guillemets peut être important si les valeurs contiennent le même caractère que le signe de séparation.
Résultat
Si l’on exécute ensuite cette macro VBA, on obtient les données CSV suivantes.
Comme on n’a accès qu’à la propriété Value de chaque cellule Excel, on n’a ici aussi que les valeurs brutes, c’est-à-dire sans formatage de devise ou de pourcentage. On a cependant la possibilité de définir soi-même dans le code les formatages à afficher en adaptant la chaîne de caractères csvText en conséquence.