Macro VBA Excel : Enregistrer une feuille de calcul en tant que fichier CSV

VBA - Visual Basic for Application

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.

Exemple de feuille de calcul Excel avec des données de produits à enregistrer dans un fichier CSV
Exemple de feuille de calcul Excel avec des données de produits

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.

Fichier CSV avec données Excel : la feuille de calcul entière a été exportée avec le paramètre Local=False
feuille de calcul exportée dans un fichier CSV avec le paramètre Local=False

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&gt ;, ce qui correspond selon tableau ASCII au symbole .

Fichier CSV avec données Excel : la feuille de calcul entière a été exportée
feuille de calcul exportée dans un fichier CSV avec le paramètre Local=True

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.

La plage d'une feuille de calcul a été exportée en CSV
Données CSV d’une plage Excel

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 &amp ; Chr(34) &amp ; myRange(i, j).Value &amp ; Chr(34) &amp ; Chr(59)
        Next
        'supprimer le dernier signe séparateur
        csvText = Left(csvText, Len(csvText) - 1)
        csvText = csvText &amp ; 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.

Les valeurs des champs Excel ont été écrites manuellement dans un fichier CSV
données CSV créées manuellement

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.

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *