Excel VBA - export to UTF-8

匿名 (未验证) 提交于 2019-12-03 01:54:01

问题:

The macro I created works fine, I just need to sort out the saving business. Now I get a popup asking me where to save it, but I would like it to save it under a default name and path AND encoded in UTF-8.

This is my full code I use, the bottom part saves the document I presume.

Public Sub ExportToTextFile(FName As String, Sep As String, SelectionOnly As Boolean, AppendData As Boolean)     Dim WholeLine As String     Dim fnum As Integer     Dim RowNdx As Long     Dim ColNdx As Integer     Dim StartRow As Long     Dim EndRow As Long     Dim StartCol As Integer     Dim EndCol As Integer     Dim CellValue As String     Dim teller As Integer     'Teller aangemaakt ter controle voor het aantal velden     'teller = 1      Application.ScreenUpdating = False On Error GoTo EndMacro:     fnum = FreeFile     If SelectionOnly = True Then         With Selection             StartRow = .Cells(1).Row             StartCol = .Cells(26).Column             EndRow = .Cells(.Cells.Count).Row             EndCol = .Cells(.Cells.Count).Column         End With     Else         With ActiveSheet.UsedRange             StartRow = .Cells(1).Row             StartCol = .Cells(26).Column             EndRow = .Cells(.Cells.Count).Row             EndCol = .Cells(26).Column         End With      End If     If AppendData = True Then         Open FName For Append Access Write As #fnum     Else         Open FName For Output Access Write As #fnum     End If     For RowNdx = StartRow To EndRow         WholeLine = ""         For ColNdx = StartCol To EndCol             If Cells(RowNdx, ColNdx).Value = "" Then                 CellValue = ""             Else                 CellValue = Cells(RowNdx, ColNdx).Value             End If             WholeLine = WholeLine & CellValue & Sep         Next ColNdx         WholeLine = Left(WholeLine, Len(WholeLine) - Len(Sep))         Print #fnum, WholeLine, ""         'Print #fnum, teller, WholeLine, ""         'teller = teller + 1      Next RowNdx  EndMacro:     On Error GoTo 0     Application.ScreenUpdating = True     Close #fnum End Sub  Sub Dump4Mini()     Dim FileName As Variant     Dim Sep As String      FileName = Application.GetSaveAsFilename(InitialFileName:=Blank, filefilter:="Text (*.txt),*.txt")      If FileName = False Then         Exit Sub     End If     Sep = "|"     If Sep = vbNullString Then         Exit Sub     End If     Debug.Print "FileName: " & FileName, "Separator: " & Sep     ExportToTextFile FName:=CStr(FileName), Sep:=CStr(Sep), SelectionOnly:=False, AppendData:=False End Sub 

回答1:

This is what I use to pass http webpages and it returns a string with the correct encoding

Public Function UTF8(ByVal http As Object) As String Dim BinaryStream  Const adTypeBinary = 1 Const adTypeText = 2 Const adModeReadWrite = 3   Set BinaryStream = CreateObject("ADODB.Stream")   With BinaryStream     .Type = adTypeBinary     .Open     .Write http.responseBody      'Change stream type To binary     .Position = 0     .Type = adTypeText      'Specify charset For the source text     '.Charset = "iso-8859-1" 'unicode     .Charset = "utf-8" 'or utf-16      'Open the stream And get binary data from the object     UTF8 = .ReadText End With End Function 

Where http in this case is something like Set http = CreateObject("Microsoft.XMLHTTP") but I'm sure you can adapt to fit your needs.

This works with strings and outputs text file directly

Option Explicit  Sub test() Dim filePath As String Dim fileName As String Dim charToEncode As String Dim success As Boolean      filePath = "C:\Users\ooo\Desktop\"     fileName = "test.txt"     charToEncode = "Télécom"      success = ConvertToUTF8thenSaveToFile(charToEncode, filePath, fileName)      If success Then         MsgBox ("Success")     Else         MsgBox ("Failed")     End If End Sub  Function ConvertToUTF8thenSaveToFile(ByVal charToEncode As String, _     ByVal filePath As String, ByVal fileName As String) As Boolean      Dim fsT As Object     Dim adodbStream  As Object      On Error GoTo Err:     Set adodbStream = CreateObject("ADODB.Stream")     With adodbStream         .Type = 2 'Stream type         .Charset = "utf-8" 'or utf-16 etc         .Open         .WriteText charToEncode         .SaveToFile filePath & fileName, 2 'Save binary data To disk     End With      ConvertToUTF8thenSaveToFile = True      On Error GoTo 0      Exit Function  Err: ConvertToUTF8thenSaveToFile = False  End Function 

UPDATE: below code has been updated to create delimited string from a range, encode the string and save to a file.

Option Explicit  Sub test() Dim filePath As String Dim fileName As String Dim charToEncode As String Dim encodingType As String Dim success As Boolean Dim rngArray() As Variant       filePath = "C:\Users\ooo\Desktop\"     fileName = "test.csv"     rngArray = Sheet1.Range("A1:E10000").Value     encodingType = "utf-8"      charToEncode = DelimitRange(rngArray)     success = ConvertToUTF8thenSaveToFile(charToEncode, filePath, fileName, encodingType)      If success Then         MsgBox ("Success")     Else         MsgBox ("Failed")     End If End Sub  Function ConvertToUTF8thenSaveToFile(ByVal charToEncode As String, _     ByVal filePath As String, ByVal fileName As String, ByVal encodingCharSet As String) As Boolean      Dim fsT As Object     Dim adodbStream  As Object      On Error GoTo Err:     Set adodbStream = CreateObject("ADODB.Stream")     With adodbStream         .Type = 2 'Stream type         .Charset = encodingCharSet 'or utf-16 etc         .Open         .WriteText charToEncode         .SaveToFile filePath & fileName, 2 'Save binary data To disk     End With      ConvertToUTF8thenSaveToFile = True      On Error GoTo 0      Exit Function  Err: ConvertToUTF8thenSaveToFile = False  End Function  Function DelimitRange(ByVal XLArray As Variant) As String Const delimiter As String = "," Const lineFeed As String = vbCrLf Const removeExisitingDelimiter As Boolean = True Dim rowCount As Long Dim colCount As Long Dim tempString As String       For rowCount = LBound(XLArray, 1) To UBound(XLArray, 1)         For colCount = LBound(XLArray, 2) To UBound(XLArray, 2)              If removeExisitingDelimiter Then                 tempString = tempString & Replace(XLArray(rowCount, colCount), delimiter, vbNullString)             Else                 tempString = tempString & XLArray(rowCount, colCount)             End If              'Don't add delimiter to column end             If colCount 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!