Enregistrer un fichier en .CSV
Bonjour les Exceliens.
J'ai besoin d'enregistrer un feuille de mon excel en .CSV (point-virgule), en ajoutant deux champs variables qui existent dans une autre feuille dans le nom du fichier avec la date du jour et heure génération. Comme suit:
enregistrer sur C:\mon espace disque\"champ1"_"champ2"_date du jour_heure.csv
j'ai trouvé pas mal de réponses sur le forum mais comme je ne suis pas adepte du VBA, je n'ai pas pu les adapter à mon besoin.
Je vous remercie d'avance pour votre retour.
@+
Bonjour,
De cette façon :
Dim Fichier As String
Fichier = "C:\mon espace disque\" & champ1 & "_" & champ2 & "_" & Now & ".csv"
Merci pour votre réponse.
Mais ca ne marche pas j'ai renseigner ton code en MACRO comme ca
Dim TEMPLATE FB01 As String
TEMPLATE FB01 = "C:\mon espace disque\" & A remplir'!B3 & "_" & A remplir'!B4 & "_" & Now & ".csv"
j'ai remplacer le fichier par le nom de ma feuille et j'ai mis le nom des champs ... mais ca me dit qu'il existe un erreur de syntaxe et ca bug.
Merci
Bonjour,
Attention, une variable ne peut pas contenir d'espace et certains caractères interdits ! Donc, c'est TEMPLATEFB01 ou TEMPLATE_FB01.
Sub Test()
Dim TEMPLATEFB01 As String
With Worksheets("A remplir")
TEMPLATEFB01 = "C:\mon espace disque\" & .Range("B3").Value & "_" & .Range("B4").Value & "_" & Now & ".csv"
End With
MsgBox TEMPLATEFB01
End Sub
Merci Theze pour tes explications.
Il me dit bien que mon fichier a été enregistré sous ce que je veux, mais je ne trouve rien sur c:\mon espace disque !!!!
De tant plus si c'est possible j'aimerai afficher un message pour dire que " le template YFI002 a été enregistré sous c:\ .... "
MAJ: quand j'enregistre la feuille manuellement en .CSV je remarque que les lignes vides ont été traités avec des " ; " car apparemment les formules sont vue comme non vide. or moi je veux seulement extraire les lignes remplies.
ps: ma feuille est la résultante des données saisies sur une autre feuille à travers des formules.
Merci pour votre retour.
hichem
Re,
MAJ: quand j'enregistre la feuille manuellement en .CSV je remarque que les lignes vides ont été traités avec des " ; " car apparemment les formules sont vue comme non vide. or moi je veux seulement extraire les lignes remplies
un fichier .csv est un fichier tabulé donc, pour qu'il y est une cohérence, les cellules vides sont malgré tout séparées par le séparateur utilisés (virgule, point-virgule, tabulation, etc...) ceci est donc normal !
Postes un fichier exemple afin que je puisse faire des tests !
Re,
ci joint mon fichier, merci de vérifier comment exporter ma feuille Template_FB01 en .CSV mais sans les lignes vides. et que je trouve bien mon fichier dans mon dossier que j'ai rempli dans la macro que je ne trouve rien quand je clique sur le bouton enregistrer.
Merci c'est très gentil de votre part.
Bonjour,
Ta feuille contient des formules jusqu'à la ligne 999 donc, c'est normal que tu est toutes ces lignes dans le .csv !
Comme il est difficile de supprimer ces ligne après enregistrement (car il devient le classeur actif) on va tout simplement le créer de toutes pièces (le fichier .csv). Les commentaires dans le code devraient te permettre de comprendre comment il fonctionne. Code à mettre dans le module standard et attacher à ton bouton "Enregistrer" (supprimer le code existant bien sûr !). Quand tu donne un nom à un fichier, il y a des caractères interdits comme / : <> etc... J'ai donc remplacé ces caractères et pour séparer la date de l'heure, trois points, adaptes si ça ne te convient pas :
Sub enregistrement()
Dim Fe As Worksheet
Dim Plage As Range
Dim Cel As Range
Dim Tbl() As String
Dim Ligne As String
Dim Dossier As String
Dim TEMPLATEFB01 As String
Dim I As Long
Dim J As Long
Dossier = "C:\mon espace disque\"
With Worksheets("A_remplir")
TEMPLATEFB01 = Dossier & _
Replace(.Range("B3").Value, "/", "-") & "_" & _
.Range("B4").Value & "_" & _
Format(Now, "dd-mm-yyyy...hh-mm-ss") & ".csv"
End With
'gèle l'affichage
Application.ScreenUpdating = False
'copie la feuille afin de préserver l'originale
Worksheets("TEMPLATE_FB01").Copy , Sheets(Sheets.Count)
'utilise une variable
Set Fe = Worksheets(Sheets.Count)
'défini la plage sur toute la feuille
Set Plage = DefPlage(Fe, 1, 1)
'supprime les formules
Plage.Value = Plage.Value
'redéfini la plage sur les valeurs en "dur"
Set Plage = DefPlage(Fe, 1, 1)
'crée les lignes pour les enregistrements tabulés avec comme séparateur le ;
For I = 1 To Plage.Rows.Count
For J = 1 To Plage.Columns.Count
Ligne = Ligne & Plage(I, J).Value & ";"
Next J
'supprime le ; de fin
Ligne = Left(Ligne, Len(Ligne) - 1)
'stocke dans un tableau
ReDim Preserve Tbl(1 To I)
Tbl(I) = Ligne
'pour la suivante
Ligne = ""
Next I
'création du fichier .csv
Open TEMPLATEFB01 For Output As #1
For I = 1 To UBound(Tbl)
Print #1, Tbl(I)
Next I
Close #1
'suspension du message d'alerte
Application.DisplayAlerts = False
Fe.Delete 'suppression de la feuille
ThisWorkbook.Save 'enregistre
Application.DisplayAlerts = True
'réactive la feuille
Worksheets("A_remplir").Activate
'rétabli
Application.ScreenUpdating = True
End Sub
Function DefPlage(Fe As Worksheet, L As Long, C As Long) As Range
On Error GoTo Fin
With Fe
Set DefPlage = .Range(.Cells(L, C), _
.Cells(.Cells.Find("*", .[A1], -4123, , _
1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
2, 2).Column))
End With
Exit Function
Fin:
Set DefPlage = Nothing
End Function
Bonjour,
c'est très gentil, c'est ce que je voulais ca marche impec. par contre je souhaiterai avoir un message d'information lors de l'enregistrement pour dire que " le fichier template a été bien enregistré en .CSV sur C:\mon espace disque"
Merci.
Re,
Regardes si ça te convient :
Sub enregistrement()
Dim Fe As Worksheet
Dim Plage As Range
Dim Cel As Range
Dim Tbl() As String
Dim Ligne As String
Dim Dossier As String
Dim TEMPLATEFB01 As String
Dim I As Long
Dim J As Long
Dossier = "C:\mon espace disque\"
With Worksheets("A_remplir")
TEMPLATEFB01 = Dossier & _
Replace(.Range("B3").Value, "/", "-") & "_" & _
.Range("B4").Value & "_" & _
Format(Now, "dd-mm-yyyy...hh-mm-ss") & ".csv"
End With
If MsgBox("Voulez-vous créer le fichier '" & TEMPLATEFB01 & "' ?", vbQuestion + vbYesNo, "Fichier .CSV") = vbNo Then Exit Sub
'gèle l'affichage
Application.ScreenUpdating = False
'copie la feuille afin de préserver l'originale
Worksheets("TEMPLATE_FB01").Copy , Sheets(Sheets.Count)
'utilise une variable
Set Fe = Worksheets(Sheets.Count)
'défini la plage sur toute la feuille
Set Plage = DefPlage(Fe, 1, 1)
'supprime les formules
Plage.Value = Plage.Value
'redéfini la plage sur les valeurs en "dur"
Set Plage = DefPlage(Fe, 1, 1)
'crée les lignes pour les enregistrements tabulés avec comme séparateur le ;
For I = 1 To Plage.Rows.Count
For J = 1 To Plage.Columns.Count
Ligne = Ligne & Plage(I, J).Value & ";"
Next J
'supprime le ; de fin
Ligne = Left(Ligne, Len(Ligne) - 1)
'stocke dans un tableau
ReDim Preserve Tbl(1 To I)
Tbl(I) = Ligne
'pour la suivante
Ligne = ""
Next I
'création du fichier .csv
Open TEMPLATEFB01 For Output As #1
For I = 1 To UBound(Tbl)
Print #1, Tbl(I)
Next I
Close #1
'suspension du message d'alerte
Application.DisplayAlerts = False
Fe.Delete 'suppression de la feuille
ThisWorkbook.Save 'enregistre
Application.DisplayAlerts = True
'réactive la feuille
Worksheets("A_remplir").Activate
'rétabli
Application.ScreenUpdating = True
'vérifie que le fichier est bien sur le disque sinon, message d'erreur
If Dir(TEMPLATEFB01) <> "" Then
'message de confirmation
MsgBox "Le fichier '" & TEMPLATEFB01 & "' a bien été créé et enregistré dans le dossier '" & Dossier & "' !"
Else
MsgBox "Une erreur c'est produite durant la création du fichier .csv !"
End If
End Sub
Merci pour ton aide.
ca marche impec.
Content de t'avoir aidé !
Re,
désolé d'avoir réactiver le sujet encore, mais chaque fois je découvre un truc, donc je profite de ta générosité
Après avoir mis en place le bouton qui enregistre ma feuille en .CSV j'ai remarqué que quand je sécurise ma feuille avec un MDP et que je verrouille et masque mes champs (car je ne veux pas que l'utilisateur fasse une mauvaise manipulation sur le fichier), l'export ne fonctionne pas et se bloque sur la partie ou tu supprime les formules pour les copier dans une autre feuille ici plus précisément :
Donc, soit il existe un moyen pour contourner la sécurité de la feuille, ou trouver un autre moyen pour sécuriser ma feuille sans qu'il abime la macro ?
Merci pour ton retour.
hichem
Et oui, il faut ôter la protection en début de code et la rétablir à la fin de procédure. Regardes si ça peut convenir, une boite de message demande le mot de passe si annulé ou erroné, fin de procédure. C'est bien la feuille "TEMPLATE_FB01" qui est protégée ?
En faisant une copie, la protection est embarquée dans la nouvelle feuille, c'est pour cette raison qu'il faut la dé protéger avant :
Sub enregistrement()
Dim Fe As Worksheet
Dim Plage As Range
Dim Cel As Range
Dim Tbl() As String
Dim Ligne As String
Dim Dossier As String
Dim TEMPLATEFB01 As String
Dim I As Long
Dim J As Long
Dim MdP As String
Dossier = "C:\mon espace disque\"
With Worksheets("A_remplir")
TEMPLATEFB01 = Dossier & _
Replace(.Range("B3").Value, "/", "-") & "_" & _
.Range("B4").Value & "_" & _
Format(Now, "dd-mm-yyyy...hh-mm-ss") & ".csv"
End With
If MsgBox("Voulez-vous créer le fichier '" & TEMPLATEFB01 & "' ?", vbQuestion + vbYesNo, "Fichier .CSV") = vbNo Then Exit Sub
MdP = InputBox("Indiquez le mot de passe !")
If MdP = "" Then
MsgBox "Annulation !", vbExclamation
Exit Sub
End If
'gère le mot de passe erroné
On Error Resume Next
'ôte la protection si le mdp est juste sinon, message et fin !
Worksheets("TEMPLATE_FB01").Unprotect MdP
If Err.Number <> 0 Then
MsgBox "Le mot de passe est erroné !" & vbCrLf & vbCrLf & "Ceci met fin à la procédure !", vbExclamation
Exit Sub
End If
'supprime le gestionnaire (pour voir si une autre erreur peut éventuellement apparaître !)
On Error GoTo 0
'gèle l'affichage
Application.ScreenUpdating = False
'copie la feuille afin de préserver l'originale
Worksheets("TEMPLATE_FB01").Copy , Sheets(Sheets.Count)
'utilise une variable
Set Fe = Worksheets(Sheets.Count)
'défini la plage sur toute la feuille
Set Plage = DefPlage(Fe, 1, 1)
'supprime les formules
Plage.Value = Plage.Value
'redéfini la plage sur les valeurs en "dur"
Set Plage = DefPlage(Fe, 1, 1)
'crée les lignes pour les enregistrements tabulés avec comme séparateur le ;
For I = 1 To Plage.Rows.Count
For J = 1 To Plage.Columns.Count
Ligne = Ligne & Plage(I, J).Value & ";"
Next J
'supprime le ; de fin
Ligne = Left(Ligne, Len(Ligne) - 1)
'stocke dans un tableau
ReDim Preserve Tbl(1 To I)
Tbl(I) = Ligne
'pour la suivante
Ligne = ""
Next I
'création du fichier .csv
Open TEMPLATEFB01 For Output As #1
For I = 1 To UBound(Tbl): Print #1, Tbl(I): Next I
Close #1
'suspension du message d'alerte
Application.DisplayAlerts = False
Fe.Delete 'suppression de la feuille
ThisWorkbook.Save 'enregistre
Application.DisplayAlerts = True
'réactive la feuille
Worksheets("A_remplir").Activate
'rétabli
Application.ScreenUpdating = True
'vérifie que le fichier est bien sur le disque sinon, message d'erreur
If Dir(TEMPLATEFB01) <> "" Then
'message de confirmation
MsgBox "Le fichier '" & TEMPLATEFB01 & "' a bien été créé et enregistré dans le dossier '" & Dossier & "' !", vbInformation
Else
MsgBox "Une erreur c'est produite durant la création du fichier .csv !", vbExclamation
End If
'protège à nouveau
Worksheets("TEMPLATE_FB01").Protect MdP
End Sub
Re,
Aufait c'est l'utilisateur qui va générer le fichier .Csv et il n'est pas censé connaître le mot de passe.
Donc je dois trouver une solution sans saisir le mot de passe.
Ou sinon si tu as une autre idée je suis partant.
Merci
Bonjour,
il y a plusieurs solutions, comme la base de registre, un nom invisible dans le classeur, etc...
Pour l'exemple, le mot de passe est en "dur" dans le code stocké dans une constante, à adapter !
Il te faut protéger ton projet VBA car le mot de passe est visible :
'il te faut protéger (si on peut dire, cest facile à casser !) ton projet VB --> "Outils" --> "Propriété de VBAProject..." --> onglet "Protection"
Sub enregistrement()
Dim Fe As Worksheet
Dim Plage As Range
Dim Cel As Range
Dim Tbl() As String
Dim Ligne As String
Dim Dossier As String
Dim TEMPLATEFB01 As String
Dim I As Long
Dim J As Long
Const MdP As String = "MotDePasse" '<--- adapter le mot de passe !
Dossier = "C:\mon espace disque\"
With Worksheets("A_remplir")
TEMPLATEFB01 = Dossier & _
Replace(.Range("B3").Value, "/", "-") & "_" & _
.Range("B4").Value & "_" & _
Format(Now, "dd-mm-yyyy...hh-mm-ss") & ".csv"
End With
If MsgBox("Voulez-vous créer le fichier '" & TEMPLATEFB01 & "' ?", vbQuestion + vbYesNo, "Fichier .CSV") = vbNo Then Exit Sub
'ôte la protection si le mdp est juste sinon, message et fin !
Worksheets("TEMPLATE_FB01").Unprotect MdP
'gèle l'affichage
Application.ScreenUpdating = False
'copie la feuille afin de préserver l'originale
Worksheets("TEMPLATE_FB01").Copy , Sheets(Sheets.Count)
'utilise une variable
Set Fe = Worksheets(Sheets.Count)
'défini la plage sur toute la feuille
Set Plage = DefPlage(Fe, 1, 1)
'supprime les formules
Plage.Value = Plage.Value
'redéfini la plage sur les valeurs en "dur"
Set Plage = DefPlage(Fe, 1, 1)
'crée les lignes pour les enregistrements tabulés avec comme séparateur le ;
For I = 1 To Plage.Rows.Count
For J = 1 To Plage.Columns.Count
Ligne = Ligne & Plage(I, J).Value & ";"
Next J
'supprime le ; de fin
Ligne = Left(Ligne, Len(Ligne) - 1)
'stocke dans un tableau
ReDim Preserve Tbl(1 To I)
Tbl(I) = Ligne
'pour la suivante
Ligne = ""
Next I
'création du fichier .csv
Open TEMPLATEFB01 For Output As #1
For I = 1 To UBound(Tbl): Print #1, Tbl(I): Next I
Close #1
'suspension du message d'alerte
Application.DisplayAlerts = False
Fe.Delete 'suppression de la feuille
ThisWorkbook.Save 'enregistre
Application.DisplayAlerts = True
'réactive la feuille
Worksheets("A_remplir").Activate
'rétabli
Application.ScreenUpdating = True
'vérifie que le fichier est bien sur le disque sinon, message d'erreur
If Dir(TEMPLATEFB01) <> "" Then
'message de confirmation
MsgBox "Le fichier '" & TEMPLATEFB01 & "' a bien été créé et enregistré dans le dossier '" & Dossier & "' !", vbInformation
Else
MsgBox "Une erreur c'est produite durant la création du fichier .csv !", vbExclamation
End If
'protège à nouveau
Worksheets("TEMPLATE_FB01").Protect MdP
End Sub
Encore une fois tu nous épates avec ton expertise !!
Merci.
désoler je me suis tromper de topic du coups je laisse ce petit message car je ne sais pas comment le supprimer