我已经在这里找到了部分解决方案,因为我的编码带有一些法语单词...
然而!很少有人在做问题,我无法弄清楚原因。我试图用单独的VBA脚本直接用这些字符复制这个有问题的单词而且没关系,这对我来说真是个谜!
使用复杂的翻译代码(see old post),在excel表格中,我有Français,在XML中则出现错误的表示Français
可行的CODE
Sub EncodingRepair()
Dim strLine As String
Dim strPath As String
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim strFolderPath As String
strFolderPath = "C:\Users\zema\Documents\"
Set fOutputFile = fso.CreateTextFile(strFolderPath & "EncodingRepair.xml", True)
strLine = ThisWorkbook.Worksheets("wording").Range("G16").Text
fOutputFile.WriteLine (strLine & vbCrLn)
End Sub
这里唯一不同的是加载字符串...在这个小代码中我从直接Cell加载Text(仅用于尝试),在我的复杂代码中,有来自 .Range 对象的加载put finded .Row
复杂的CODE我最后几句话有问题
If intChoice <> 0 Then
strPath = Application.FileDialog( _
msoFileDialogOpen).SelectedItems(1)
Dim strFolderPath As String
strFolderPath = Left(strPath, Len(strPath) - 4)
Set fGermanOutputFile = fso.CreateTextFile((strFolderPath & "_German.xml"), True, True)
Set fItalianOutputFile = fso.CreateTextFile((strFolderPath & "_Italian.xml"), True, True)
Set fFrenchOutputFile = fso.CreateTextFile((strFolderPath & "_French.xml"), True, True)
Open strPath For Input As #1
AlarmString = "RESETNoTranslation"
Do Until EOF(1)
Line Input #1, strLine
AllLine = strLine
Alarm = InStr(1, strLine, AlarmString)
intLastFoundChar = 0
strGermanLine = ""
strFrenchLine = ""
strItalianLine = ""
For intI = 0 To (UBound(ArrStrOpeningTags, 1) - 1)
intFoundString = InStr(strLine, ArrStrOpeningTags(intI))
If intFoundString <> 0 Then
intI = 4
End If
Next intI
If ((intFoundString <> 0) And (Alarm = 0)) Then
For intJ = 0 To (UBound(ArrStrParamsToReplace) - 1)
strLine = Right(strLine, Len(strLine) - intLastFoundChar)
strStringToLookFor = (ArrStrParamsToReplace(intJ) & "=""")
intFoundString = InStr(1, strLine, strStringToLookFor, vbBinaryCompare)
If intFoundString <> 0 Then
intStringSplitIndex = (intFoundString + Len(strStringToLookFor))
strStringToLookFor = Right(strLine, Len(strLine) - intStringSplitIndex + 1)
strDummyString = Left(strLine, intStringSplitIndex - 1)
strGermanLine = strGermanLine & strDummyString
strFrenchLine = strFrenchLine & strDummyString
strItalianLine = strItalianLine & strDummyString
intLastFoundChar = intLastFoundChar + intStringSplitIndex
intFoundString = InStr(strStringToLookFor, """")
If intFoundString <> 0 strStringToLookFor = Left(strStringToLookFor, intFoundString - 1)
Set rngFoundString = rngEnglishDictionary.Find(strStringToLookFor)
If (rngFoundString Is Nothing) Then
Debug.Print "String " & strStringToLookFor & " not found!"
strGermanLine = strGermanLine & strStringToLookFor & """"
strFrenchLine = strFrenchLine & strStringToLookFor & """"
strItalianLine = strItalianLine & strStringToLookFor & """"
Else
intWordToReplaceIndex = rngEnglishDictionary.Find(strStringToLookFor).Row - rngEnglishDictionary.Row + 1
strGermanLine = strGermanLine & rngGermanDictionary(intWordToReplaceIndex) & """"
strFrenchLine = strFrenchLine & rngFrenchDictionary(intWordToReplaceIndex) & """"
strItalianLine = strItalianLine & rngItalianDictionary(intWordToReplaceIndex) & """"
End If
intLastFoundChar = intLastFoundChar + Len(strStringToLookFor)
End If
End If
Next intJ
If intJ = 2 Then
strEndOfLine = Right(AllLine, Len(AllLine) - intLastFoundChar)
strGermanLine = strGermanLine & strEndOfLine
strFrenchLine = strFrenchLine & strEndOfLine
strItalianLine = strItalianLine & strEndOfLine
End If
Else
strGermanLine = strLine
strFrenchLine = strLine
strItalianLine = strLine
End If
fGermanOutputFile.WriteLine (strGermanLine & vbCrLn)
fFrenchOutputFile.WriteLine (strFrenchLine & vbCrLn)
fItalianOutputFile.WriteLine (strItalianLine & vbCrLn)
strGermanLine = ""
strFrenchLine = ""
strItalianLine = ""
Loop
End If
End Sub
答案 0 :(得分:0)
您的输入文件不是Unicode而是utf-8,因此fso TextStream
方法不适用于读取,因为FileSystemObject只知道ASCII和Unicode,而不知道Utf-8。对于后者,您需要引用Microsoft ActiveX数据对象和ADODB.Stream。
这是一个可以围绕代码构建的示例,它使用UTF-8作为输入编码并将Unicode写入“EncodingRepair.xml”文件:
Sub EncodingRepair()
Dim strPath As String
Dim fso As Object, inFile As Object
Dim fOutputFile As Object, AllLine As String
Dim LineArray As Variant
Dim strFolderPath As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set inFile = CreateObject("ADODB.Stream")
strFolderPath = "C:\Users\zema\Documents\"
strPath = "C:\00_Tools\test\test.txt"
Set fOutputFile = fso.CreateTextFile("C:\00_Tools\test\EncodingRepair.xml", True, True)
Set inFile = CreateObject("ADODB.Stream")
inFile.Charset = "utf-8"
inFile.Open
inFile.LoadFromFile (strPath)
AlarmString = "RESETNoTranslation"
While Not inFile.EOS
alltext = inFile.ReadText
LineArray = Split(alltext, vbCrLf)
For i = 0 To UBound(LineArray)
AllLine = LineArray(i)
'do your magic
fOutputFile.WriteLine AllLine
Next i
Wend
End Sub
确保在阅读和写作时始终使用正确的编码。