Générer un fichier CSV à partir d'une plage

Bonjour à tous,

J'ai besoin de votre aide pour perfectionner une Macro VBA

Mon besoin initial est le suivant :

Générer un fichier CSV à partir d'une plage (L5:P) en respectant la mise en forme des données et sans intégrer les lignes vides.
Je souhaiterai également pouvoir choisir le chemin de mon enregistrement.

J'ai commencé à travailler avec le code ci-dessous (module 3 : test) mais il ne répond que partiellement à mon besoin.

Sub Test()
Dim Plage As Object, oL As Object, oC As Object, Tmp$, Sep$
Sep = ";"
Set Plage = ActiveSheet.Range("L5:P" & ActiveSheet.Range("A65500").End(xlUp).Row)
Open "OWIM" & "_" & "COMMANDE" & "_" & "n°" & "_" & Range("I1") & "_" & Year(Date) & "_" & Right("0" & Month(Date), 2) & "_" & Right("0" & Day(Date), 2) & ".csv" For Output As #1
For Each oL In Plage.Rows
Tmp = ""
For Each oC In oL.Cells
Tmp = Tmp & CStr(oC.Text) & Sep
Next
Print #1, Tmp
Next
Close
End Sub

Je suis novice sur la rédaction du VBA, votre aide me sera précieuse 😇 (vous trouverez également le fichier en PJ)

10owim-macro.zip (321.66 Ko)

Merci par avance

Bonjour Corbani et

Merci de mettre le code entre balises quand vous en donnez un

2023 06 22 09h32 31

Sinon pour ce que vous demandez, vous pouvez essayer ceci

Sub Test()
  Dim Plage As Object, oL As Object, oC As Object, Tmp$, Sep$
  Dim sNomFic As String, sPath As String, sTmp As String
  ' Préparer le nom du fichier
  sNomFic = "OWIM" & "_" & "COMMANDE" & "_" & "n°" & "_" & Range("I1") & "_" & Year(Date) & "_" & Right("0" & Month(Date), 2) & "_" & Right("0" & Day(Date), 2) & ".csv"
  ' Confirmer le nom et chemin du fichier
  sTmp = Application.GetSaveAsFilename(ThisWorkbook.Path & "\" & sNomFic, FileFilter:="Fichier CSV (*.csv), *csv", Title:="CHOIX d'ENREGISTREMENT")
  ' Si annulation
  If sTmp = "Faux" Then Exit Sub
  ' Sinon récupérer le chemin d'accès
  sPath = Left(sTmp, InStrRev(sTmp, "\"))
  '
  Sep = ";"
  Set Plage = ActiveSheet.Range("L5:P" & ActiveSheet.Range("A65500").End(xlUp).Row)
  Open sPath & sNomFic For Output As #1
  For Each oL In Plage.Rows
    ' Si la ligne est vide on passe à la suivante
    If oL.Cells(1) = "" Then GoTo NextoL
    ' Ou on sort
    'If oL.Cells(1) = "" Then Exit For
    Tmp = ""
    For Each oC In oL.Cells
      Tmp = Tmp & CStr(oC.Text) & Sep
    Next oC
    Print #1, Tmp
NextoL:
  Next oL
  Close
End Sub

A+

Bonjour Bruno M45,

Parfait ça fonctionne !!!!

Merci beaucoup pour ton aide, je note pour mes demandes de bien intégrer la fonction code dans mes demandes.

Bonne journée et à bientôt

Bonjour à tous,

J'ai une nouvelle fois besoin de votre aide 😇 pour perfectionner une macro.

Ma problématique est la suivante :

Le fichier CSV qui est généré me permet d'importer des données de commande directement dans un autre logiciel interne.

Quand j'importe mon fichier CSV il présente une anomalie sur la date de livraison avec un ";" après celle-ci comme s'il appliquait un nouveau séparateur avant une celulle vide alors qu'il ne récupère la plage que de la colonne P à T.

J'aimerai que le séparateur ne soit pas appliqué après la colonne T pour éviter une anomalie (cf.photo ci-dessous)

image

Je vous joins le code utilisé ainsi que le fichier :

Sub Test()
  Dim Plage As Object, oL As Object, oC As Object, Tmp$, Sep$
  Dim sNomFic As String, sPath As String, sTmp As String
  ' Préparer le nom du fichier
  sNomFic = "OWIM" & "_" & "COMMANDE" & "_" & "n°" & "_" & Range("I1") & "_" & Year(Date) & "_" & Right("0" & Month(Date), 2) & "_" & Right("0" & Day(Date), 2) & ".csv"
  ' Confirmer le nom et chemin du fichier
  sTmp = Application.GetSaveAsFilename(ThisWorkbook.Path & "\" & sNomFic, FileFilter:="Fichier CSV (*.csv), *csv", Title:="CHOIX d'ENREGISTREMENT")
  ' Si annulation
  If sTmp = "Faux" Then Exit Sub
  ' Sinon récupérer le chemin d'accès
  sPath = Left(sTmp, InStrRev(sTmp, "\"))
  '
  Sep = ";"
  Set Plage = ActiveSheet.Range("L5:P" & ActiveSheet.Range("A65500").End(xlUp).Row)
  Open sPath & sNomFic For Output As #1
  For Each oL In Plage.Rows
    ' Si la ligne est vide on passe à la suivante
    If oL.Cells(1) = "" Then GoTo NextoL
    ' Ou on sort
    'If oL.Cells(1) = "" Then Exit For
    Tmp = ""
    For Each oC In oL.Cells
      Tmp = Tmp & CStr(oC.Text) & Sep
    Next oC
    Print #1, Tmp
NextoL:
  Next oL
  Close
End Sub
15owim-dis.zip (311.68 Ko)

Merci par avance pour votre aide 😊

Bonne fin de journée

Bonjour à tous,

Après quelques recherches j'ai trouvé la solution, je vous joins le code si ça peut aider à l'avenir.

Merci à tous pour le temps accordé à la lecture du post.

Excellente journée.

Sub Test()
  Dim Plage As Object, oL As Object, oC As Object, Tmp$, Sep$
  Dim sNomFic As String, sPath As String, sTmp As String
  ' Préparer le nom du fichier
  sNomFic = "LOTUS" & "_" & "MARQUES" & "_" & "COMMANDE" & "_" & "n°" & "_" & Range("I1") & "_" & Year(Date) & "_" & Right("0" & Month(Date), 2) & "_" & Right("0" & Day(Date), 2) & ".csv"
  ' Confirmer le nom et chemin du fichier
  sTmp = Application.GetSaveAsFilename(ThisWorkbook.Path & "\" & sNomFic, FileFilter:="Fichier CSV (*.csv), *csv", Title:="CHOIX d'ENREGISTREMENT")
  ' Si annulation
  If sTmp = "Faux" Then Exit Sub
  ' Sinon récupérer le chemin d'accès
  sPath = Left(sTmp, InStrRev(sTmp, "\"))
  '
  Sep = ";"
  Set Plage = ActiveSheet.Range("P4:T" & ActiveSheet.Range("A65500").End(xlUp).Row)
  Open sPath & sNomFic For Output As #1
  For Each oL In Plage.Rows
    ' Si la ligne est vide on passe à la suivante
    If oL.Cells(1) = "" Then GoTo NextoL
    ' Ou on sort
    'If oL.Cells(1) = "" Then Exit For
    Tmp = ""
    For Each oC In oL.Cells
      Tmp = Tmp & CStr(oC.Text) & Sep
    Next oC
    Print #1, Mid(Tmp, 1, Len(Tmp) - 1)
NextoL:
  Next oL
  Close
End Sub
Rechercher des sujets similaires à "generer fichier csv partir plage"