IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Enregistrement CSV avec encodage UTF 8 [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Femme Profil pro
    Chargée de missions
    Inscrit en
    Janvier 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargée de missions

    Informations forums :
    Inscription : Janvier 2016
    Messages : 73
    Points : 58
    Points
    58
    Par défaut Enregistrement CSV avec encodage UTF 8
    Bonjour à tou(te)s,

    Nouveau sujet, nouvelle prise de tête.

    J'ai pour ambition de créer une application Excel qui permet d'enregistrer directement des documents au format CSV, encodage UTF-8.

    Processus :
    - A l'aide d'un combobox dynamique, je sors la liste des classeurs Excel ouverts.
    - Je sélectionne le classeur à convertir
    - Je sélectionne le type de séparateur (virgule ou point-virgule)
    - Je lance l'enregistrement : le fichier est enregistré à l'emplacement voulu par l'utilisateur et sous le nom voulu.

    Mon problème (et contrainte interne) étant la gestion des caractères spéciaux et des accents. Je dois donc intégrer à mon code actuel quelque chose permettant l’encodage en UTF-8 de mon document CSV fraîchement créé. J'y suis depuis ce matin et je commence à n’emmêler les pinceaux.

    Dans un premier temps, est-il possible d’encoder des CSV avec séparateur virgule ? Sur les exemples que j’ai vu, il n’était question que du séparateur point-virgule.

    Ensuite, seconde question : Comment encoder convenablement un fichier CSV avec UTF 8 par VBA ? La partie actuelle concernant l'encodage ne semble pas fonctionner puisque quand j'ouvre le CSV final (en faisant Données > Fichier Texte, en sélectionnant "Encodage Unicode : UTF 8), les accents laissent place à un losange noir.

    Voici le code actuel lorsque le séparateur du CSV choisi est un point-virgule.
    Document.Text correspond au document sélectionné dans la combobox.
    PointVirgule.Value et Virgule.Value sont des checkbox (lorsque =True, la case est cochée)
    TrouveUtilisateur est une fonction qui permet d'aller enregistrer directement dans "Mes documents" (selon l'utilisateur, en allant chercher son ID Windows)
    csvconv.csv c'est le document CSV (sans encodage) qui est créé dans "Mes documents". Il est là pour "faire plusieurs étapes"
    csvconv1.csv c'est le document CSV créé après l'encodage.
    Ces deux documents sont des fichiers "de travail", auquel on ne touche pas... C'est presque sur qu'ils sont créés "pour rien" mais ça me permet d'avoir des points de contrôle en cas de bug.


    Edit : En fait, le problème que je constate est qu'avec l'encodage UTF 8, les accents s'en vont alors qu'avec l'encodage "ANSI", ils restent... C'est pas l'inverse d'habitude ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Dim Lecteur As String, Chemin As String
        Dim Message As String, MonFichier As String
     
        Lecteur = "C:"
        Chemin = Lecteur & "\Documents and Settings\" & TrouveUtilisateur
        Chemin = Chemin & "\Mes Documents\"
     
    If (Pointvirgule.Value = True And Virgule.Value = False And Document.Text <> "") Then
    MsgBox "Vous êtes sur le point d'enregistrer le document " & Fichier & Chr(10) & "au format CSV, séparateur point-virgule"
    Application.DisplayAlerts = False
    Workbooks(Fichier).SaveAs Filename:=Chemin & "csvconv", FileFormat:=xlCSV, CreateBackup:=False, local:=True
    Application.DisplayAlerts = True
     
     
     
     
    'Début encodage UTF 8
     Dim i As Long
        Dim sNomFichierIn As String
        Dim sNomFichierOut As String
        Dim fIn As Integer
        Dim fOut As Integer
        Dim sLigne As String
     
        Dim docfinal As String
     
        ' Préciser les chemins et noms des fichiers è traiter
        sNomFichierIn = Chemin & "csvconv.csv"
        sNomFichierOut = Chemin & "csvconv1.csv"
     
        fIn = FreeFile()
        Open sNomFichierIn For Input As #fIn
     
        fOut = FreeFile()
        Open sNomFichierOut For Binary As #fOut
     
        Do While Not EOF(fIn)
            Line Input #fIn, sLigne
            For i = 1 To Len(sLigne)
                If Mid(sLigne, i, 1) = ";" Then
                    Put #fOut, , AscW(";")
                Else
                    Put #fOut, , AscW(Mid(sLigne, i, 1))
                End If
            Next i
            Put #fOut, , AscW(vbCrLf)
        Loop
        Close #fIn
        Close #fOut
    'Fin encodage UTF 8
     
    'Enregistrement du doc CSV, encodé en UTF 8
    Workbooks("csvconv.csv").Close False
    Application.Workbooks.Open Chemin & "csvconv1.csv"
    Workbooks("csvconv1.csv").SaveAs Filename:=Application.GetSaveAsFilename(fileFilter:="csv Files (*.csv), *.csv"), FileFormat:=xlCSV, CreateBackup:=False
     
    Application.Visible = True
    Application.WindowState = xlMaximized
    Unload Me
    End If

    Je vous remercie par avance de l'aide que vous pourrez m'apporter !
    Bonne soirée

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    perso a prendre un pied de biche pour ouvrir la porte d'un stroump je préfère l'invité a prendre l'apéro dans le jardin
    c'était ma réflexion du jour

    mis a part ca si tu a des soucis de restitution l'ors de l'ouverture de tes CSV shunt la méthode Excel et utilise la méthode open sur des fichiers textes
    les caractères spéciaux ne devraient pas etre transformés
    cet exemple te créé un fichier texte avec la virgule comme séparateur avec la plage utilisé dans le sheet actif et garde tout les caractères particulier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub plage_to_CSV()
        tableau = ActiveSheet.UsedRange.Value 'plage a adapter si précise 
        fichier = "C:\Users\" & Environ("UserName") & "\Desktop\test2.txt"' chemin a adapter 
        x = FreeFile
        Open fichier For Output As #x
        For lig = 1 To 10
            texte = ""
            For col = 1 To 3
                texte = texte & tableau(lig, col) & ","
            Next
            Print #x, texte
        Next
        Close #x
    End Sub
    voila
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, à titre de curiosité voir ceci ( pas testé )

  4. #4
    Membre du Club
    Femme Profil pro
    Chargée de missions
    Inscrit en
    Janvier 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargée de missions

    Informations forums :
    Inscription : Janvier 2016
    Messages : 73
    Points : 58
    Points
    58
    Par défaut
    Bonjour à tous les deux et merci pour vos retours.

    Concernant la proposition de patricktoulon : La proposition me convient. Cependant, j'ai toujours le problème des accents qui s'en vont quand j'ouvre le txt via Données > Fichier Texte (en sélectionnant "Encodage Unicode : UTF 8). Si je passe par NotePad en encodant le fichier en UTF8, les accents sont conservés. Seulement, je ne veux pas que les utilisateurs finaux de l'appli n'aient à faire cette manipulation.

    Concernant la proposition de kiki29 : J'ai transformé le code pour l'adapter à mon environnement de travail et j'ai une erreur de compilation (type défini par l'utilisateur non défini) à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim objStream As ADODB.Stream
    de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function Zone2CSV_UTF8(fichier As String, Onglet As String, Zone As String)
    J'ai bien été voir dans les références VBA et tout semble correct.



    En tout cas, ça m'a permis d'avancer un peu et je vous en remercie

    Edit : je suis tombée sur une discussion d'un autre forum (je sais pas si je peux mettre le lien) et je pense que je suis sur la bonne voie. Je vous tiens au courant dans la journée voire demain des résultats !

  5. #5
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour, bonjour !

    Citation Envoyé par Pix_elle Voir le message
    Enregistrement CSV avec encodage UTF 8
    Une exemple dans cette discussion en modifiant le Charset bien entendu !

    Documentation de l'objet ADODB.Stream disponible sur MSDN …

    Sinon via Enregistrer sous pour le format CSV disponible il suffit dans l'icône Outils de modifier l'encodage …
    Rien qu'en activant l'Enregistreur de macros le code est livré sur un plateau !
    Voir donc la propriété Encoding dans l'aide VBA interne, déjà disponible dans Excel 2003 …

    Voilà, voilà !

    _________________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  6. #6
    Membre du Club
    Femme Profil pro
    Chargée de missions
    Inscrit en
    Janvier 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargée de missions

    Informations forums :
    Inscription : Janvier 2016
    Messages : 73
    Points : 58
    Points
    58
    Par défaut
    Je crois que c'est le plus beau jour de ma vie de """""développeuse""""" en VBA : j'ai réalisé ce que je pensais être une utopie : ça y est, mes CSV s'enregistrent bien avec l'encodage UTF 8.

    J'ai trouvé un code tout fait sur le net (qui ressemblait très fortement à celui proposé par kiki29), j'ai dû repenser le codage VBA de mon fichier (pour en faire quelque chose de beauuuuuucoup plus simple).

    Pour les interessés, voici le code qui me permet d'encoder mon csv en UTF 8 :
    Au passage, j'ai résolu le problème qui se posait avec ADODB.Stream en allant dans Visual Basic > Outils > Références et en sélectionnant "Microsoft ActiveX Data Objects 2.6 Library"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Sub inistream()
     
    'Initialisation du stream unicode
     
        Set objStream = New ADODB.Stream
        objStream.Charset = "utf-8"
        objStream.Mode = adModeReadWrite
        objStream.Type = adTypeText
        objStream.Open
     
    End Sub
     
    Public Function ConvertStringToUtf8Bytes(ByRef strText As String, fin, fic) As Byte()
     
        ' write bytes into stream
     
        objStream.WriteText strText
        objStream.Flush
     
        If fin = 0 Then Exit Function
     
        ' rewind stream and read text
        objStream.Position = 1
        objStream.SaveToFile fic, 2
        objStream.Close
     
    End Function
     
    Sub traitement_lignes_ptvirgule()
    Dim derlig, fin, ligne As Integer
    Dim cellule As Range
    Dim info As String
    Dim fic, tempo As String
     
    fic = Application.GetSaveAsFilename(Nom_Fichier, "CSV Files (*.csv), *.csv")
    If fic = False Then Exit Sub
     
    derlig = Worksheets("Feuil1").Range("A50000").End(xlUp).Row
    inistream
     
    For ligne = 1 To derlig
        info = ""
        For Each cellule In Range("A" & ligne & ":CL" & ligne)
            info = info & cellule.Value & ";"
        Next
        If ligne = derlig Then fin = 1 Else fin = 0
        info = ConvertStringToUtf8Bytes(Left(info, Len(info) - 1) & vbCrLf, fin, fic)
    Next
     
    End Sub

    Merci à tous !
    Maintenant, plus qu'à l'envoyer en test pour faire ressortir de possibles bugs.


    J'ai peut-être juste une dernière question : J'ai crû comprendre que les références Visual Basic sont propres au document. Le problème que j'avais avec ADODB.Stream venait d'une référence non cochée. Maintenant qu'elle est cochée dans le document, il n'y a plus de soucis à se faire pour les futurs utilisateurs de l'outil ?

  7. #7
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    J'ai peut-être juste une dernière question : J'ai crû comprendre que les références Visual Basic sont propres au document. Le problème que j'avais avec ADODB.Stream venait d'une référence non cochée. Maintenant qu'elle est cochée dans le document, il n'y a plus de soucis à se faire pour les futurs utilisateurs de l'outil ?
    En principe, les fichiers pour ADO sont inclus dans Windows depuis longtemps. Au besoin, ils peuvent être téléchargés chez Microsoft.

    Ceci dit, cela ne veut pas dire que le Service de Dictature informatique n'a pas bloqué l'installation...
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonsoir la ""DEVELOPPEUSE""

    je ne vois pas trop ce que la librairie sur le data object viens faire la dedans entre nous

    maintenant pour adob on le déclare en late binding pour se passer de devoir activer la référence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim OBJstream as object
    Set OBJstream = CreateObject("ADODB.Stream")
    voila

    edit
    mille excuse j'ai confondu avec la librairie forms object
    j'ai pris pour habitude de code en late binding je n'ai plus le nom des références en mémoire
    cela dit ca change rien pour l'object
    pour un débutant travailler avec la référence activée lui permet d'avoir l'auto complétion ca aide
    quand on en a l'habitude on déclare en late binding
    ca permet une transportabilité pas besoins d'activer

    je supose que tu a plus ou moins compris le code que tu a ecri
    tu devrait pouvoir maintenant simplifier et même regrouper tes fonctions

    l' object Stream en volatile comme ca c'est pas top
    et dim le en haut de module si ce n'est pas déjà fait
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Membre du Club
    Femme Profil pro
    Chargée de missions
    Inscrit en
    Janvier 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargée de missions

    Informations forums :
    Inscription : Janvier 2016
    Messages : 73
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Patrick, j'essaie tant bien que mal de comprendre le code qui permet l'encodage en UTF-8 et à vrai dire, j'ai pas trop eu le temps de me poser à le comprendre. Je vais m'y pencher plus sérieusement quand j'aurai un peu plus de temps. Pour le moment, ça fonctionne donc "ouf". Mais c'est clair que le jour où il y aura un bug, ça sera plus facile de comprendre le bug en comprenant le code .


    Sinon, ça fonctionne super bien. On m'a "juste" fait remarqué qu'il fallait que l'enregistrement soit en UTF-8 sans bom.

    J'ai été voir la différence du UTF-8 avec bom et sans... Et le truc c'est que le "avec bom", il y a un caractère ajouté en début de fichier... Mais non visible par l'utilisateur (ça serait tellement facile sinon). Alors que le "sans bom" n'en rajoute pas.

    J'ai vu que Access gérait cela parfaitement. Est ce que Excel a aussi cette possibilité ?

    Merci !

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour pix_elle
    tu m'a l'air bien têtu toi

    je ne comprends toujours pas pourquoi tu persiste a vouloir le formater ce csv

    en le faisant avec la méthode open for output les données sont identiques rien n'est modifié !!!!!!!!!!!!!!!!!!!!!!!

    je vais être plus clair !!!!

    vire de ta tète le principe de Excel !!!! sert toi de open for output

    regarde comment j'enregistre une plage en csv et regarde comment j'ouvre ce satané csv

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub plage_to_CSV()
        tableau = ActiveSheet.UsedRange.Value 'plage a adapter si précise
        fichier = "C:\Users\" & Environ("UserName") & "\Desktop\test2.csv" ' chemin a adapter
        x = FreeFile
        Open fichier For Output As #x
        For lig = 1 To 10
            texte = ""
            For col = 1 To 3
                texte = texte & tableau(lig, col) & ","
            Next
            Print #x, texte
        Next
        Close #x
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub ouvre_csv_with_virgule()
    Workbooks.Open ("C:\Users\polux\Desktop\test2.csv"), Format:=2 ' format 2 c'est pour la virgule 
    End Sub
    et arrete de te prendre la tète oh c'est le weekend hein !!!
    va visiter ce lien
    https://msdn.microsoft.com/fr-fr/lib.../ff194819.aspx
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Citation Envoyé par Pix_elle Voir le message
    Est ce que Excel a aussi cette possibilité ?
    As-tu au moins testé Enregistrer sous en ayant modifié l'encodage comme déjà indiqué dans mon post #5 ?!
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour Marc

    pix-elle
    tiens voila un exemple qui pourrais te satisfaire je suis allez un peu plus loin dans ma demo
    il me semble que tu utilise données a partir de

    et bien ceci pourrait être bien une alternative simple


    fonction sauvegarde du plage en csv avec argument (plage , nom du fichier, délimiteur) le délimiteur pouvant être ce que tu veux(,;etc....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function save_plage_to_CSV(plage As Range, fichier, delimit)
        tableau = plage.Value    'plage a adapter si précise
        x = FreeFile
        Open fichier For Output As #x
        For lig = 1 To UBound(tableau)
            texte = ""
            For col = 1 To plage.Columns.Count
                texte = texte & tableau(lig, col) & delimit
            Next
            Print #x, texte
        Next
        Close #x
    End Function
    on l'appelera comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test_sauvegarde()
        Dim plage As Range, fichier As String, delimiteur
        Set plage = ActiveSheet.UsedRange.Cells    ' plage a adapter
        fichier = "C:\Users\" & Environ("UserName") & "\Desktop\test2.csv"    ' chemin a adapter
        delimiteur = ","
        a = save_plage_to_CSV(plage, fichier, delimiteur)
    End Sub

    maintenant je veux ouvrir le csv dans excel se sera simplement ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub ouvre_csv_with_virgule()
    ' j' ouvre le fichier avec workbook.open en precisant le format (2)pour  la virgule comme separateur de cellules
        Workbooks.Open ("C:\Users\polux\Desktop\test2.csv"), Format:=2
    End Sub
    un peu plus poussé
    a supposer que tu ne veuille pas ouvrir le csv mais que tu veuille en récupérer les données pour les placer dans le classeur actif
    un peu a la facon de "utilisation de donées a partir de fichier texte

    je te propose ceci sans les contraintes de querytables

    voila la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Function csv_to_cel(cel, fichier) As String
        Dim laChaine As String, x
        csv_to_cel = "operation de récupération du csv a partir de la cellule " & cel.Address & " a echoué"
        x = FreeFile
        Open fichier For Input As #x: laChaine = Input(LOF(x), #x): Close #x
        tabllig = Split(laChaine, vbCrLf)
        ActiveSheet.Range(cel, cel.Offset(UBound(tabllig), 0)) = Application.Transpose(tabllig)
        ActiveSheet.Range(cel, cel.Offset(UBound(tabllig), 0)).TextToColumns DataType:=xlDelimited, ConsecutiveDelimiter:=True, Space:=False
        csv_to_cel = "operation de récupération du csv a partir de la cellule " & cel.Address & " a reussi!!!"
    End Function
    et voila comment on s'en sert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub testrécup()
    'lance la fonction csv tocel avec comme argument la premiere cellule ou doit commencer le transfert ,suivit du nom du fichier
        a = csv_to_cel([F3], "C:\Users\polux\Desktop\test2.csv")
        MsgBox a
    End Sub

    A +
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Citation Envoyé par Pix_elle Voir le message
    soit en UTF-8 sans bom
    Alors ce n'est plus de l'UTF-8 ‼ Byte Order Mark
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  14. #14
    Membre du Club
    Femme Profil pro
    Chargée de missions
    Inscrit en
    Janvier 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargée de missions

    Informations forums :
    Inscription : Janvier 2016
    Messages : 73
    Points : 58
    Points
    58
    Par défaut
    Bonjour Patrick, Marc-L. Et merci de porter de l'intérêt à mon problème.


    Concernant cette obstination à vouloir convertir mon CSV : c'est ma contrainte métier. Les CSV enregistrés passeront ensuite dans le gestionnaire BDD. Les documents doivent être en CSV UTF-8 (sans bom donc) sinon ça bloque et les données ne sont pas intégrées. Patrick, J'essaie ce que tu as posté dans l'après midi.


    Marc-L, alors non je n'avais pas testé l'enregistrement macro du "enregistrer sous". Du coup je viens de le faire. Voici ce que l'enregistreur de macro me sort. Quand je vais voir mon fichier converti, il est encodé en ANSI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With ActiveWorkbook.WebOptions
            .RelyOnCSS = True
            .OrganizeInFolder = True
            .UseLongFileNames = True
            .DownloadComponents = False
            .RelyOnVML = False
            .AllowPNG = True
            .ScreenSize = msoScreenSize1024x768
            .PixelsPerInch = 96
            .Encoding = msoEncodingUTF8
        End With

    Citation Envoyé par Marc-L Voir le message
    Alors ce n'est plus de l'UTF-8 ‼ Byte Order Mark
    Question très idiote alors : pourquoi on a alors "UTF-8 (SANS BOM)" sous NotePad si ce n'est pas de l'UTF-8 par exemple ?

  15. #15
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    Je n'ai pas cela dans le Bloc-notes ! Quelle version de Windows ?

    Serait-ce alors une mise jour pour ceux ne respectant pas les normes …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  16. #16
    Membre du Club
    Femme Profil pro
    Chargée de missions
    Inscrit en
    Janvier 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargée de missions

    Informations forums :
    Inscription : Janvier 2016
    Messages : 73
    Points : 58
    Points
    58
    Par défaut
    Je suis sous Windows 10 et je tourne avec Office 2016. J'essaierai de chez moi (W7 + Office 2010)...

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    les web options!!
    c'est pour l'enregistrement en web( html ou mht) ca n'a aucune incidence sur les csv ou text

    tu disais 't'emmeler les pinceaux ben ca y est on t est la !
    va boire un café ou un bon thé vert et reviens nous
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    Pix_elle, j'espère juste tu n'évoquais pas Notepad++ !

    Notepad = le Bloc-notes de Windows et là, en tout cas jusqu'à Windows 8.1, il y a juste UTF8, la norme …

    Au passage tu pourras le coller dans les dents du demandeur, t'as même le lien vers le site officiel !

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  19. #19
    Membre du Club
    Femme Profil pro
    Chargée de missions
    Inscrit en
    Janvier 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargée de missions

    Informations forums :
    Inscription : Janvier 2016
    Messages : 73
    Points : 58
    Points
    58
    Par défaut
    Au risque de me faire taper sur les doigts, j'utilise Notepad++

  20. #20
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Merci de ne pas quoter l'intégralité du message juste précédent, cela nuit à la lisibilité, fluidité de la discussion …

    En fait cela m'a rappelé une anecdote …
    Notepad++ est un excellent utilitaire (justement utilisé par ceux ne respectant les normes).
    Je l'utilise par confort pour vérifier la structure d'un fichier texte : séparateur tabulation, séquence de fin de ligne, …

    Vérifie juste dans Notepad (le Bloc-notes de la version française de Windows) combien y-a-t-il de format UTF8 ?
    Et puis sur le site officiel, c'est clair …

    Edit :
    bon apparemment j'ai eu du bol toutes ces années n'ayant jamais rencontré le cas parmi des dizaines et dizaines de fichiers !
    Un collègue m'a confirmé que c'était pourtant de plus en plus courant (donc sans BOM) et en relisant bien mon lien
    effectivement cette signature dans un fichier UTF-8 n'est pas obligatoire, même si elle est bien pratique !
    Autant pour moi ! MEA CULPA !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [ZF 2.x] Envoyer un mail HTML avec encodage UTF-8
    Par narmataru dans le forum Zend Framework
    Réponses: 4
    Dernier message: 07/06/2013, 15h09
  2. [JAXP] Parsing XML avec encodage UTF-8
    Par mixi dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 13/12/2008, 15h00
  3. import CSV avec encodage dans la foulée
    Par benoitXV dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 10/12/2008, 13h07
  4. PB encodage UTF-8 avec Japonais, Chinois
    Par ch33k0n dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 18/06/2007, 12h02
  5. Problème d'affichage avec encodage utf-8
    Par t-die dans le forum Zend
    Réponses: 3
    Dernier message: 04/12/2006, 14h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo