[VBA] Correction code / Enregistrement de plusieurs fichiers csv

Salut,

J'ai créé une macro qui reprend les données de mesures d'un fichier source (xlsx) et créé ensuite plusieurs fichiers (csv) en fonction du nombre de mesures présentes à l'intérieur.

J'ai réussi à faire ce que je voulais, même si le code doit pas être bien joli car j'ai repris pas mal de "morceaux" de code que j'ai ensuite bidouillé pour arriver à mes fins

Toutefois il reste une dernière chose que je n'arrive pas à faire fonctionner: l'enregistrement en .csv de chaque fichier qui doit être avec le séparateur ";".
Je sais que la syntaxe est bonne mais je pense que mon enregistrement est mal placé dans le code, toutefois après de multiples essais, je suis perdu et à cours de solutions.

Je viens donc vers vous pour savoir si une bonne âme pouvait jeter un œil au code et faire fonctionner cet enregistrement de fichiers.

En pièce jointe le fichier avec la macro et le fichier source.

Il faut juste que vous créé les 2 dossiers "Fichiers à convertir" et "Fichiers convertis" et que vous remplaciez les chemins.

Merci d'avance !

142d-to-lug.xlsm (31.75 Ko)
14ag-101-test-2d.xlsx (17.59 Ko)

Bonjour Pa39, le forum,

C'est Workbooks.Add qui pose problème. Il faut soit supprimer cette ligne ou la mettre en commentaire pour les tests.

Dès lors, les séparateurs sont bien le ; .

For j = 0 To lastlign - 118
'''                Workbooks.Add  --- Ligne à désactiver ou supprimer
                ActiveWorkbook.SaveAs Filename:=Destfich & Nomfich & "_00" & j + 1 & ".csv", Local:=True, FileFormat:=xlCSV, CreateBackup:=False
                'ActiveWorkbook.Close SaveChanges:=False
                Sheets(1).Name = ws.Name
                Set ns = Sheets(1)

Bastr

Tu as raison, Workbooks.Add semble poser problème.
Le truc, c'est que j'en ai besoin.

Dans ma procédure je :

  1. ouvre le fichier source
  2. créer un nouveau workbook
  3. sauvegarde ce nouveau workbook en .csv (vierge)
  4. copie les données qui m'intéresse du fichier source vers ce workbook
  5. enregistre et ferme le nouveau workbook

Et ce, dans une boucle qui créé donc plusieurs fichiers en fonction du nombre de mesures présentes.

Si j'enlève Workbooks.Add alors ca copie/colle dans la feuille du fichier source et ca donne n'importe quoi à la fin

Bonjour Pa39, le forum,

Je n'ai pas trouvé de solution pour les points-virgules dans les fichiers .CSV.

Tout en cherchant, j'ai remarqué qu'une donnée est écrite en colonne L, puis cette donnée est écrasée par une formule.

'on colle les tableaux remplis
        ns.Range("B11").Resize(UBound(tablo_DIM_v, 1), 1) = tablo_DIM_v
        ns.Range("G11").Resize(UBound(tablo_NOM_v, 1), 1) = tablo_NOM_v
        ns.Range("J11").Resize(UBound(tablo_TOLN_v, 1), 1) = tablo_TOLN_v
        ns.Range("I11").Resize(UBound(tablo_TOLP_v, 1), 1) = tablo_TOLP_v
        ns.Range("H11").Resize(UBound(tablo_MESU_v, 1), 1) = tablo_MESU_v
        ns.Range("L11").Resize(UBound(tablo_DEV_v, 1), 1) = tablo_DEV_v  ' <<< donnée écrite en colonne L

'on calcul DEV et HORSTOL
        ns.Range("L12").Formula = "=H12-G12"    ' <<< donnée écrasée par la formule
        ns.Range("M12").FormulaLocal = "=SI(H12<(G12+J12);H12-(G12+J12);SI(H12>(G12+I12);H12-(G12+I12);0))"
        

Je continue mes recherches sur le point-virgule.

Bastr

Bonjour Pa39, le forum,

Enfin, ça fonctionne.

Essentiellement, c'est bloc, juste avant le Next, qui fait la différence.

Application.DisplayAlerts = False
Workbooks(FichierCSV).Activate
Workbooks(FichierCSV).SaveAs Filename:=Destfich & Nomfich & "_00" & j + 1 & ".csv", FileFormat:=xlCSV, CreateBackup:=False, Local:=True
Workbooks(FichierCSV).Close
Application.DisplayAlerts = False

bastr

Mais c'est nickel tout ca !

Pour les données écrites puis effacées oui c'est normal je suis pas à l'aise avec les tableaux donc dans un 1er temps j'ai préféré faire comme çà, tout coller et remplacer les quelques lignes après, mais il va falloir que j'épure un peu tout ca en effet.

Je voulais déjà que tout fonctionne pour passer en mode "affinage" du code et ensuite ajouter quelques petites conditions, je vois d'ailleurs que tu l'as tout ranger comme il faut .

En tout cas merci, tu m'enlève une bonne épine du pied !

D'ailleurs si tu as le temps, tu as gagné une question bonus :

Comme tu peux le voir j'inscris juste quelque chose en A1 avec cette ligne:

ns.Range("A1") = "X" '(pas trouvé mieux pour que la 1ere ligne et colonne restent vides...)

ceci car il faut impérativement que mes données commencent en B11, et sans cette ligne de code toutes les cellules vides sont supprimées lors de la génération du csv et je me retrouve avec les données qui débutent en A1...

Tu aurais une solution pour ca ?

Merci.

Bonjour Pa39, le forum,

Je regarde cela et te reviens dès que possible.

Bastr

Bonjour Pa39, le forum,

Ça fonctionne.

J'ai déplacé deux variables au haut du module afin que ces deux variables passent leur valeur dans n'importe quelle procédure (macro) du module.

J'ai utilisé le caractère ® caractère ASCII (Alt+169) au lieu du "X" afin d'être sûr que ce caractère sera unique dans les fichiers CSV.

Après avoir créé et fermé le fichier CSV, je déroute temporairement le traitement vers une procédure Call RemplaceLeCaractere (voir au bas du module) pour supprimer ce caractère spécial.

Le code utilisé provient de Banzai64 https://forum.excel-pratique.com/excel/remplacer-chaine-de-caracteres-dans-un-fichier-texte-40786#p2...

S'il y a autre chose, n'hésite pas.



bastr

Bien joué !

Je pense que j'aurais cherché un moment .

Tout fonctionne parfaitement, je clos le sujet.

Merci encore.

Rechercher des sujets similaires à "vba correction code enregistrement fichiers csv"