3

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
Community
  • 1
  • 1
CustomX
  • 9,948
  • 30
  • 85
  • 115
  • As far as I know you can't determine encoding when using ExportToTextFile. You will have to manually build a string with delimiters and save it to file through an object such as `ADODB.Stream` with required encoding. Or use OpenOffice :) –  Sep 10 '12 at 14:24
  • Doh :( well I tried creating a simple version copying column Z to a new sheet, pastespecial values, save document as .txt. But it messes up my final doc and my excel doc. – CustomX Sep 10 '12 at 14:27

1 Answers1

4

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 < 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
  • I responded to one of your earlier questions with code to save text files but can't find it? Pass the output above to that code and you have fully functional encoding and text output functions. –  Sep 10 '12 at 14:34
  • Hmmm how long ago was this, because I can't seem to find any with your answers. It seems some of my questions have dissappeared :s I thank you for your answer, but my knowledge of VBA isn't as experienced as your answer. – CustomX Sep 10 '12 at 14:42
  • So CharToEncode is the data it will copy from the worksheet to the txt file? My apologies for my insufficient knowledge of VBA. – CustomX Sep 10 '12 at 14:45
  • Yes - You could even remove the line `charToEncode = ""` and call the sub with `Sub test(ByVal charToEncode as string)`. Turn it into a function and pass in the filepath & filename as well –  Sep 10 '12 at 14:47
  • So you're saving "Télécom" to a text file encoded in UTF-8? But how would it work for an entire column? – CustomX Sep 11 '12 at 07:03
  • @ooo, Im trying to use your example, replaced the filepath to a correct path from my pc, rngarray, I put Excel.Worksheets("My Clients Sheet").Range("A3:D10000").Value and Its reading the data correctly, i'm recieving the "success" message but I can't see any file at the path location. What am I doing wrong ? Thanks ! ( I'm using your last code ) – Dan-SP Jul 22 '13 at 13:12