Export cvs

Bonjour,

je suis novice en VBA et j'aurai besoin de vous pour une petite modification sur un bout de code.

j'ai un bouton qui me sert à exporter en cvs ma feuille courante.

Private Sub CommandButton1_Click()
Dim Plage As Object, oL As Object, oC As Object, Tmp As String, Sep$
Sep = ","
Set Plage = ActiveSheet.Range("A1:D500")
Open "planning.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

Ca fonctionne très bien, m'ai le format n'est pas parfait.

j'ai 4 colones dans mon fichier et potentiellement un nombre inconnu à l'avance de ligne.

J'aimerai que mon CVS ressemble à ca :

premier,deuxième,troisième,quatrième
premier,deuxième,troisième,quatrième
premier,deuxième,troisième,quatrième
premier,deuxième,troisième,quatrième

Pour l'instant j'ai ca :

premier,deuxième,troisième,quatrième,
premier,deuxième,troisième,quatrième,
premier,deuxième,troisième,quatrième,
premier,deuxième,troisième,quatrième,
,,,,
,,,,
,,,,
,,,,
,,,,

Je voudrais donc sortir la dernière virgule de ma ligne et ne pas ajouter des lignes avec des virgules quand mes cellules sont vide.

Merci beaucoup,

Bonjour,

Remplace

Set Plage = ActiveSheet.Range("A1:D500")

par

Set Plage = ActiveSheet.Range("A1:D" & Range("A65000").end(xlup).row )

Bonjour,

Merci de ta réponse, hélas ca ne change rien.

J'ai toujours les lignes inutiles avec les 4 virgules.

Je pense que c'est du au fait qu'il y a bien quelque chose dans mes cellules.

En effet elles sont "vide" mais contienne une formule du genre

=SI(condition;"";"valeur")

Une idée ?

bonjour

salut Steelson

copier la zone (et même une zone plus grande que nécessaire, pour anticiper l'allongement de tes données)

dans un autre onglet, faire Collage spécial valeur

exporter cet onglet

tout ceci en macro (enregistrer le copier/collerspécialvaleur)

Bonjour,

Merci de ta réponse mais j'aimerai bien faire au plus simple pour l'utilisateur de mon excel.

J'aimerai que tout soit dans le bouton en VBA.

Une piste pour supprimer la dernière virgule de chaque ligne.

Je maitrise pas bien le for each en VBA mais l'idée c'est d'accéder à la dernière itération de chaque ligne et de lui faire écrire

Tmp = Tmp & CStr(oC.Text)
au lieu de
Tmp = Tmp & CStr(oC.Text) & Sep

Merci,

Franck

plutôt quelque chose comme

'......................
Next
tmp = Mid(tmp, 1, Len(temp) - 1)
Print #1, Tmp
'..................

Pour diminuer le nombre de lignes, remplace la boucle for / nextpar un

i=1
while Cells(i,"A")<>""
' ici ton code
i=i+1
loop

enfin je te laisse mettre au point en consultant les aides du forum !!

Merci Steelson

Je m'en suis sorti grâce à toi pour la dernière virgule.

For Each oC In oL.Cells
Tmp = Tmp & CStr(oC.Text) & Sep
Next
Print #1, Mid(Tmp, 1, Len(Tmp) - 1)
Next

peux tu m'en dire un peu plus sur comment transformer le foreach en while ?

Et surtout comment arreter le while à la première qui contient une cellule vide.

Un énorme merci

Tu eux aussi essayer ceci en ajoutant If oL.Cells(1) = "" Then Exit For

Dim Plage As Object, oL As Object, oC As Object, Tmp As String, Sep$
Sep = ","
Set Plage = ActiveSheet.Range("A1:D500")
Open "planning.csv" For Output As #1

For Each oL In Plage.Rows
    Tmp = ""
    If oL.Cells(1) = "" Then Exit For
    For Each oC In oL.Cells
        Tmp = Tmp & CStr(oC.Text) & Sep
    Next
    Print #1, Mid(Tmp, 1, Len(Tmp) - 1)
Next

Close

Bonjour,

Tu peux aussi utiliser CurrentRegion au cas où tu dépasserais 500 lignes

Set Plage = ActiveSheet.Range("A1").CurrentRegion 

Bonjour,

A tester :

Sub Test()

    Dim Plage As Range
    Dim Ligne As Range
    Dim Cel As Range
    Dim Sep As String
    Dim Tmp As String

    With ActiveSheet: Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 4).End(xlUp)): End With

    Sep = ","

    Open "planning.csv" For Output As #1

    For Each Ligne In Plage.Rows

        For Each Cel In Ligne.Cells

            If Cel.Value <> "" Then: Tmp = Tmp & CStr(Cel.Value) & Sep

        Next Cel

        If Tmp <> "" Then

            Tmp = Left(Tmp, Len(Tmp) - 1)
            Print #1, Tmp
            Tmp = ""

        End If

    Next Ligne

    Close #1

End Sub

J'ai essayé pour ma part de respecter le plus possible le langage adopté

For Each oL In Plage.Rows
'...
For Each oC In oL.Cells
'...
Next
'...
Next

qui est assez élégant !

Un grand merci à tous, je n'ai eu à tester que la solution de Steelson et ce fut la bonne.

Un grand merci à vous tous, vous êtes d'une rapidité et d'un justesse impressionante.

La solution finale si ca peut aider quelqu'un d'autre.

Private Sub CommandButton1_Click()
Dim Plage As Object, oL As Object, oC As Object, Tmp As String, Sep$
Sep = ","
Set Plage = ActiveSheet.Range("A1:D500")
Open "planning.csv" For Output As #1

For Each oL In Plage.Rows
    Tmp = ""
    If oL.Cells(1) = "" Then Exit For
    For Each oC In oL.Cells
        Tmp = Tmp & CStr(oC.Text) & Sep
    Next
    Print #1, Mid(Tmp, 1, Len(Tmp) - 1)
Next

Close
End Sub

Un grand merci

Bonne journée,

Rechercher des sujets similaires à "export cvs"