2017-02-13 6 views
0

Я уверен, что это работает должным образом в предыдущих версиях Excelне Workbooks.OpenText разбора CSV файлов правильно Excel 2016

Test File:

d/mm/yyyy hh:mm:ss 
5/12/1999 6:01:12 
30/11/2001 5:00:00 

и разделитель между датой и временем является Космический (код ASCII 32)

  • Если файл сохраняется в виде файла .txt, метод OpenText разбирает правильно.

  • Если файл сохраняется в виде файла .csv, метод OpenText, кажется, не работает на всех

  • Если пробелы заменяются запятыми, и файл сохраняется в виде .csv файла, Метод OpenText разделит строки на два столбца, но не будет правильно интерпретировать строку даты.

Мои окна Региональные настройки являются МДГ и моя версия Excel является 2016


Option Explicit 
Sub foo() 
    Dim WB As Workbook 
    Dim sFN As String 
    Dim FD As FileDialog 

Set FD = Application.FileDialog(msoFileDialogFilePicker) 

With FD 
    .AllowMultiSelect = False 
    .Filters.Add "Text or CSV", "*.txt, *.csv", 1 
    .Show 
    sFN = .SelectedItems(1) 
End With 

Workbooks.OpenText Filename:=sFN, DataType:=xlDelimited, origin:=437, _ 
     TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _ 
     Semicolon:=False, Comma:=False, Space:=True, Other:=False, _ 
     FieldInfo:=Array(Array(1, xlDMYFormat), Array(2, xlGeneralFormat)) 


Set WB = ActiveWorkbook 

End Sub 

+0

Без знаю, что другие столбцы есть, кажется, что вы могли бы просто прочитать дату и время в качестве одного столбца Date. Похоже, что все равно Excel работает с CSV-файлом. – ThunderFrame

+0

'.Filters.Add« Текст или CSV »,« * .txt, * .csv », 1' Hm, no,' CSV' и 'Text' на самом деле ** не ** одинаковы для' Excel'. Не только то, что настройки разделителя очень специфичны для 'CSV' и ** не устанавливаются ** с использованием параметра в книге Workbooks.OpenText', также обработка Юникода - очень частный случай для' CSV' и отличается от ' Text'. –

+0

@ThunderFrame Это не сработает без изменения региональных настроек Windows. –

ответ

0

Похоже, что это может быть тот же вопрос рассматривается в этой теме:

Opening CSV files in Excel 2016

Файлы CSV представляют собой файлы с разделителями символов, а не разделенные запятой. Для более половины мира символ разделителя точку с запятой (;), не запятой (,)

Excel 2016 правильно соблюдает ваши региональные настройки Windows, и использует указанный «Список разделитель» характер

Одним из решений является изменение ваших региональных настроек для атрибута «List separator» для символа, который вы хотите, чтобы Excel по умолчанию был , используя, например запятая (,)

Это может быть изменен в:

управления сепаратором Панель/Регион/Дополнительные настройки/Список:

+0

Эта проблема не ссылалась на метод OpenText и проблемы с ним. –

0

CSV и Text действительно не то же самое для Excel. Не только то, что настройки ограничителя очень специальные для CSV и являются не, устанавливаются с использованием параметра в Workbooks.OpenText. Кроме того, при открытии CSV файлов также не будут соблюдаться другие параметры, такие как типы полей (FieldInfo). А также обработка Юникода - очень частный случай для CSV и отличается от Text.

Вы можете попробовать использовать QueryTables так:

Sub foo1() 
    Dim WB As Workbook 
    Dim sFN As String 
    Dim FD As FileDialog 

Set FD = Application.FileDialog(msoFileDialogFilePicker) 

With FD 
    .AllowMultiSelect = False 
    .Filters.Add "Text or CSV", "*.txt, *.csv", 1 
    .Show 
    sFN = .SelectedItems(1) 
End With 

Set WB = Workbooks.Add 

With WB.Worksheets(1).QueryTables.Add(Connection:= _ 
    "TEXT;" & sFN & "", Destination:=Range("$A$1")) 
    .Name = "test" 
    .TextFileParseType = xlDelimited 
    .TextFileTextQualifier = xlTextQualifierDoubleQuote 
    .TextFileConsecutiveDelimiter = True 
    .TextFileTabDelimiter = False 
    .TextFileSemicolonDelimiter = False 
    .TextFileCommaDelimiter = False 
    .TextFileSpaceDelimiter = True 
    .TextFileColumnDataTypes = Array(xlDMYFormat, xlGeneralFormat) 
    .Refresh BackgroundQuery:=False 
End With 

End Sub 

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

+0

Я надеялся избежать использования метода 'Query Tables'. –

0

Спасибо всем за предложения. Среди возможных решений я решил, в моих целях, удалить суффикс *.csv из файла. Это работает и может быть адаптируемым. QueryTable также будет работать, наряду с предостережениями, опубликованными Акселем.

Вот код, который работает для моего метода, если кому-то это интересно.


Option Explicit 
Sub foo() 
    Dim WB As Workbook, wbCSV As Workbook, swbCSV As String 
    Dim sFN As String, sCopyFN 
    Dim FD As FileDialog 

Set WB = ThisWorkbook 
Set FD = Application.FileDialog(msoFileDialogFilePicker) 

With FD 
    .AllowMultiSelect = False 
    .Filters.Add "Text or CSV", "*.txt, *.csv", 1 
    .Show 
    sFN = .SelectedItems(1) 
End With 

'If CSV, remove suffix 
sCopyFN = "" 
If sFN Like "*.csv" Then 
    sCopyFN = Left(sFN, Len(sFN) - 4) 
    FileCopy sFN, sCopyFN 
    sFN = sCopyFN 
End If 

Workbooks.OpenText Filename:=sFN, DataType:=xlDelimited, origin:=437, _ 
     TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _ 
     Semicolon:=False, Comma:=False, Space:=True, Other:=False, _ 
     FieldInfo:=Array(Array(1, xlDMYFormat), Array(2, xlGeneralFormat)) 

Set wbCSV = ActiveWorkbook 

'Get path as string since it will not be available after closing the file 
swbCSV = wbCSV.FullName 

'Move the data into this workbook 
Dim rCopy As Range, rDest As Range 

With WB.Worksheets("sheet1") 
    Set rDest = .Cells(.Rows.Count, 1).End(xlUp) 
End With 
Set rCopy = wbCSV.Sheets(1).UsedRange 

rCopy.Copy rDest 

'must close the file before deleting it 
wbCSV.Close False 
Kill swbCSV 

End Sub 

Смежные вопросы