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 SubDans 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 SubTu 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 SubCette 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 SubJe joints une copie du fichier.
Si quelqu'un peut m'aider, je lui en serait reconnaissant.
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 SubA+
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 SubJe joints le fichier modifié avec la macro ci-avant.
Merci encore de ton aide !
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 changementA+
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 SubMerci 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.