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.

174template-web.xlsm (763.42 Ko)

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 :

erreur

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

Rechercher des sujets similaires à "enregistrer fichier csv"