Excel VBA - 导出到 UTF-8
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12352958/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Excel VBA - export to UTF-8
提问by CustomX
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.
我创建的宏工作正常,我只需要理清储蓄业务。现在我收到一个弹出窗口,询问我在哪里保存它,但我希望它以默认名称和路径保存并以 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
回答by user3357963
This is what I use to pass http webpages and it returns a string with the correct encoding
这是我用来传递 http 网页的内容,它返回一个具有正确编码的字符串
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.
凡http
在这种情况下是一样的东西Set http = CreateObject("Microsoft.XMLHTTP")
,但我敢肯定,你可以在里面找到适合您的需求。
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 < UBound(XLArray, 2) Then tempString = tempString & delimiter
Next colCount
'Add linefeed
If rowCount < UBound(XLArray, 1) Then tempString = tempString & lineFeed
Next rowCount
DelimitRange = tempString
End Function