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 :

[Mac] Convertir texte en UTF8 [XL-2019]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2017
    Messages : 11
    Points : 5
    Points
    5
    Par défaut [Mac] Convertir texte en UTF8
    Salut à tous,
    Pourriez vous me filer un petit coup de main?

    En fait , j'ai une boutique en ligne sur Etsy.fr, et tous les mois je récupère le csv que j'interprete avec vba pour me faire mon recap mensuel sous forme de tableau Excel.

    Il y a des caracteres spéciaux pour les lettres accentuées dans le csv genre "√©" pour un é comme ceci :

    Nom : Capture d’écran 2020-04-05 à 12.56.18.png
Affichages : 1922
Taille : 38,9 Ko

    Du coup je cherche à inclure un bout de code dans mon vba pour convertir soit le document entier soit juste une chaine de caractere en UTF-8 puisqu'il n'y a que les colonnes nom, prénom et pays qui sont concernées. Je peux éventuellement faire une petite boucle pour convertir chaque cellules concernées.
    Auriez vous une piste relativement simple ? (je ne suis pas un grand expert non plus en vba ;-) )

    Merci d'avance
    Pierre

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bebdoo Voir le message
    Bonjour,

    Mettez en ligne un fichier avec vos caractères spéciaux.

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

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,
    Citation Envoyé par bebdoo Voir le message
    SEn fait , j'ai une boutique en ligne sur Etsy.fr, et tous les mois je récupère le csv que j'interprete avec vba
    C'est quoi le code VBA ?
    Il semble que ta méthode d'ouverture du fichier ne prend pas en charge l'encodage UTF8 !
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2017
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses,
    Voici un fichier test en PJ, avec quelques caracteres spéciaux :

    fichier test.xlsx

    Voici le code du début de mon fichier vba : (si vous voulez le fichier complet je peu aussi l'envoyer)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub import_csv_ETSY()
     
    Dim y As Byte
    Application.ScreenUpdating = False      'empeche la page de se réactualiser à chaque nouvelle commande
    Application.DisplayAlerts = False          'empeche les alertes de s'afficher
     
    nomfich = Application.GetOpenFilename
    If nomfich = False Then Exit Sub
    Workbooks.Open nomfich
     
    '.... code
    End sub

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

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,

    Pour ouvrir et/ou pour enregistrer un fichier csv avec un encodage particulier (Utf8 ou autre), c'est pas très simple.
    J'utilise un Stream ADOBD qui permet de tenir compte de l'encodage.
    C'est pas suffisant pour un csv, il faut un traitement spécifique pour récupérer/générer correctement les champs.

    Voila le code :
    (il faut établir une référence à à ADODB : Microsoft ActiveX Data Objects 6.1 Library)

    EDIT : correction bug si plusieurs virgules dans une même cellule ligne 97 txt = txt & frm & sepV remplacé par txt = frm & sepV
    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
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    Option Explicit
    Option Private Module
    '
    ' É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
    '
    Public Const sepV$ = ","      'séparateur de valeurs
    Public Const sepL$ = vbCrLf   'séparateur de lignes
    Public Const idTxt$ = """"    'identificateur de texte chr(34)
    '
     
    Sub import_csv()
    Dim nomfich As Variant
    Dim wbk As Workbook
      nomfich = Application.GetOpenFilename("Fichiers csv, *.csv")
      If nomfich = False Then Exit Sub
      Set wbk = Lire_csv_UTF8_avec_ou_sans_BOM(nomfich)
      '.... code
      '
      Call Enregistrer_csv_UTF8_avec_BOM(wbk.Worksheets(1), nomfich)
      ' ou
      ' Call Enregistrer_csv_UTF8_sans_BOM(wbk.Worksheets(1), nomfich)
      wbk.Close False
    End Sub
     
    Public Function Lire_csv_UTF8_avec_ou_sans_BOM(ByVal nomCompletFichier As String) As Workbook
    ' 16/01/19  Patrice33740  V1-0-00
    Dim fUtf8 As ADODB.Stream         'flux de données Utf8
    Dim wbk As Excel.Workbook         'Classeur résultat
    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 wbk = Application.Workbooks.Add(xlWBATWorksheet)
      Set cel = wbk.Worksheets(1).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
      wbk.Worksheets(1).Columns.AutoFit
      wbk.Worksheets(1).Rows.AutoFit
      Application.Calculation = xlCalculationAutomatic
      Application.ScreenUpdating = True
      Set Lire_csv_UTF8_avec_ou_sans_BOM = wbk
    End Function
     
    Private Sub EcrireLigneCSV(lgn As String, cel As Range)
    ' 16/01/19  Patrice33740  V1-0-00
    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
      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)
          End If
          cel.Offset(0, nbC).FormulaLocal = frm
          txt = "": nbC = nbC + 1
        Else
          ' le champ est incomplet
          txt = frm & sepV
        End If
      Next i
    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 (si Alltext : toutes les infos délimitées texte)
    ' 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 (si Alltext : toutes les infos délimitées texte)
    ' 16/01/19  Patrice33740  V1-0-00
    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
    ' 31/03/20  Patrice33740  V1-2-01
      ' Uniformiser les séparateurs de ligne, selon l'origine Cr ou CrLf ou Lf.
      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

    Et le fichier exemple : Edit bebdo.xlsm bebdoo 2.xlsm
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bebdoo Voir le message

    Bonjour bebdoo et Patrice,

    Je pensais que le code ci-dessous permettrait d'identifier les caractères en question, mais il ne marche que pour Su√®de. Pour Caroline Casselsj√∂, les deux caractères à la fin ne sont pas reconnus. On peut les déduire, mais cela va devenir une usine à gaz, pour tous les cas de ce genre.
    Je n'ai pas testé le code de Patrice, mais il me semble beaucoup plus sérieux...

    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
     
    Sub TesterLesCaracteres()
     
    Dim I As Integer, J As Integer
     
        With Selection
             For I = 1 To .Characters.Count
             Debug.Print "Caractère " & I & ", valeur : " & Mid(.Text, I, 1)  '& ", code : " & J
                 For J = 0 To 255
                     If Mid(.Text, I, 1) = Chr(J) Then
                        Debug.Print "Caractère " & I & ", valeur : " & Chr(J) & ", code : " & J
                     End If
                 Next J
             Next I
        End With
     
    End Sub

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 927
    Points
    55 927
    Billets dans le blog
    131
    Par défaut
    Salut.

    Voici ce que j'utilise pour ouvrir un csv en UTF-8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function getFileContent(Filename As String) As String
      Dim st As New ADODB.Stream
      Dim Result As String
     
      With st
        .Type = 2
        .Charset = "utf-8"
      End With
      st.Open
      st.LoadFromFile Filename
      getFileContent = st.ReadText(-1)
      st.Close
      Set st = Nothing
    End Function
    Le fichier que tu donnes, c'est déjà un xlsx. Ca veut dire que, point de vue UTF-8, il a déjà été "corrompu" par Excel. Tu parlais d'un CSV, au départ. Alors finalement, c'est un CSV, un XLSX? Tu lis le fichier ou tu écris dedans?

    Le reste (la découpe en enregistrements, les séparateurs, etc) n'ont aucun rapport avec le problème d'un UTF-8 mal compris par Excel. De plus, il me semble aberrant qu'un enregistrement dont les données soient séparées par des virgules puisse contenir de données qui contiennent des virgules. Ca n'a absolument aucun sens. Si des virgules peuvent se trouver à l'intérieur d'une donnée, alors, le séparateur ne peut pas être la virgule. Ca me semble être la base des bases.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2017
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci à tous pour vos réponses,
    Le plus simple pour moi serait d'utiliser le code de Pierre mais j'ai un petit problème, j'utilise excel 2019 sur MAC OS et je ne peux pas ajouter microsoft activeX data object dans outils/reference, la référence n'existe pas. Et en fouillant un peu sur le net, apparemment c'est le probleme sur mac, elle n'existerait pas...
    Auriez vous une solution ?
    Pierre, c'est un bien un fichier csv que j'interprete mais pour montrer les caracteres spéciaux, j'ai créé un fichier xls juste pour l'exemple

    Sinon il me reste la solution un peu plus fastidieuse d'Eric mais je suis pas sur d'avoir le courage de faire tous les caracteres un à un ...


    Nom : Capture d’écran 2020-04-07 à 11.32.32.png
Affichages : 1773
Taille : 142,1 Ko

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 927
    Points
    55 927
    Billets dans le blog
    131
    Par défaut
    Désolé, sur Mac, je n'ai pas de solution. La seule fois que j'ai "travaillé" avec du VBA sur un Mac, lorsque je passais le code du mac à mon pc ou l'inverse, j'avais plein de caractères accentués qui sautaient. J'ai dit "Plus jamais Mac"... et je n'ai plus jamais touché un mac de ma vie.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour, je suis sur Mac, et je travaille un peu avec le standard PC. Le code VBA ne doit jamais avoir de caractères accentués, y compris dans les messages exemple: Msgbox "j'ai trouvé" ça sort pas comme cela, il faut reprendre tout à la main. c'est pourquoi, le programme que j'ai fait pour ma fille est identique au mien, repris à la main par moi sur son ordinateur et on ne transfère que des données Excel. Attention toutefois à avoir au niveau de la date un choix identique, sinon il y a 4 ans de différence.

    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

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

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,

    Sous Windows, la méthode la plus simple et la plus sûre pour ouvrir un fichier csv avec un encodage particulier (comme utf8) c'est d'utiliser Libre Office.
    Sous Excel, ce n'est pas l'encodage qui pose problème, mais l'interprétation des champs au format csv, en particulier les champs textes qui contiennent des séparateurs ou des identificateurs de texte.
    Ce n'est pas le cas avec Libre Office, ça évite de devoir utiliser une macro spéciale (et pas très simple) comme celle que je t'ai proposé au post #5

    Je suppose que sous MAC OS, Libre Office aussi performant que sous Windows.
    Un fois ouvert, il suffit ensuite d'enregistrer le fichier en xlsx pour le traiter avec Excel.

    J'ai un petit fichier csv particulièrement démonstratif : Fichier test Csv UTF8 avec BOM.zip
    Dans NPP++ :
    Nom : Test Csv UTF8 npp.jpg
Affichages : 1747
Taille : 42,9 Ko

    Correctement chargé dans Excel :
    Nom : Test Csv UTF8 xl.jpg
Affichages : 1711
Taille : 31,7 Ko
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  12. #12
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 927
    Points
    55 927
    Billets dans le blog
    131
    Par défaut
    Je ne sais pas ce que veut dire "la plus simple" et "la plus sûre" car nous n'avons probablement pas le même référentiel. Cela dit, j'imagine assez mal qu'on installe en entreprise des MS Office ET des LibreOffice pour traiter ces cas-là. Selon mon référentiel, ce n'est certainement pas la solution "la plus simple".

    Ceci dit, Libre Office n'ouvre pas beaucoup mieux ton fichier, chez moi en tout cas. Je ne sais donc pas comment tu arrives à ce résultat dans Excel car ni Libre Office ni Excel ne me donnent le résultat que tu illustres.

    Nom : 2020-04-07_205921.png
Affichages : 1690
Taille : 37,7 Ko

    Autre chose, ton fichier ne semble pas comporter de caractères accentués tels que ceux qui posent problème et qui illustrés dans la demande initiale. Comment se comporte ta technique dans ce cas?


    Perso, je pense qu'il n'y a pas de règle absolue pour le traitement des CSV, simplement parce qu'il n'y a pas de règles systématiques à observer à la création d'un CSV ni de norme, comme c'est le cas du xml ou du json. Je pense donc qu'il est illusoire de tenter LA méthode universelle qui traitera tous les cas possibles en CSV. Je traite actuellement des exports ODOO vers Excel, et c'est en discutant avec les programmeurs côté ODOO que nous sommes arrivés à "notre" norme. Celle-ci n'est pas la même que ce que j'ai utilisé avec un autre opérateur qui utilisait son propre framework d'e-commerce et avec qui nous avons discuté pour accorder nos violons. Et pour presque chaque exemple que je pourrais citer depuis les années que je traite ce genre de données, la solution est toujours venue d'ajustements et de décisions "au cas par cas". Par contre, il y a un outil (celui que j'ai exposé mais qui n'est pas fonctionnel sous mac), qui lit ou écrit un UTF8, à charge après de découper le fichier obtenu selon les spécifications propres à CE fichier.

    Je pense au demeurant qu'il serait intéressant d'abandonner une fois pour toutes ce "format" au profit de formats d'échange qui font l'objet d'une norme (xml ou json).

    Citation Envoyé par Patrice740 Voir le message
    [...]
    un fichier csv avec un encodage particulier (comme utf8)[...]
    Quant à cette assertion... UTF-8 n'est justement pas "un format particulier", mais le format généralement utilisé pour l'échange de données qui "transcende" normalement les plateformes émettrices et réceptrices des données. Les formats particuliers, ce sont les formats Windows... UTF-8 veut dire Universal Transformation Format (il y a d'autres lettres au milieu mais l'important est là), et est une synthèse de l'Ascii et de l'unicode. C'est de l'ascii partout sauf pour les caractères qui ne font pas partie de l'Ascii et qui sont alors unicodes, d'où les caractères bizarroïdes que l'on rencontre parfois si on ne le décode pas bien. C'est le format obligatoire des XML, par exemple, et c'est celui utilisé par les navigateurs Internet. Je pense donc que c'est tout sauf un "encodage particulier"
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 927
    Points
    55 927
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Transitoire Voir le message
    Bonjour, je suis sur Mac, et je travaille un peu avec le standard PC. Le code VBA ne doit jamais avoir de caractères accentués, y compris dans les messages exemple: Msgbox "j'ai trouvé" ça sort pas comme cela, il faut reprendre tout à la main.[...]
    Normalement, c'est le b.a.-ba du codage de ne jamais mettre d'accents dans du code informatique (et pourtant, des membres étoilés proposent des codes avec des procédures/fonctions/variable dont les noms comportent des accents). Et c'est aussi le b.a.-ba de ne pas mettre de notions métier dans le code. Or le texte d'un message, c'est une notion métier, et les textes devraient donc être déportés dans une feuille Excel et appelés par le code. Depuis cette mauvaise expérience avec un Mac, je ne mets plus aucun texte de message dans mon code, et je respecte scrupuleusement cette séparation code / Notions métier. J'aurai au moins appris cela ^^
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour Pierre.
    Citation Envoyé par Pierre Fauconnier Voir le message
    Je ne sais donc pas comment tu arrives à ce résultat dans Excel car ni Libre Office ni Excel ne me donnent le résultat que tu illustres.
    Ouvert avec LO : Jeu UTF8, Séparé par virgule, Sep. caractères "

    Il n'y a pas de caractères accentués dans le fichier test car comme je l'ai écrit, ce n'est pas l'encodage qui pose problème (avec Excel le stream fonctionne parfaitement).

    Si effectivement csv n'est pas standardisé, il y a tout de même une règle fondamentale : les champs qui contiennent un ou plusieurs des 3 séparateurs (ligne, valeur, texte) doivent être encadrés de séparateurs textes. C'est très souvent ce qui pose problème à l'ouverture directe d'un csv avec Excel.

    Quand je parle « d'ouvrir un fichier csv avec un encodage particulier (comme utf8) », particulier est employé dans les sens "qui est à part", c'est à dire d'un encodage qui n'est pas celui utilisé par Excel pour ouvrir directement un fichier csv (comme le fait bebdoo).
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  15. #15
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour à tous. @Pierre Fauconnier, pourriez vous m'expliquer plus en détail ce que vous entendez exactement par l'expression "notions métier"?
    Normalement, c'est le b.a.-ba du codage de ne jamais mettre d'accents dans du code informatique. Et c'est aussi le b.a.-ba de ne pas mettre de notions métier dans le code. Or le texte d'un message, c'est une notion métier, et les textes devraient donc être déportés dans une feuille Excel et appelés par le code. Depuis cette mauvaise expérience avec un Mac, je ne mets plus aucun texte de message dans mon code, et je respecte scrupuleusement cette séparation code / Notions métier. J'aurai au moins appris cela ^^
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  16. #16
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 927
    Points
    55 927
    Billets dans le blog
    131
    Par défaut
    Salut Transitoire,

    J'entends par "donnée métier" toute donnée (texte, valeur numérique, booléen, date...) qui est liée au métier géré par l'application, que ce soit Excel, Access, appli en C# ou autre. D'une façon générale, cela recouvre toutes les données manipulées par le code, hors celles qui sont purement informatiques. Toutes ces données doivent être stockées hors du code et y entrer par des procédures/fonctions bien précises. Elles seront très souvent manipulées par le code sous forme d'arguments de procédures/fonctions/propriétés.

    En sortant ces données du code, on facilite la maintenance et l'évolution du code, ainsi que son écriture proprement dit car si une donnée est modifiée, on ne touche pas au code, on modifie la donnée là où on l'a stockée (cellule Excel, fichier txt ou ini, base de données,...).

    Quelques exemples "évidents" car on comprend bien qu'ils sont directement liés au "métier" géré par l'application:
    • Prix unitaire d'un produit;
    • Taux de remise d'un produit;
    • Date de début ou de fin période;
    • Nombre d'éléments d'une liste d'employés, d'articles, ...




    Exemples moins "évidents":
    • Chemin d'accès d'un fichier et nom du fichier;
    • Format des dates pour leur conversion en une autre langue;
    • Messages à afficher dans les msgbox, en ce compris le titre de la boite de dialogue;
    • Dans certains cas, libellés des menus, boutons, étiquettes des contrôles de userform (appli multilingue, par exemple, ou transfert sur une autre plateforme => les applis androïd fonctionnent ainsi avec un système propre de stockage indexé de tous les textes affichés).




    En fait, on applique au code VBA le même raisonnement que celui qu'on applique à Excel lorsque l'on écrit des formules, si l'on veut respecter la règle capitale qui dit "pas de (fausse) constante dans vos formules". Si l'on doit appliquer une remise de 10% sur le prix d'un article stocké en A1, on n'écrira pas =A1*0,9 mais on stockera 10% dans une cellule (par exemple B1) et on écrira la formule =a1*(1-b1). De cette manière, si le taux de remise (donnée métier) est modifié, on le modifie dans la cellule et pas dans la formule. Idem si l'on crée des graphiques dont le titre contient l'année illustrée. En déportant l'année dans une cellule, on se donne la possibilité de modifier tous les titres des graphiques d'un coup en modifiant simplement la valeur de la cellule.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #17
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour Pierre, je vous remercie de cette réponse qui m'a apportée certains principes que j'ignorais.
    J'avais déja pour habitude dans mes classeurs de rajouter aux feuilles vitales, une feuille Tableau de bord qui contient plein de cellules, nommées pour la clarté et la facilité : ex: ChoixAn; ChoixMois; TVA20; TVA10 etc.
    Ce qui me permet comme vous l'avez dit de modifier avec une seule cellule plein de choses d'un coup. Par contre je n'avais pas songé aux textes des boites de dialogue, etc.
    "Penser Excel avant de penser VBA" Pierre Fauconnier Dixit
    Je vais donc m'y mettre promptement

    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2017
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Etant sur mac, et ne pouvant pas avoir acces à "microsoft activeX data object", je laisse tomber tampis, je vois pas trop comment je peux faire sauf en convertissant caractere par caractere
    Merci à tous d'avoir essayé de m'aider :-)

  19. #19
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour, juste une question, avez vous essayez tout simplement de sélectionner la zone et de passer par rechercher/remplacer. vous pouvez essayer de remplacer √© par é ?
    Nom : Capture d’écran 2020-04-10 à 09.14.49.png
Affichages : 1697
Taille : 37,2 Ko
    Nom : Capture d’écran 2020-04-10 à 09.15.10.png
Affichages : 1684
Taille : 37,8 Ko
    Chez moi ça marche, vous n'avez qu'a sélectionner toute la zone avec "é" et faire la manip avec les autres caractères spéciaux, ça prend pas longtemps, et au pire vous pourrez le faire sous VBA
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  20. #20
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Ci-dessous, le code VBA de l'enregistreur de macros concernant la manipulation citée plus haut. Attention, dans la présentation ci-dessous, "&#8730" doit être remplacé dans le code par "√"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Test()
        Range("H3").Select
        Cells.Replace What:="√©", Replacement:="é", LookAt:=xlPart, SearchOrder _
            :=xlByRows, MatchCase:=False
    End Sub
    Vous pourrez essayer en modifiant les paramètres nécessaires bien évidemment.

    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

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

Discussions similaires

  1. Convertir texte en image
    Par arnaud_verlaine dans le forum Flash
    Réponses: 10
    Dernier message: 26/09/2006, 09h15
  2. Convertir une chaîne utf8 en iso-8859-1
    Par dredre dans le forum ASP
    Réponses: 1
    Dernier message: 05/05/2006, 00h48
  3. [Mail] Convertir texte en adresse mail
    Par Jean-Michel dans le forum Langage
    Réponses: 3
    Dernier message: 07/09/2005, 04h40
  4. Réponses: 2
    Dernier message: 06/12/2004, 21h38
  5. Convertir une chaine UTF8 en ISO-8859-1
    Par eods dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 26/08/2004, 16h57

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