Macro enregistrement csv

  • Initiateur de la discussion Tinet
  • Date de début
T

Tinet

Guest
Bonjour à tous ceux qui liront.
Quel serait le code pour réaliser une macro associée à un bouton de barre d’outil suivants les éléments ci-après :
Origine le fichier est un .TXT avec des séparateurs ouvert sous Excel en convertissant celui-ci pour formater les colonnes.
Après avoir traiter le fichier (toujours sous sa forme TXT), macro pour : enregistrer sous format CSV avec le même nom de fichier (il faut récupérer ce nom) dans un dossier C:\Temp et en validant les boites de dialogues qui s’ouvrent (existence fichier : remplacement : oui), (information non compatible en csv : conserver ce format : oui), et fermer ce fichier par «fermer » en répondant Non à enregistrer les modifs de a.csv.
J’ai réalisé cette macro, mais elle s’arrête aux boites de dialogues. J'ai déjà visité le forum, mais il me semble pas avoir la réponse totale.
Merci d'avance.
 
@

@+Thierry

Guest
Salut Tinet, Le Forum

En cherchant un peu pour toi et en repartant d'une démo existante dans ce Forum (voir Lien supprimé, je me rends compte que certains CSV Français ont un Point Virgule comme séparateur alors que CSV signifie : Comma-separated values format (Comma signifie Virgule)

Enfin ce n'est qu'une question de settings...

Cette macro placée dans un module standard d'un classeur "Interface" récupérera les colonnes "A" à "D" d'un fichier TXT ouvert et étant le classeur actif, Elle en fera une copie avec le même nom mais avec l'extension CSV, ceci dans le même répertoire que le fichier TXT.

Il ne devrait y avoir aucune alerte.

Option Explicit

Sub BuildCSV()
Dim Range As Object, Line As Object
Dim TheText As String, TheSep As String, TheFullPath As String
Dim L As Integer
Dim C As Byte

TheSep = Chr(44) 'Séparator Comma ","
'TheSep = Chr(59) 'Séparator Semi-Colon ";" '(Mettre Actif si nécessaire)


TheFullPath = ActiveWorkbook.Path & "\" & Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 3) & "csv"


Set Range = ActiveSheet.Range("A1:D" & ActiveSheet.Range("A65536").End(xlUp).Row)
Open TheFullPath For Output As #1

For Each Line In Range.Rows
L = L + 1
TheText = ""
For C = 1 To 4
If C < 4 Then
TheText = TheText & CStr(Cells(L, C).Text) & TheSep
Else
TheText = TheText & CStr(Cells(L, C).Text)
End If
Next

Print #1, TheText
Next
Close
ActiveWorkbook.Close
End Sub

NB pour augenter le nombre de colonne à traiter (exemple de A à H) faut intervenir comme ceci :

Option Explicit

Sub BuildCSV()
Dim Range As Object, Line As Object
Dim TheText As String, TheSep As String, TheFullPath As String
Dim TheFile As Variant
Dim L As Integer
Dim C As Byte

TheSep = Chr(44) 'Séparator Comma ","
'TheSep = Chr(59) 'Séparator Semi-Colon ";"


TheFullPath = ActiveWorkbook.Path & "\" & Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 3) & "csv"


Set Range = ActiveSheet.Range("A1:H" & ActiveSheet.Range("A65536").End(xlUp).Row)
Open TheFullPath For Output As #1

For Each Line In Range.Rows
L = L + 1
TheText = ""
For C = 1 To 8
If C < 8 Then
TheText = TheText & CStr(Cells(L, C).Text) & TheSep
Else
TheText = TheText & CStr(Cells(L, C).Text)
End If
Next

Print #1, TheText
Next
Close
ActiveWorkbook.Close 0
End Sub

Voilà je pense que ce sera une base de départ, à noter que je ne m'occupe pas du TXT d'orgine et qu'il est fermé sans être sauvé.

Bonne Fin de Journée
@+Thierry
 
T

Tinet

Guest
Merci pour aide si rapide.

Par contre, j'ai un problème de syntaxe et donc de compilation dans cette écriture:

TheFullPath = ActiveWorkbook.Path & "\" & Left(ActiveWorkbook.Name,
Len(ActiveWorkbook.Name) - 3) & "csv"

Vois-tu pourquoi ?
@ +
 
@

@+Thierry

Guest
Bonsoir Tinet, le Forum

Ne t'inquiète pas je n'ai pas cherché je viens de lire tes deux posts en même temps !

Oui il faut faire attention en copiant les code depuis le client mail, il vaut mieux les copier dans le Forum, là il n'y a pas de Vbcrlf intempestif !

BOn alors super si tout est OK !

Bonne Nuit
@+Thierry
 
T

Tinet

Guest
Salut Thierry.

J'ai encore un petit problème sur l'enregistrement en csv, je me retrouve qu'à chaque fin de ligne j'ai mon séparateur qui se rajoute. (le nombre de colonne étant inférieur au nombre de boucle).
Ne connaissant pas à l'ouverture de mon fichier .txt le nombre de colonne qui s'afficheront, il faudrait que la macro test la première ligne pour connaitre le nombre de colonne et faire ainsi arréter la boucle avant la dernière colonne.
J'ai regardé les différents moyens de tester une cellule vide, mais étant vraiment novice, je n'y arrive pas.
Peut-tu me dépanner sur ce point en ajoutant ce qu'il faut à mon code actuel (ci-joint).
@+
 

Pièces jointes

  • Sub_EnregCSV.zip
    2.4 KB · Affichages: 24
@

@+Thierry

Guest
Salut Tinet, le Forum

Je n'ai pas le droit de télécharger quoique ce soit depuis la Station où je me trouve en ce moment...

Cependant pour trouver la dernière colonne remplie on pourrait faire un truc dans ce genre (à integrer en début de Macro) :

Dim TheCol As Byte
TheCol = ActiveSheet.Range("IV1").End(xlToLeft).Column

Puis dans mon code si dessus changer :
For C = 1 To 8
If C < 8 Then

Par :
For C = 1 To TheCol
If C < TheCol Then

Ce devrait passer, pour autant que la Ligne 1 soit représentative de la forme globale du tableau et du nombre de Colonnes, puisque c'est elle qui va générer "TheCol" ...

Bon Après Midi
@+Thierry
 

Discussions similaires

Statistiques des forums

Discussions
312 652
Messages
2 090 539
Membres
104 572
dernier inscrit
saumech