Открытие файла CSV с разделителями точкой с запятой - PullRequest
5 голосов
/ 16 февраля 2009

Как открыть файл CSV, разделенный точкой с запятой, с помощью VBA в Excel 2000?

Пример данных

An ID;TEST20090222
A Name;Firstname Surname
A Date;11.05.2000

Country:;SomeCountryName
Currency;EUR
CostA;
CostB;
CostC;
Part1;10;20;30
Part2;;;;
Part3;34;56;87

Код

В Excel 2003 11.8231.8221 SP3 с VBA 6.5.1025 я могу открыть файл с разделителями точкой с запятой со следующим кодом VBA:

Workbooks.OpenText filename:=myFilename, _
    DataType:=xlDelimited, Semicolon:=True, Local:=True

Однако, когда тот же код выполняется в Excel 2000 9.0.8961 SP1 с VBA 6.5.1025, я получаю следующую ошибку:

Ошибка компиляции: Именованный аргумент не найден

То есть - я думаю - потому что Excel 2000 не знает именованный аргумент "Local".

Поэтому я удалил часть "Local: = True". Но проблема в том, что вся строка из файла CSV записывается в одну ячейку, а не разбивается на отдельные части, разделенные точкой с запятой.

Я искал решение в Интернете, но не нашел ничего полезного и краткого.

Есть идеи?

[Обновление 17.02.2009]

Я попробовал предложение от пользователя lc с устройством записи макросов. Тем не менее, результаты были запутанными.

Когда я открываю файл CSV с помощью меню Файл-> Открыть ..., а затем выбираю файл CSV, данные, разделенные точкой с запятой, анализируются правильно. И записанный код так же просто, как:

Workbooks.Open filename:= _
               "D:\testdata\Example 01 CSV\input.csv"

Но когда я использую этот код VBA в своем макросе, каждая строка снова оказывается в одной ячейке.

В соответствии с предложением пользователя barrowc я также изменил настройки Windows «Язык и региональные стандарты» с «Немецкий (Швейцария)» на «Английский (США)» ». Даже после перезапуска Excel ничего не изменилось, такая же проблема.

Интересно, почему он работает на системе пользователя Remou . Какие региональные и языковые настройки у вас есть?

Ответы [ 8 ]

3 голосов
/ 24 марта 2009

[Обновление 22.02.2009]

Тем временем я решил проблему, написав саму функцию импорта вместо использования Workbooks.OpenText.

Я просто открываю CSV-файл как текстовый файл, читаю построчно, разбиваю каждую строку на элементы, разделенные точкой с запятой, и записываю каждый элемент в ячейку.

Sub ImportCSVFile(filepath As String)
    Dim line As String
    Dim arrayOfElements
    Dim linenumber As Integer
    Dim elementnumber As Integer
    Dim element As Variant

    linenumber = 0
    elementnumber = 0

    Open filepath For Input As #1 ' Open file for input
        Do While Not EOF(1) ' Loop until end of file
            linenumber = linenumber + 1
            Line Input #1, line
            arrayOfElements = Split(line, ";")

            elementnumber = 0
            For Each element In arrayOfElements
                elementnumber = elementnumber + 1
                Cells(linenumber, elementnumber).Value = element
            Next
        Loop
    Close #1 ' Close file.
End Sub

Получил вдохновение от Шасура: http://vbadud.blogspot.com/2007/06/vba-read-text-files-with-leading.html

Я до сих пор не знаю, почему Workbooks.OpenText не работает в моей системе, даже если он работает в системе пользователя Remou . Я думаю, это может быть связано с языком операционной системы (английский) и региональными и языковыми настройками (немецкий, Швейцария), но я не уверен.

В любом случае, обходной путь работает для меня. Спасибо всем за ваши предложения и помощь!

2 голосов
/ 08 декабря 2014

Я предпочитаю:

Workbooks.Open fileName:=myFilename, UpdateLinks:=False, Local:=True
2 голосов
/ 27 мая 2010

Еще один обходной путь - просто переименуйте файлы .csv в .txt и используйте метод OpenText.

2 голосов
/ 17 февраля 2009

Вот метод OpenText из Excel 2000:

Метод OpenText

Загружает и анализирует текстовый файл как новый рабочая тетрадь с одним листом содержит проанализированные данные текстового файла.

Синтаксис

выражение .OpenText ( Имя файла, Происхождение, StartRow, DataType, TextQualifier, ConsecutiveDelimiter, Tab, точка с запятой, Запятая, Космос, Другое, OtherChar, FieldInfo, DecimalSeparator, ThousandsSeparator )

источник

и вот версия Excel 2003:

Метод OpenText [Справочник по языку VBA в Excel 2003]

Загружает и анализирует текстовый файл как новый рабочая тетрадь с одним листом содержит проанализированные данные текстового файла.

выражение .OpenText ( FileName, Origin, StartRow, DataType, TextQualifier, ConsecutiveDelimiter, Tab, точка с запятой, запятая, пробел, другие, OtherChar, FieldInfo, TextVisualLayout, DecimalSeparator, ThousandsSeparator, TrailingMinusNumbers, Local )

источник

поэтому Local действительно был новым параметром для Excel 2003 и не будет работать в Excel 2000

Понятия не имею о причине ошибочного поведения. Параметр Local определяется как:

Локальный Необязательный Вариант . Укажите True , если региональные настройки машины следует использовать для разделители, числа и данные форматирование.

Возможно, вы захотите еще раз проверить региональные настройки на компьютере Excel 2000 и проверить, есть ли что-то, что может привести к неверной интерпретации данных. Кроме того, попробуйте явно указать параметры DecimalSeparator и ThousandsSeparator в методе Excel 2000 и посмотрите, поможет ли это

2 голосов
/ 16 февраля 2009

Я считаю, что это работает для меня в Excel 2000:

Workbooks.OpenText filename:=myFilename, _
    DataType:=xlDelimited, Semicolon:=True
2 голосов
/ 16 февраля 2009

Не уверен, но вы можете попробовать записать макрос, чтобы сделать то же самое и проверить код VBA, который он производит. Вы можете получить подсказку о том, чего не хватает.

0 голосов
/ 04 ноября 2017

Re Есть идеи?

Если вы хотите исправить файл для других, используя Excel, добавьте это в первую строку файла без кавычек с последующим переводом строки: "sep =;"

Простой способ открыть глупые файлы вручную - переименовать расширение в .txt или .htm, а затем в Excel использовать File - Open.

В VBA я рекомендую поискать метод в MSDN и вручную указывать каждый параметр. По моему опыту, это устранило большинство региональных проблем.

0 голосов
/ 21 июля 2017

часто запятая помечается как true в качестве разделителя, где обычно это десятичный разделитель. Добавить DecimalSeparator: = "," и Боб твой дядя

...