web-dev-qa-db-fra.com

Comment créer un fichier CSV séparé à partir de VBA?

J'ai besoin de générer des résultats sous forme de fichier .csv, qui sera analysé ultérieurement par un autre processus. Afin de produire ces résultats, j'ai un énorme classeur contenant toutes les macros et fonctions dont j'ai besoin. 

  1. Est-il possible de "créer" un fichier .csv séparé de VBA
  2. Est-il possible d'utiliser des entités VBA pour y écrire au lieu d'écrire simplement dans une approche "textuelle brute"?

Je vous remercie :)

11
Jerome

Vous voulez quelque chose comme ça?

Option Explicit
Sub WriteFile()

  Dim ColNum As Integer
  Dim Line As String
  Dim LineValues() As Variant
  Dim OutputFileNum As Integer
  Dim PathName As String
  Dim RowNum As Integer
  Dim SheetValues() As Variant

  PathName = Application.ActiveWorkbook.Path
  OutputFileNum = FreeFile

  Open PathName & "\Test.csv" For Output Lock Write As #OutputFileNum

  Print #OutputFileNum, "Field1" & "," & "Field2"

  SheetValues = Sheets("Sheet1").Range("A1:H9").Value
  ReDim LineValues(1 To 8)

  For RowNum = 1 To 9
    For ColNum = 1 To 8
      LineValues(ColNum) = SheetValues(RowNum, ColNum)
    Next
    Line = Join(LineValues, ",")
    Print #OutputFileNum, Line
  Next

  Close OutputFileNum

End Sub

N'oubliez pas que vous devrez mettre des guillemets autour des champs contenant une virgule.

23
Tony Dallimore

La réponse de Tony fonctionne généralement mais ne traite pas le cas où votre texte contient des virgules ou des guillemets. Vous préférerez peut-être utiliser la méthode Workbook.SaveAs.

Voici un exemple si vous souhaitez enregistrer le contenu de la feuille Sheet1 en tant que fichier CSV séparé. 

Sub create_csv()
    Dim FileName As String
    Dim PathName As String
    Dim ws As Worksheet

    Set ws = ActiveWorkbook.Sheets("Sheet1")
    FileName = "filename.csv"
    PathName = Application.ActiveWorkbook.Path
    ws.Copy
    ActiveWorkbook.SaveAs FileName:=PathName & "\" & FileName, _
        FileFormat:=xlCSV, CreateBackup:=False
End Sub

Imaginez que votre Sheet1 contient:

lorem ipsum

lore, m ips "um"

Le fichier de sortie CSV sera: 

lorem, ipsum

"lore, m", "ips" "um" ""

8
user3707264

Vous pouvez écrire une macro comme enregistrer le classeur actuel (fichier Excel ouvert) au format CSV à partir de VBA:

ActiveWorkbook.SaveAs Filename:="C:\Book1.csv", _
    FileFormat:=xlCSVMSDOS, CreateBackup:=False
1
jatanp