2017-07-25 5 views
2

J'ai un code VBA Excel qui prend les données japonaises de la feuille excel le compare avec les données japonaises dans un fichier texte et remplace les mots japonais par des mots anglais. Mais je suis supposé être capable de le faire sur un fichier texte UTF-8. Ce code remplace tous les mots japonais avec des caractères étranges. Comment puis-je sauvegarder sans problème?Convertir UTF-8 en ANSI en utilisant VBA

Open sFileName For Input As iFileNum 

For n = 1 To lngLastCell 
Label5.Caption = n & "/" & lngLastCell 
searchtext = MySearch(n) 
valuetext = MyText(n) 

eplcCount = 0 
spltCount = 0 

searchpart = Array(searchtext) 
valuepart = Array(valuetext) 

Do Until EOF(iFileNum) 
Line Input #iFileNum, sBuf 
sTemp = sTemp & sBuf & vbCrLf 

Loop 


Close iFileNum 

sTemp = Replace(sTemp, searchtext, valuetext) 

'iFileNum = FreeFile 
Open sFileName For Output As iFileNum 
Print #iFileNum, sTemp 

Next n 

Le code fonctionne bien avec les caractères ANSI.

Répondre

1

La fonction Open de VBA fonctionne sur les fichiers codés ANSI uniquement et binaire. Si vous souhaitez lire/écrire un fichier utf-8, vous devrez trouver un autre moyen.

Le codage utf-8 dispose d'un ensemble de caractères plus grands que ANSI, donc il est impossible de convertir ANSI-utf-8 sans perte. Cela dit, un String dans Excel et VBA est stocké en tant que utf-16 (l'éditeur VBA utilise toujours ANSI), donc vous avez seulement besoin de convertir de utf-8 à utf-16.

Avec ADODB.Stream:

Public Function ReadFile(path As String, Optional CharSet As String = "utf-8") 
    Static obj As Object 
    If obj Is Nothing Then Set obj = VBA.CreateObject("ADODB.Stream") 
    obj.CharSet = CharSet 
    obj.Open 
    obj.LoadFromFile path 
    ReadFile = obj.ReadText() 
    obj.Close 
End Function 

Public Sub WriteFile(path As String, text As String, Optional CharSet As String = "utf-8") 
    Static obj As Object 
    If obj Is Nothing Then Set stream = VBA.CreateObject("ADODB.Stream") 
    obj.CharSet = CharSet 
    obj.Open 
    obj.WriteText text 
    obj.SaveToFile path 
    obj.Close 
End Sub