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 :

Enregistrer ou convertir un fichier Excel en csv


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Polygos
    Homme Profil pro
    Ma petite entreprise
    Inscrit en
    Avril 2016
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ma petite entreprise
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2016
    Messages : 190
    Par défaut Enregistrer ou convertir un fichier Excel en csv
    Bonjour
    voila ma problématique:
    Je perds trop de temps à convertir mes fichiers d'import de données sur mes sites de Excel à Csv, UTF-8, séparateur ";" etc.
    Plutôt que d'enregistrer mon fichier résultat en XL (2013 chez moi), ne pourrais je pas l'enregistrer en csv avec cette définition, comment ça se paramètre ?
    Aujourd'hui je n'ai rien trouvé de plus fiable que d'utiliser covertio mais le nombre de conversion est limitée journellement..
    Ce sujet a déjà trouvé preneur ?

    Merci de votre aide.

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour,

    Manuellement il faut faire :

    Ouvrir ton fichier dans Excel
    Enregistrer sous format CSV.
    Ensuite, en bas de la fenêtre, choisir Outils / Options Web / onglet Encodage et choisir UTF-8 (dans le menu déroulant)
    Enregistrer ce document sous: et OK.

    Avec enregistreur de macro j'obtiens :

    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
     
    Sub Macro1()
    '
    ' Macro1 Macro
    '
     
    '
        With ActiveWorkbook.WebOptions
            .RelyOnCSS = True
            .OrganizeInFolder = True
            .UseLongFileNames = True
            .DownloadComponents = False
            .RelyOnVML = False
            .AllowPNG = True
            .ScreenSize = msoScreenSize1024x768
            .PixelsPerInch = 96
            .Encoding = msoEncodingUTF8
        End With
     
        With Application.DefaultWebOptions
            .SaveHiddenData = True
            .LoadPictures = True
            .UpdateLinksOnSave = True
            .CheckIfOfficeIsHTMLEditor = True
            .AlwaysSaveInDefaultEncoding = False
            .SaveNewWebPagesAsWebArchives = True
        End With
     
        ChDir "C:\Users\Admin\Desktop"
        ActiveWorkbook.SaveAs Filename:="C:\Users\Admin\Desktop\Book1.csv", _
            FileFormat:=xlCSV, CreateBackup:=False
        Application.Goto Reference:="Sheet1.SaveWorkSheetAsCSV"
     
    End Sub

  3. #3
    Membre confirmé Avatar de Polygos
    Homme Profil pro
    Ma petite entreprise
    Inscrit en
    Avril 2016
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ma petite entreprise
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2016
    Messages : 190
    Par défaut
    Merci Mfoxy mais comment gères tu les séparateurs ?
    Nom : Screenshot_6.jpg
Affichages : 2742
Taille : 95,9 Ko
    Mon ppli derrière est précise et .;capricieuse, des fois il lui faut des ";"etc.

  4. #4
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour,

    Si excel n'est pas assez modulable, peut-être voir du côté access ?

    Comme il s'agit d'un vrai Sgbd avec des outils de gestion plus pointu que notre tableur, il y a peut-être possibilité de pousser plus facilement les paramètres des export de table en csv ?

  5. #5
    Membre confirmé Avatar de Polygos
    Homme Profil pro
    Ma petite entreprise
    Inscrit en
    Avril 2016
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ma petite entreprise
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2016
    Messages : 190
    Par défaut
    Citation Envoyé par mfoxy Voir le message
    Bonjour,

    Si excel n'est pas assez modulable, peut-être voir du côté access ?

    Comme il s'agit d'un vrai Sgbd avec des outils de gestion plus pointu que notre tableur, il y a peut-être possibilité de pousser plus facilement les paramètres des export de table en csv ?
    Malheureusement toute ma BDD est sous Excel et il y bcp de codes deja installés, de plus je ne suis pas calé en Access du tout..

  6. #6
    Membre confirmé Avatar de Polygos
    Homme Profil pro
    Ma petite entreprise
    Inscrit en
    Avril 2016
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ma petite entreprise
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2016
    Messages : 190
    Par défaut
    ..
    iln 'y a pas de commande pour enregistrer un fichier format excel en csv en VBA, en lui présicant les séparateurs ?
    Ca me surprend !


  7. #7
    Membre confirmé Avatar de Polygos
    Homme Profil pro
    Ma petite entreprise
    Inscrit en
    Avril 2016
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ma petite entreprise
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2016
    Messages : 190
    Par défaut
    Citation Envoyé par mfoxy Voir le message
    Bonjour,

    Manuellement il faut faire :

    Ouvrir ton fichier dans Excel
    Enregistrer sous format CSV.
    Ensuite, en bas de la fenêtre, choisir Outils / Options Web / onglet Encodage et choisir UTF-8 (dans le menu déroulant)
    Enregistrer ce document sous: et OK.

    Avec enregistreur de macro j'obtiens :

    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
     
    Sub Macro1()
    '
    ' Macro1 Macro
    '
     
    '
        With ActiveWorkbook.WebOptions
            .RelyOnCSS = True
            .OrganizeInFolder = True
            .UseLongFileNames = True
            .DownloadComponents = False
            .RelyOnVML = False
            .AllowPNG = True
            .ScreenSize = msoScreenSize1024x768
            .PixelsPerInch = 96
            .Encoding = msoEncodingUTF8
        End With
     
        With Application.DefaultWebOptions
            .SaveHiddenData = True
            .LoadPictures = True
            .UpdateLinksOnSave = True
            .CheckIfOfficeIsHTMLEditor = True
            .AlwaysSaveInDefaultEncoding = False
            .SaveNewWebPagesAsWebArchives = True
        End With
     
        ChDir "C:\Users\Admin\Desktop"
        ActiveWorkbook.SaveAs Filename:="C:\Users\Admin\Desktop\Book1.csv", _
            FileFormat:=xlCSV, CreateBackup:=False
        Application.Goto Reference:="Sheet1.SaveWorkSheetAsCSV"
     
    End Sub
    A la main, j'obtiens bien un csv encodé UTF 8 mas je n'ai pas le choix du séparateur décimal....qui reste la virgule.

  8. #8
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Tu n'as pas précisé si tu voulais enregistrer le fichier avec ou sans BOM ?

    Un exemple complet en utilisant un Stream (Microsoft ActiveX Data Objects 6.1 Library) :
    Code VBA : 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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    ' Module    : mExportCsv
    ' Objet     : Export ligne à ligne d'une feuille, aux formats csv encodé UTF8 avec ou sans BOM
    '
    ' Établir la référence à ADODB :  Microsoft ActiveX Data Objects 6.1 Library
    ' Pour les valeurs de Stream.Charset, voir dans le registre : HKEY_CLASSES_ROOT\MIME\Database\Charset
    '
    ' 31/03/20 Patrice33740 V1-2-01
    '
    Option Explicit
    Option Private Module
    '
    ' conversion en texte
    Public Const sepV$ = ","                                    'séparateur de valeurs
    Public Const sepL$ = vbCrLf                                 'séparateur de lignes
    Public Const idTxt$ = """"                                  'identificateur de texte
    '
    Sub Test()
    ' Enregistrer UTF8 sans BOM
    Dim nom$
      nom = ThisWorkbook.Path & "\Test_UTF8_sans_BOM.csv"
      Call Enregistrer_csv_UTF8_sans_BOM(Worksheets(1), nom)
    End Sub
     
    Public Sub Enregistrer_csv_UTF8_avec_BOM(wsh As Worksheet, ByVal nomCompletFichier As String, Optional AllText As Boolean = False)
    ' Enregistrement d'une feuille Excel au format csv encodé UTF8 avec BOM
    ' 31/03/20 Patrice33740 V1-2-01
    '
    Dim fUtf8avecBOM As ADODB.Stream  'flux de données Utf8 avec BOM
    Dim rngData As Range              'plage des données
    Dim txt As String                 'texte
    Dim n°L As Long                   'numéro de ligne
    Dim n°C As Long                   'numéro de colonne
     
      ' Définir le flux de données Utf8 avec BOM
      Set fUtf8avecBOM = New Stream
      fUtf8avecBOM.Charset = "utf-8"
      fUtf8avecBOM.Mode = adModeReadWrite
      fUtf8avecBOM.Type = adTypeText
      fUtf8avecBOM.Open
     
      ' Ajouter les données séparées par une virgule et encadrées par des "
      Set rngData = wsh.UsedRange
      With rngData
        For n°L = 1 To .Rows.Count
          txt = AjoutIdTexte(.Cells(n°L, 1).Text, AllText)
          fUtf8avecBOM.WriteText txt
          For n°C = 2 To .Columns.Count
            txt = AjoutIdTexte(.Cells(n°L, n°C).Text, AllText)
            fUtf8avecBOM.WriteText sepV & txt
          Next n°C
          fUtf8avecBOM.WriteText sepL
        Next n°L
      End With
      ' Enregistrer le fichier
      fUtf8avecBOM.Flush
      fUtf8avecBOM.SaveToFile nomCompletFichier, adSaveCreateOverWrite
      fUtf8avecBOM.Close
      Set fUtf8avecBOM = Nothing
     
    End Sub
     
    Public Sub Enregistrer_csv_UTF8_sans_BOM(wsh As Worksheet, ByVal nomCompletFichier As String, Optional AllText As Boolean = False)
    ' Enregistrement d'une feuille Excel au format csv encodé UTF8 sans BOM
    ' 31/03/20 Patrice33740 V1-2-01
    '
    Dim fUtf8avecBOM As ADODB.Stream  'flux de données Utf8 avec BOM
    Dim fUtf8sansBOM As ADODB.Stream  'flux de données Utf8 sans BOM
    Dim rngData As Range              'plage des données
    Dim txt As String                 'texte
    Dim n°L As Long                   'numéro de ligne
    Dim n°C As Long                   'numéro de colonne
     
      ' Définir le flux de données Utf8 avec BOM
      Set fUtf8avecBOM = New Stream
      fUtf8avecBOM.Charset = "utf-8"
      fUtf8avecBOM.Mode = adModeReadWrite
      fUtf8avecBOM.Type = adTypeText
      fUtf8avecBOM.Open
     
      ' Ajouter les données séparées par une virgule et encadrées par des "
      Set rngData = wsh.UsedRange
      With rngData
        For n°L = 1 To .Rows.Count
          txt = AjoutIdTexte(.Cells(n°L, 1).Text, AllText)
          fUtf8avecBOM.WriteText txt
          For n°C = 2 To .Columns.Count
            txt = AjoutIdTexte(.Cells(n°L, n°C).Text, AllText)
            fUtf8avecBOM.WriteText sepV & txt
          Next n°C
          fUtf8avecBOM.WriteText sepL
        Next n°L
      End With
      ' Pointer après le BOM
      fUtf8avecBOM.Position = 3
     
      ' Définir le flux de données Utf8 sans BOM
      Set fUtf8sansBOM = New Stream
      fUtf8sansBOM.Mode = adModeReadWrite
      fUtf8sansBOM.Type = adTypeBinary
      fUtf8sansBOM.Open
     
      'Ajouter les données (sans le BOM)
      fUtf8avecBOM.CopyTo fUtf8sansBOM
      fUtf8avecBOM.Flush
      fUtf8avecBOM.Close
      Set fUtf8avecBOM = Nothing
     
      ' Enregistrer le fichier
      fUtf8sansBOM.SaveToFile nomCompletFichier, adSaveCreateOverWrite
      fUtf8sansBOM.Close
      Set fUtf8sansBOM = Nothing
     
    End Sub
     
    Private Function AjoutIdTexte(txt As String, Optional AllText As Boolean = False) As String
    ' Ajoute les identificateurs de texte (pour csv) indispensables ou systèmatiques
    ' 31/03/20 Patrice33740 V1-2-01
    '
      ' Uniformiser les séparateurs de ligne, selon l'origine Cr ou CrLf ou Lf, mais Lf dans cellule Excel.
      txt = Replace(Replace(Replace(txt, vbCrLf, vbLf), vbCr, vbLf), vbLf, sepL)
      ' Ajouter les identificateurs de texte indispensable (ou systèmatiques si AllText)
      If AllText Or InStr(1, txt, sepL) > 0 Or InStr(1, txt, sepV) > 0 Or InStr(1, txt, idTxt) > 0 Then
        txt = idTxt & Replace(txt, idTxt, idTxt & idTxt) & idTxt
      End If
      AjoutIdTexte = txt
     
    End Function

  9. #9
    Membre confirmé Avatar de Polygos
    Homme Profil pro
    Ma petite entreprise
    Inscrit en
    Avril 2016
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ma petite entreprise
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2016
    Messages : 190
    Par défaut
    Bonjour Patrice
    excuse moi j'étais alité.
    Je relis ton message mais je suis largué.
    Je voulais juste enregistrer en fichier excel modifié ou créé par un code, non pas comme il a été ouvert mais en le convertissant en csv avec les séparateurs qui vont bien pour les ceusses qui l'utilisent après.
    aujourd'hui j'utilise Covertio et ça marche bien, mais je voudrais simplfier le processus et l'envoyer direct ds le format qui m'est demandé, csv avec un séparateur qui peut être selon les cas "," ou ";" ou "tab", voire jusqu'ou on peut aller sur la déclaration du séparateur texte, etc.Nom : Screenshot_2.jpg
Affichages : 2475
Taille : 107,6 Ko

  10. #10
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Re,

    Comme je t'ai déjà dis, il n'y a pas de standard pour un csv. Cependant ils répondent à certaines exigeances :
    Il faut définir au minimum 2 éléments fondamentaux qui sont indispensables dans tous les cas :
    - le séparateur de lignes - France et USA : Chr(13) & Chr(10)
    - le séparateur de valeurs - France le Point-virgule, USA la virgule
    et un troisième élément indispensable lorsque la valeur à coder contient un ou plusieurs des 2 éléments ci-dessus :
    - l'identificateur (ou séparateur) de texte - France et USA Double quote "
    et aussi un quatrième l'élément optionnel, généralement utilisé pour des transferts inter-territoriaux :
    - l'encodage (dans ton cas UTF-8) lorsque que ce n'est pas celui de l'OS.

    De plus, lorsqu'on doit changer de langue, il faut aussi définir les options régionales de la langue source et de la langue cible.
    Il faut donc aussi définir les éléments suivants (en particulier pour des fichiers destinés aux tableurs) :
    - le séparateur décimal - France la virgule USA le point
    - le séparateur de milliers - France l'espace, USA le quote '
    - le symbole monétaire - France € après le montant, USA $ avant le montant
    - le format date usuel - France JJ/MM/AAAA, USA MM/DD/YYYY
    - le format heures ...
    - ...

    Vu qu'il n'existe aucun standard, il faut donc que tu exprimes exactement lequel ou lesquels des formats csv tu veux obtenir en précisant pour chacun tous les éléments ci-dessus.
    A chaque fois il faudra une procédure adaptée.

    Je te le répète : les csv c'est la jungle !

  11. #11
    Membre confirmé Avatar de Polygos
    Homme Profil pro
    Ma petite entreprise
    Inscrit en
    Avril 2016
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ma petite entreprise
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2016
    Messages : 190
    Par défaut
    C'st précis. Moi j'ai besoin de la décimale "." dans mon csv; encodé en UTF8, séparateur ";"
    mais si je dois passer l'ensemble au format américain, je peux passer le séparateur à "," si c'est pour obtenir le point.
    par contre je ne peux pas changer mon paramétrage d'excel, (virgule pour les décimales) à cause des autres programmes et fichiers qui tournent dessus
    ou
    je ruse et je déclare au débt du code de passer pour ce fichier la décimale de ",", à "."
    Nom : Screenshot_20.jpg
Affichages : 2443
Taille : 17,7 Ko
    C'est possible ça ?

  12. #12
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Voilà un code spécialisé (à mettre dans un module standard nommé mCSVPolygos) pour :
    - créer le csv à partir d'une feuille Excel
    - et inversement lire le fichier csv et le charger dans une feuille Excel :
    Code VBA : 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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    ' Module    : mCsvPolygos
    ' Objet     : Import/Export ligne à ligne d'une feuille, au format csv encodé UTF8 avec BOM
    '
    ' Établir la référence à ADODB :  Microsoft ActiveX Data Objects 6.1 Library
    ' Pour les valeurs de Stream.Charset, voir dans le registre : HKEY_CLASSES_ROOT\MIME\Database\Charset
    '
    ' 18/04/20 Patrice33740 V1-2-02
    '
    Option Explicit
    Option Private Module
    '
    ' conversion en texte
    Public Const sepV$ = ";"                                    'séparateur de valeurs
    Public Const sepL$ = vbCrLf                                 'séparateur de lignes
    Public Const idTxt$ = """"                                  'identificateur de texte
    '
     
    Public Sub Enregistrer_csv_UTF8_Polygos(wsh As Worksheet, ByVal nomCompletFichier As String)
    ' Enregistrement d'une feuille Excel au format csv encodé UTF8 avec BOM
    ' 18/04/20 Patrice33740 V1-2-02
    '
    Dim fUtf8avecBOM As ADODB.Stream  'flux de données Utf8 avec BOM
    Dim rngData As Range              'plage des données
    Dim txt As String                 'texte
    Dim fmt As String                 'format
    Dim n°L As Long                   'numéro de ligne
    Dim n°C As Long                   'numéro de colonne
     
      ' Définir le flux de données Utf8 avec BOM
      Set fUtf8avecBOM = New Stream
      fUtf8avecBOM.Charset = "utf-8"
      fUtf8avecBOM.Mode = adModeReadWrite
      fUtf8avecBOM.Type = adTypeText
      fUtf8avecBOM.Open
      ' Ajouter les données séparées par une virgule et encadrées par des "
      Set rngData = wsh.UsedRange
      With rngData
        For n°L = 1 To .Rows.Count
          txt = AjoutIdTexte(.Cells(n°L, 1).Text)
          fUtf8avecBOM.WriteText txt
          For n°C = 2 To .Columns.Count
            txt = .Cells(n°L, n°C).Text
            If TypeName(.Cells(n°L, n°C).Value) = "Double" Then txt = Replace(Replace(txt, " ", ""), ",", ".")   'séparateut décimal anglais : point
            If TypeName(.Cells(n°L, n°C).Value) = "Date" Then txt = Format(.Cells(n°L, n°C).Value, "mm/dd/yyyy") 'date anglaise : MM/JJ/AAAA
            txt = AjoutIdTexte(txt)
            fUtf8avecBOM.WriteText sepV & txt
          Next n°C
          fUtf8avecBOM.WriteText sepL
        Next n°L
      End With
      ' Enregistrer le fichier
      fUtf8avecBOM.Flush
      fUtf8avecBOM.SaveToFile nomCompletFichier, adSaveCreateOverWrite
      fUtf8avecBOM.Close
      Set fUtf8avecBOM = Nothing
     
    End Sub
     
    Private Function AjoutIdTexte(txt As String) As String
    ' Ajoute les identificateurs de texte (pour csv) indispensables ou systématiques
    ' 31/03/20 Patrice33740 V1-2-01
    '
      ' Uniformiser les séparateurs de ligne, selon l'origine Cr ou CrLf ou Lf, mais Lf dans cellule Excel.
      txt = Replace(Replace(Replace(txt, vbCrLf, vbLf), vbCr, vbLf), vbLf, sepL)
      ' Ajouter les identificateurs de texte indispensable
      If InStr(1, txt, sepL) > 0 Or InStr(1, txt, sepV) > 0 Or InStr(1, txt, idTxt) > 0 Then
        txt = idTxt & Replace(txt, idTxt, idTxt & idTxt) & idTxt
      End If
      AjoutIdTexte = txt
     
    End Function
     
    Public Sub Lire_csv_UTF8_Polygos(ByVal nomCompletFichier As String, ByRef wsh As Worksheet)
    ' 18/04/20 Patrice33740 V1-2-02
    Dim fUtf8 As ADODB.Stream         'flux de données Utf8
    Dim cel As Range                  'cellule destination
    Dim txt As String                 'texte
    Dim lgn As String                 'ligne
    Dim lgr As Long                   'longueur
      Application.ScreenUpdating = False
      Application.Calculation = xlCalculationManual
      Set cel = wsh.Range("A1")
      Set fUtf8 = New Stream
      With fUtf8
        ' Définir le flux de données Utf8
        .Charset = "utf-8"                   ' ou pour windows = "ISO-8859-1"
        .Mode = adModeReadWrite
        .Type = adTypeText
        .LineSeparator = adCRLF
        ' Ouvrir le flux et charger le contenu du fichier
        .Open
        .LoadFromFile nomCompletFichier
        Do Until .EOS
          txt = .ReadText(-2)         '-2 = une ligne
          lgn = lgn & txt
          lgr = Len(lgn) - Len(Replace(lgn, idTxt, ""))
          If (lgr Mod 2) = 0 Then
            ' la ligne est complète
            Call EcrireLigneCSV(lgn, cel)
            Set cel = cel.Offset(1)
            txt = "": lgn = ""
          Else
            ' la ligne est incomplète
            lgn = lgn & sepL
          End If
        Loop
        .Close
      End With
      Set fUtf8 = Nothing
      wsh.Columns.AutoFit
      wsh.Rows.AutoFit
      Application.Calculation = xlCalculationAutomatic
      Application.ScreenUpdating = True
    End Sub
     
    Private Sub EcrireLigneCSV(lgn As String, cel As Range)
    ' 18/04/20  Patrice33740  V1-2-02
    Dim txt As String                 'texte
    Dim frm As String                 'formule (champ)
    Dim lgr As Long                   'longueur
    Dim nbC As Long                   'nombre de colonnes
    Dim t As Variant                  'Tableau des champs bruts
    Dim i As Long                     'index
    Dim v3 As Double
    Dim v1, v2
      If lgn = "" Then Exit Sub
      t = Split(lgn, sepV)
      For i = LBound(t) To UBound(t)
        frm = txt & t(i)
        lgr = Len(frm) - Len(Replace(frm, idTxt, ""))
        If (lgr Mod 2) = 0 Then
          ' le champ est complet
          If Mid(frm, 1, 1) = idTxt Then
            ' le texte est délimité, enlever les délimiteurs
            frm = Mid(frm, 2, Len(frm) - 2)
            ' remplacer les doubles délimiteurs pas un simple délimiteur
            frm = Replace(frm, idTxt & idTxt, idTxt)
            cel.Offset(0, nbC).FormulaLocal = frm
          Else
            If frm = "VRAI" Then frm = "TRUE"
            If frm = "FAUX" Then frm = "FALSE"
            cel.Offset(0, nbC).Value = frm
          End If
          txt = "": nbC = nbC + 1
        Else
          ' le champ est incomplet
          txt = frm & sepV
        End If
      Next i
    End Sub

    Et un exemple d'utilisation, tu vois que c'est simple :
    il suffit de définir le nom complet du csv et la feuille concernée :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub TestEnregistrerCsv()
    ' Enregistrer Csv UTF8 Polygos
    Dim nom$
      nom = ThisWorkbook.Path & "\Polygos_Test_UTF8_avec_BOM.csv"
      Call Enregistrer_csv_UTF8_Polygos(ThisWorkbook.Worksheets(1), nom)
    End Sub
     
    Sub TestLireCsv()
    ' Lire Csv UTF8 Polygos
    Dim nom$
      ThisWorkbook.Worksheets(2).Cells.Clear
      nom = ThisWorkbook.Path & "\Polygos_Test_UTF8_avec_BOM.csv"
      Call Lire_csv_UTF8_Polygos(nom, ThisWorkbook.Worksheets(2))
      ThisWorkbook.Worksheets(2).Activate
    End Sub

    Et le fichier : Polygos.xlsm

Discussions similaires

  1. convertir multiples fichiers Excel en CSV à l 'aide d'un VB script
    Par christactua dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/10/2017, 09h26
  2. Réponses: 7
    Dernier message: 13/01/2016, 14h13
  3. [XL-2010] Convertir plusieurs fichiers excel en csv avec des guillemets
    Par karido-74 dans le forum Macros et VBA Excel
    Réponses: 41
    Dernier message: 29/01/2014, 18h32
  4. [MySQL] Convertir un fichier excel en csv avant d'uploader
    Par kakashi05 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/08/2011, 14h50
  5. [Excel] Convertir un fichier xls en csv sous UNIX
    Par Tsuful dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 14/04/2006, 11h12

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