Импортировать CSV (UTF-8) в Excel без форматирования - PullRequest
0 голосов
/ 17 октября 2019

У меня есть код для вставки данных из файла CSV в рабочую таблицу. Everyhting работает хорошо, но я сталкиваюсь с некоторыми проблемами с текущим решением.

Есть ли способ вставить данные без форматирования? Теперь Excel форматирует, например, от -Name до =-Name, поэтому вместо значений указывается #Name? ошибок. Также он форматирует 215067910018 в 2,15068E+11.

Мои строки CSV выглядят так:

123456,"Word1","Word2","-Word3",,"Word4","Word5","00076",,"Word7","Word8"

После запуска кода "-Word3" выглядит как #Name? в ячейке Excel. Также вместо 00076 я получаю 76

Вот мой текущий код:

Sub GetCustomers()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets.Add(After:= _
             ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    ws.Name = "Sheet1"

    Dim strText As String

    Dim file As String
    file = "L:\15\186507.CSV

    ' read utf-8 file to strText variable
   With CreateObject("ADODB.Stream")
        .Open
        .Type = 1  ' Private Const adTypeBinary = 1
        .LoadFromFile file
        .Type = 2  ' Private Const adTypeText = 2
        .Charset = "utf-8"
        strText = .ReadText(-1)  ' Private Const adReadAll = -1
    End With

    ' parse strText data to a sheet
    intRow = 1
    For Each strLine In Split(strText, Chr(10))
        If strLine <> "" Then
            With ws
                .Cells(intRow, 1) = strLine
                .Cells(intRow, 1).TextToColumns Destination:=Cells(intRow, 1), DataType:=xlDelimited, _
                    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
                    Semicolon:=False, Comma:=True, Space:=False, Other:=False
            End With

            intRow = intRow + 1
        End If
    Next strLine

End Sub

РЕДАКТИРОВАТЬ:

IЯ могу сделать это во время преобразования текста в столбцы вручную. Разве это не должно быть возможно VBA? Я имею в виду установить формат данных столбца в то время как .TextToColumns

enter image description here

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Вы можете использовать FieldInfo, который является параметром TextToColumns, чтобы указать тип данных. Например, чтобы указать текст для столбца 1 и столбца 4, вы должны иметь следующее ...

.Cells(intRow, 1).TextToColumns _
            Destination:=.Cells(intRow, 1), _
            DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, _
            ConsecutiveDelimiter:=False, _
            Tab:=False, _
            Semicolon:=False, _
            Comma:=True, _
            Space:=False, _
            Other:=False, _
            FieldInfo:=Array(Array(1, 2), Array(2, 1), Array(3, 1), Array(4, 2), Array(5, 1), _
                Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1))

Для каждой пары в массиве первое число обозначает номер столбца, а второе число -тип данных (1 = общий; 2 = текстовый и т. д.). Для более подробной информации, посмотрите здесь .

0 голосов
/ 17 октября 2019

Я пытался установить формат целевых ячеек на Text (иногда работает, например, при операции копирования), но это тоже не помогло .....

Не элегантное решение, но сработалодля меня при тестировании - исправление любых формул, введенных операцией. TextToColumns впоследствии. Смотрите ниже:

Dim cl As Range, rg As Range

и как часть вашей strLine Loop

On Error Resume Next
Set rg = .Rows(1).SpecialCells(xlFormulas)
If Err.Number = 0 Then                                      'Test if SpecialCells retuned something
    For Each cl In .Rows(intRow).SpecialCells(xlFormulas)
        cl.Value = Mid(cl.Formula, 2)                       'Get rid of the erreanously introduced "="
    Next cl
End If
On Error GoTo 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...