Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/12/2011, 10h03   #1
Nouveau Membre du Club
 
Johan
Etudiant Miagiste en apprentissage (Master 2)
Inscription : avril 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Johan
Localisation : France

Informations professionnelles :
Activité : Etudiant Miagiste en apprentissage (Master 2)

Informations forums :
Inscription : avril 2011
Messages : 128
Points : 27
Points : 27
Par défaut Convertir onglet Excel en UTF-8

Bonjour,

J'ai une macro qui génère un fichier à partir d'un fichier source.
Cependant, le fichier crée interprète mal les caractères spéciaux (cf PJ).
Je crois que c'est parce que ma feuille n'est pas encodé en UTF-8.
Pouvez-vous me dire comment convertir un sheet en UTF-8 svp ?
johan89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 10h24   #2
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

Voici une macro que tu peux utiliser pour convertir les chaînes UTF-8 en chaînes ASCII (je peux me tromper, mais je ne pense pas que tu puisses afficher une feuille Excel en UTF-8). La manip consiste donc à convertir le fichier d'origine en ASCII :
En tête d'un module standard, mets le code suivant :

Code :
1
2
3
4
5
6
Private Const CP_UTF8 = 65001
 
Private Declare Function MultiByteToWideChar Lib "kernel32" ( _
   ByVal CodePage As Long, ByVal dwFlags As Long, _
   ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, _
   ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Colle ensuite les fonctions suivantes :

Code :
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
Public Function sUTF8ToUni(bySrc() As Byte) As String
' Converts a UTF-8 byte array to a Unicode string
Dim lBytes As Long, lNC As Long, lRet As Long
 
   lBytes = UBound(bySrc) - LBound(bySrc) + 1
   lNC = lBytes
   sUTF8ToUni = String$(lNC, Chr(0))
   lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(bySrc(LBound(bySrc))), lBytes, StrPtr(sUTF8ToUni), lNC)
   sUTF8ToUni = Left$(sUTF8ToUni, lRet)
End Function
 
Private Function ConvertUTF8File(sUTF8File As String) As String
Dim iFile As Integer, bData() As Byte, sData As String, lSize As Long
 
   ' Get the incoming data size
   lSize = FileLen(sUTF8File)
   If lSize > 0 Then
       ReDim bData(0 To lSize - 1)
 
       ' Read the existing UTF-8 file
       iFile = FreeFile()
       Open sUTF8File For Binary As #iFile
       Get #iFile, , bData
       Close #iFile
 
       ' Convert all the data to Unicode (all VB Strings are Unicode)
       sData = sUTF8ToUni(bData)
   Else
       sData = ""
   End If
   ConvertUTF8File = sData
End Function
La macro à exécuter pour copier les lignes du fichier est la suivante :

Code :
1
2
3
4
5
6
7
8
9
10
Sub LitUTF8()
   ' charge le fichier UTF-8 dans une variable string Unicode
    sFileBody = ConvertUTF8File("d:\donnees\daniel\mpfe\testutf8.txt")
   ' Enlève le marqueur Unicode de tête (i.e. the &HFEFF sequence)
   sFileBody = Mid$(sFileBody, 2)
   Tabl = Split(sFileBody, vbCrLf)
    For Each Item In Tabl
        MsgBox Item
    Next Item
End Sub
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/12/2011, 11h39   #3
Nouveau Membre du Club
 
Johan
Etudiant Miagiste en apprentissage (Master 2)
Inscription : avril 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Johan
Localisation : France

Informations professionnelles :
Activité : Etudiant Miagiste en apprentissage (Master 2)

Informations forums :
Inscription : avril 2011
Messages : 128
Points : 27
Points : 27
Bonjour,

Merci, cela fonctionne mais ...
La macro ouvre une msgbox avec le contenu converti alors que j'ai besoin qu'elle m'ouvre dans Excel le fichier converti.

J'ai tenté de modifier le code :

Code :
1
2
3
 For Each Item In Tabl
     Workbooks.Open Item
Next Item
Sans succès
johan89 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/12/2011, 12h00   #4
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

Non, "item" représente une ligne du fichier texte. La macro boucle et récupère dans "item" les lignes du fichier texte. Tu en fais ensuite ce que tu désires.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/12/2011, 12h29   #5
Nouveau Membre du Club
 
Johan
Etudiant Miagiste en apprentissage (Master 2)
Inscription : avril 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Johan
Localisation : France

Informations professionnelles :
Activité : Etudiant Miagiste en apprentissage (Master 2)

Informations forums :
Inscription : avril 2011
Messages : 128
Points : 27
Points : 27
Humm,
En fait, je ne comprends pas l'élément Item.
Comment manipuler cet élément ?
Comment incorporer ces lignes dans une feuille Excel ?
johan89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 13h19   #6
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Essaie :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
Sub LitUTF8()
   ' charge le fichier UTF-8 dans une variable string Unicode
    sFileBody = ConvertUTF8File("d:\donnees\daniel\mpfe\testutf8.txt")
   ' Enlève le marqueur Unicode de tête (i.e. the &HFEFF sequence)
   sFileBody = Mid$(sFileBody, 2)
   Tabl = Split(sFileBody, vbCrLf)
    Sheets.Add
    For Each Item In Tabl
        ctr = ctr + 1
        Cells(ctr, 1) = Item
    Next Item
End Sub
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 07/12/2011, 10h43   #7
Nouveau Membre du Club
 
Johan
Etudiant Miagiste en apprentissage (Master 2)
Inscription : avril 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Johan
Localisation : France

Informations professionnelles :
Activité : Etudiant Miagiste en apprentissage (Master 2)

Informations forums :
Inscription : avril 2011
Messages : 128
Points : 27
Points : 27
Malheureusement, j'ai "erreur d'execution", Mémoire insuffisante
johan89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 11h48   #8
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
C'est possible si ton fichier texte est gros. Le problème est que cette méthode convertit le fichier d'un seul coup. Recherche dans le forum s'il n'y a pas déjà eu une question similaire. Je vais aussi chercher de mon côté dès que j'en aurais le temps.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 17h10   #9
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Pas sûr que ça fonctionne avec ceci (je pense que cela ne fonctionne qu'à partir de XL2003) :

Code :
1
2
3
4
5
6
    Workbooks.OpenText Filename:= _
        "C:\Users\Daniel\Documents\Donnees\Daniel\mpfe\testUTF8.txt", Origin:=65001, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
        , Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
        TrailingMinusNumbers:=True
C'est le paramètre "Origin:=65001" qui importe.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 09h51   #10
Nouveau Membre du Club
 
Johan
Etudiant Miagiste en apprentissage (Master 2)
Inscription : avril 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Johan
Localisation : France

Informations professionnelles :
Activité : Etudiant Miagiste en apprentissage (Master 2)

Informations forums :
Inscription : avril 2011
Messages : 128
Points : 27
Points : 27
Bonjour,

Aucune différence malheureusement.
Je poursuis mes recherches. J'ai comme objectifs de trouver la réponse ce matin.
johan89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 10h16   #11
Nouveau Membre du Club
 
Johan
Etudiant Miagiste en apprentissage (Master 2)
Inscription : avril 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Johan
Localisation : France

Informations professionnelles :
Activité : Etudiant Miagiste en apprentissage (Master 2)

Informations forums :
Inscription : avril 2011
Messages : 128
Points : 27
Points : 27
Voici ce que j'ai :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
' charge le fichier UTF-8 dans une variable string Unicode
    sFileBody = ConvertUTF8File(NomFicLocal)
   ' Enlève le marqueur Unicode de tête (i.e. the &HFEFF sequence)
   sFileBody = Mid$(sFileBody, 2)
   Tabl = Split(sFileBody, vbCrLf)
    Sheets.Add
    For Each Item In Tabl
    Workbooks.Add
 
'       Workbooks.OpenText Filename:= _
'        "Test.xls", Origin:=65001, _
'        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
'        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
'        , Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
'        TrailingMinusNumbers:=True
 
        Range("A1") = Item
 
    Next Item
J'ai encore l'erreur de mémoire inssufisante
Il faut trouver une solution pour copier en plusieurs fois ...
johan89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 10h51   #12
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Je n'ai pas ta version d'Excel... Si tu es dans l'urgence, tu peux convertir le fichier avec le bloc-notes
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h05.


 
 
 
 
Partenaires

Hébergement Web