Enregistrer au format .csv par macro

Bonsoir,

en Excel 2010, j'arrive pas à enregistrer au format .csv avec séparateur ";" dans une macro

Ça marche en faisant "Enregistrez sous" à la souris mais pas la même manip enregistrée dans une macro !!!!!

Une idée ?

Merci d'avance

Bonjour,

Voici une macro qui permet d'enregistrer une plage(à définir) de la feuille active au format csv

Sub Test()
Dim Plage As Object, oL As Object, oC As Object, Tmp$, Sep$
Sep = ";"
Set Plage = ActiveSheet.Range("A1:AK" & ActiveSheet.Range("A65500").End(xlUp).Row)
Open "NomFich.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

Dans cette macro la plage enregistrée va de la première à la dernière ligne de la colonne A et s'étend jusqu'à la colonne K. Le fichier est nommé "NomFich.csv".

A+

Bonsoir Galopin,

ca marche !

grand merci

Bonjour Galopin,

j'ai un soucis avec l'export

il me met des ; même aux lignes blanches

J'arrive à purger les lignes vides mais à l'export il met des point-virgules à toute les lignes de sa plage

Pour le limiter je suis obliger à 1280 lignes environ de mettre 128 !!!

Dim Plage As Object, oL As Object, oC As Object, Tmp$, Sep$

Sep = ";"

Set Plage = ActiveSheet.Range("A1:D128" & ActiveSheet.Range("A128").End(xlUp).Row)

Open "C:\Gesco\Tarif\Tarif.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

C'est pas possible de lui indiquer par un Ctrl+Fin de lui indiquer à la dernière cellule à exporter ?

Merci d'avance

Meilleurs voeux

-- 01 Jan 2011, 18:52 --

J'ai trouvé la commande pour identifier la dernière cellule

ActiveSheet.UsedRange.SpecialCells(xlLastCell).End(xlToLeft).Select

C'est possible de la récupérer dans une variable pour lui indiquer la plage de sélection ?

Merci d'avance

Bonjour,

C'est en effet cette ligne qui détermine la plage à enregistrer

Set Plage = ActiveSheet.Range("A1:AK" & ActiveSheet.Range("A65500").End(xlUp).Row)

Pour restreindre à quatre colonne il faut mettre :

Set Plage = ActiveSheet.Range("A1:D" & ActiveSheet.Range("A65500").End(xlUp).Row)

Il ne faut pas spécifier le 128

C'est la deuxième moitié de cette ligne qui spécifie la dernière ligne de la colonne A

... & ActiveSheet.Range("A65500").End(xlUp).Row)

Si par hasard la colonne B (ou D) était plus longue que la A il suffir de changer A par B (ou D) et c'est tout...

Nota : ce n'est pas une bonne idée d'avoir disjoint les 2 sujets (supprimer les lignes vides...)et celui-ci. En effet il y a une forte interraction entre les deux. En fait le fond du problème semble être la colonne de référence pour déterminer le nombre de lignes :

Dans un premier temps la macro de Dan fait le bon travail pour supprimer les lignes vides.

Dans un deuxième temps ma macro enregistre tout ce qui reste. le seul point litigieux étant le choix de "la bonne colonne" pour trouver le nombre de ligne.

Je pense que maintenant tu as tous les éléments en main ?

A+

PS : Une macro est une pièce d'horlogerie : Un patchwork de macros glanées ici et là font rarement bon ménage. Si tu as encore des difficultés : Demande et ne pinaille pas !

En tout cas, dans cette situation, je te déconseille fortement cette "formule" :

ActiveSheet.UsedRange.SpecialCells(xlLastCell)....

MERCI ca marche enfin !

J'ai cru bien faire en séparant les questions vu que j'avais 2 problèmes :

  • purger les lignes blanches
  • exporter en .csv avec ";" les lignes restantes

Le temps qu'il purge mes 3000 lignes de formules on peut pas masquer le sautillement des lignes

et afficher un message du style "Patience, procédure en cours" ?

C'est un détail mais en attendant merci à tous, je vais pouvoir passer un week-end plus paisible

Bonne soirée et bon dimanche

bonsoir,

Metre en début de macro :

Application.ScreenUpdating = False

et (facultatif) :

Application.ScreenUpdating = True

...à la fin.

...et afficher un message...

Si ! On pourrait éventuellement ajouter un Message mais est-ce vraiment indispensable ?

Je pense que cette seule ligne doit déjà considérablement réduire l'attente.

Sinon tu me dis le temps que ça met à tourner et on avisera.

Bon Dimanche.

-- Sam Jan 01, 2011 11:14 pm --

[Edit] Cette autre macro me semble sans doute plus appropriée que tout le bricolage que tu as fait.

Tu pars de ton Collage spécial valeur...

Elle copie toutes tes lignes (y compris les vides) et ne restitue en .csv que les lignes ou la colonne 4 est > 0

Avantage : Plus la peine de supprimer les lignes vides et (sans doute) beaucoup plus rapide car on travaille sur un Array (tableau virtuel) et non plus sur la feuille elle-même.

Plus besoin de Application.ScreenUpdating ni autre gâteries...

Sub Galopin()
Dim Tablo, iR%, i%, Tmp$, Sep$
Sep = ";"
iR = ActiveSheet.Range("D65500").End(xlUp).Row  'Détermine la dernière ligne
Tablo = ActiveSheet.Range("A1:D" & iR)          'Mémorise le tout dans un tablo
Open "NomFich.csv" For Output As #1
For i = 1 To iR
  If Tablo(i, 4) > 0 Then                       'recopie uniquement les lignes du tablo > 0
  Tmp = ""
  For k = 1 To 4
  Tmp = Tmp & CStr(Tablo(i, k)) & Sep
  Next
  End If
Print #1, Tmp
Next
Close
End Sub

Tu me dis !

A+

Bonjour Galopin,

Effectivement c'est très rapide mais cela m'exporte les lignes vides...

"Application.ScreenUpdating = False" me convient et c'est pas long

Une dernière chose je voudrais que la macro fasse une vérification que le total qu'elle exporte,

le total de la colonne D, corresponde au total de la feuille d'origine stocké en K13 de la feuille Export

Bien sûr que ca bloque s'il y a une différence !

(j'ai peur qu'on oublie quelque chose si par la suite on rajoute des lignes)

Mais pas grave si t'as pas la solution

Merci pour ta peine

... cela m'exporte les lignes vides...

C'est très étonnant avec la dernière macro que je t'ai donné : J'ai pris pour modèle le fichier que tu as mis dans l'autre topic et je n'ai aucune ligne vide dans mon .csv.Il est probable que tu as fais quelque erreur dans ton bricolage.

Inutile de faire un contrôle qui ralentirai le processus pour rien...

Si tu n'as pas modifié ma maacro notamment ici :

iR = ActiveSheet.Range("D65500").End(xlUp).Row

il n'y a pas de raison que ça ne marche pas !

Sinon tu me passes le fichier qui ne fonctionne pas bien avec Ta macro sur cjoint ou en e-mail et je te dis quoi.[img]A+

Vraiment sympa !

Je t'envoie ca

La macro corrigée :

Sub Galopin()
Dim Tablo, iR%, i%, Tmp$, Sep$
With Sheets("Export")                    'On travaille directement sur la feuille export

    Sep = ";"
    iR = .Range("D65500").End(xlUp).Row  'Détermine la dernière ligne
    Tablo = .Range("A1:D" & iR)          'Mémorise le tout dans un tableau
    Open "C:\1\Tarif.csv" For Output As #1
    For i = 1 To iR
      If Tablo(i, 4) <> "" Then          'Recopie uniquement les lignes du tableau <> ""
     Tmp = ""
      For k = 1 To 4
      Tmp = Tmp & CStr(Tablo(i, k)) & Sep
      Next
      End If
    Print #1, Tmp
    Next
    DoEvents
    MsgBox "C'est fini !"
    Close #1

End With

    ' Sauvegarde en Excel
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:="C:\1\Tarifs 2011.xlsm", _
    FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
    Application.DisplayAlerts = True
End Sub

Cette macro travaille directement sur la feuille d'origine (cachée) sans Export ni Copier/Coller et elle est instantanée. (On peut supprimer le MsgBox...)

A+

PS : Ne pas oublier de marquer le sujet "résolu"

Bonjour,

Je suis nouvel inscrit sur ce forum qu'il m'arrive de parcourir épisodiquement pour trouver une réponse à mes "problèmes" de macro car je suis une vraie quiche en la matière.

Je me suis inspiré de la macro ci-avant pour l'adapter à mes besoins.

Tout fonctionne... sauf que le fichier .csv qui est créé me reprend ma ligne de titre et ensuite il me duplique la seconde ligne une centaine de fois

Je n'ai besoin que des colonnes R à Y sans les lignes vides dans le fichier .csv qui est créé.

Dans ce cas-ci, il devrait y avoir 28 lignes dans le fichier .csv (y compris la ligne de titre).

Sub ODCONG()
    Dim Tablot, iR%, i%, Tmp$, Sep$
    With Sheets("OD_SAL")                    'On travaille directement sur la feuille export
    Sep = ";"
    iR = .Range("R65000").End(xlUp).Row  'Détermine la dernière ligne
    Tablot = .Range("R1:Z" & iR)          'Mémorise le tout dans un tableau
    Open "ODCONG.csv" For Output As #1
    For i = 1 To iR
      If Tablot(i, 9) <> "" Then          'Recopie uniquement les lignes du tableau <> ""
    Tmp = ""
      For k = 1 To 9
      Tmp = Tmp & CStr(Tablot(i, k)) & Sep
      Next
    End If
    Print #1, Tmp
    Next
    Close #1
End With
MsgBox "ODCONG EN .csv > OK !", vbInformation + vbOKOnly, "EXPORT DONNEES ODCONG"
End Sub

Je joints une copie du fichier.

Si quelqu'un peut m'aider, je lui en serait reconnaissant.

38odcong.xlsm (44.78 Ko)

Hum...

Je ne comprend pas trop comment tu vas pêcher 28 lignes dans la mesure ou dans la colonne 9 (Z) il n'y a que 2 cellules <>""

mais comme tu parles aussi de Y c'est peut-être le 9 qui cloche ?

Attention aussi à la position du Print...

Sub ODCONG()
    Dim Tablot, iR%, i%, Tmp$, Sep$
    With Sheets("OD_SAL")                    'On travaille directement sur la feuille export
    Sep = ";"
    iR = .Range("R65000").End(xlUp).Row  'Détermine la dernière ligne
    Tablot = .Range("R1:Z" & iR)          'Mémorise le tout dans un tableau
    Open "ODCONG.csv" For Output As #1
    For i = 1 To iR
      If Tablot(i, 8) <> "" Then          'Recopie uniquement les lignes du tableau <> ""
    Tmp = ""
      For k = 1 To 8
      Tmp = Tmp & CStr(Tablot(i, k)) & Sep
      Next
          Print #1, Tmp
    End If
    Next
    Close #1
End With
MsgBox "ODCONG EN .csv > OK !", vbInformation + vbOKOnly, "EXPORT DONNEES ODCONG"
End Sub

A+

Merci galopin01 !

Cela fonctionne parfaitement et le fichier .csv qui est créé contient bien 28 lignes au total y compris la ligne de titre.

Par contre, j'ai voulu ajouter la colonne Z qui ne contient qu'une seule donnée pour le moment "test123".

J'ai modifié la macro comme ceci en incluant la colonne 9 (Z).

Mais le fichier .csv qui est crée ne contient qu'une seule ligne.

Je ne comprends pas très bien la subtilité

Sub ODCONG()
        Dim Tablot, iR%, i%, Tmp$, Sep$
        With Sheets("OD_SAL")                    'On travaille directement sur la feuille export
       Sep = ";"
        iR = .Range("R65000").End(xlUp).Row  'Détermine la dernière ligne
       Tablot = .Range("R1:Z" & iR)          'Mémorise le tout dans un tableau
       Open "ODCONG.csv" For Output As #1
        For i = 1 To iR
          If Tablot(i, 9) <> "" Then          'Recopie uniquement les lignes du tableau <> ""
       Tmp = ""
          For k = 1 To 9
          Tmp = Tmp & CStr(Tablot(i, k)) & Sep
          Next
              Print #1, Tmp
        End If
        Next
        Close #1
    End With
    MsgBox "ODCONG EN .csv > OK !", vbInformation + vbOKOnly, "EXPORT DONNEES ODCONG"
    End Sub

Je joints le fichier modifié avec la macro ci-avant.

Merci encore de ton aide !

31odcong-1.xlsm (45.58 Ko)

Tu as fait le commentaire toi-même :

'Recopie uniquement les lignes du tableau ou la colonne 9 est <> ""

Si tu veux recopier toutes les lignes du tableau ou la colonne 8 est <> ""

C'est :

Sub ODCONG()
        Dim Tablot, iR%, i%, Tmp$, Sep$
        With Sheets("OD_SAL")                    'On travaille directement sur la feuille export
       Sep = ";"
        iR = .Range("R65000").End(xlUp).Row  'Détermine la dernière ligne
       Tablot = .Range("R1:Z" & iR)          'Mémorise le tout dans un tableau
       Open "ODCONG.csv" For Output As #1
        For i = 1 To iR
          If Tablot(i, 8) <> "" Then          'Recopie uniquement les lignes du tableau <> ""
       Tmp = ""
          For k = 1 To 9
'... le reste sans changement

A+

Ok, j'ai compris cette fois !

Au final, j'ai décidé d'utiliser ma première colonne (R) pour vérifier si les lignes du tableau sont <> de "".

Et je ne prends que 5 colonnes (De R à V) même si le .Range de Tablot va de R1 à Z.

Ma macro devient donc:

Sub ODCONG()
        Dim Tablot, iR%, i%, Tmp$, Sep$
        With Sheets("OD_SAL")                    'On travaille directement sur la feuille export
      Sep = ";"
        iR = .Range("R65000").End(xlUp).Row  'Détermine la dernière ligne
      Tablot = .Range("R1:Z" & iR)          'Mémorise le tout dans un tableau
      Open "ODCONG.csv" For Output As #1
        For i = 1 To iR
          If Tablot(i, 1) <> "" Then          'Recopie uniquement les lignes du tableau <> ""
      Tmp = ""
          For k = 1 To 5
          Tmp = Tmp & CStr(Tablot(i, k)) & Sep
          Next
              Print #1, Tmp
        End If
        Next
        Close #1
    End With
    MsgBox "ODCONG EN .csv > OK !", vbInformation + vbOKOnly, "EXPORT DONNEES ODCONG"
    End Sub

Merci pour ton aide précieuse.

Bonjour,

Je ré-ouvre ce sujet....

Voici ma macro par contre je veux que la macro fasse un "enregistrer sous" et que je puisse donner un nom différent à mon fichier csv à chaque fois !

Est-ce que vous avez une idée ? Merci pour votre aide.

Sub CSV()

Dim Tablot, iR%, i%, Tmp$, Sep$

With Sheets("SAISIECOGNARD") 'On travaille directement sur la feuille export

Sep = ";"

iR = .Range("A65000").End(xlUp).Row 'Détermine la dernière ligne

Tablot = .Range("A1:AP" & iR) 'Mémorise le tout dans un tableau

Open "COGNARD.csv" For Output As #1

For i = 1 To iR

If Tablot(i, 40) <> "" Then 'Recopie uniquement les lignes du tableau <> ""

Tmp = ""

For k = 1 To 40

Tmp = Tmp & CStr(Tablot(i, k)) & Sep

Next

Print #1, Tmp

End If

Next

Close #1

End With

MsgBox "COGNARD.csv > OK !", vbInformation + vbOKOnly, "EXPORT DONNEES COGNARD"

End Sub

Bonjour,

Je me permet d'ajouter une demande à ce sujet qui me semble compliqué (du moins pour moi) avec Excel.

Je souhaite enregistrer une liste d'adresse email en .csv séparateur ";" à l'aide d'une macro afin de la copier ensuite telle quelle dans un email.

J'ai trouvé sur le forum la macro suivante sur fonctionne bien sur une largeur de plage définie "A:AK"mais mon problème est que ma liste se trouve sur une seule ligne et que le nombre de colonne à reprendre sur cette ligne sera variable.

Sub Test

Dim Plage As Object, oL As Object, oC As Object, Tmp$, Sep$

Sep = ";"

Set Plage = ActiveSheet.Range("A1:AK" & ActiveSheet.Range("A65500").End(xlUp).Row)

Open "NomFich.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

Comment peut on adapter la sélection de la plage pour que la macro fonctionne avec une seule ligne dont la longueur à prendre en compte est variable ?

J'ai essayer de mettre la liste sur une seule colonne mais l'enregistrement en .csv insère un retour à la ligne après chaque cellule ce qui empêche la recopie correcte dans un email.

Je vous remercie d'avance pour votre aide.

Bien cordialement.

Rechercher des sujets similaires à "enregistrer format csv macro"