У меня есть задача, где мне нужно экспортировать каждый лист рабочей книги в Excel как отдельный файл .csv с кодировкой utf-8. Первоначально мне было предложено сделать это, чтобы сохранить каждый текст в формате Юникод, а затем обработать их и заменить все разделители табуляции запятыми. У меня есть следующий код, который дает мне часть пути туда. Сбой с кодом ошибки 3002 при попытке выполнить BinaryStream.LoadFromFile FileName. Из того, что я обнаружил, это потому, что файл уже должен быть открыт в Excel, и поэтому функция не может загрузить его в поток ADODB. Помимо этого я довольно застрял. Любая помощь в решении этой проблемы будет принята с благодарностью!
Public Sub ExportSheetsToCSV()
Dim wsExport As Worksheet
Dim wbkExport As Workbook
Dim fileLoc As String
fileLoc = selectDialog() 'Function which allows the user to select the location from a browser window
'fileLoc = "h:\test\"
For Each wsExport In Worksheets
wsExport.Select
nm = wsExport.Name
If Not IsActiveSheetEmpty() Then
Rows("1:1").Select 'deletes header line
Selection.Delete Shift:=xlUp
ActiveSheet.SaveAs FileName:=fileLoc & "\" & nm & ".txt", FileFormat:=xlUnicodeText
readAndReplace (fileLoc & "\" & nm)
Application.DisplayAlerts = True
End If
Next wsExport
End Sub
Private Sub readAndReplace(fileNameRead As String)
Dim pos1 As Long, pos2 As Long, i As Long
Dim fileWrite As String, line As String, fileNameWrite As String
Dim writeStream As Object
fileWrite = Replace(ReadTextFile(fileNameRead), vbTab, ",")
Set writeStream = CreateObject("ADODB.Stream")
writeStream.Type = 2
writeStream.CharSet = "utf-8"
writeStream.Open
writeStream.WriteText fileWrite
writeStream.SaveToFile fileNameWrite, 2
End Sub
'Function from "http://www.motobit.com/tips/detpg_read-write-binary-files/"
Function ReadTextFile(FileName)
Const adTypeText = 2
'Create Stream object
Dim BinaryStream
Set BinaryStream = CreateObject("ADODB.Stream")
'Specify stream type - we want To get binary data.
BinaryStream.Type = adTypeText
'Specify charset For the source text (unicode) data.
'If Len(CharSet) > 0 Then
'BinaryStream.CharSet = CharSet
'End If
BinaryStream.CharSet = "utf-8"
'Open the stream
BinaryStream.Open
'Load the file data from disk To stream object
BinaryStream.LoadFromFile FileName
'Open the stream And get binary data from the object
ReadTextFile = BinaryStream.ReadText
End Function