2012-03-08 3 views
5

У меня есть проблема с программным открытием файла .csv. Файл представляет собой временную серию ежедневных данных с несколькими точками данных, связанными с каждой датой.Форматы/значения формата Excel VBA изменяются, когда файл открывается программно

Когда я вручную открываю файл, даты открываются правильно, как формат даты dd/mm/yyyy. Однако, когда я открываю файл программно, даты до 12 числа каждого месяца открываются как mm/dd/yyyy, хотя формат остается dd/mm/yyyy (например, 1 июля 1983 года (1/7/1983), будет открыт как 7-й из Январь 1983 (7/1/1983) - это не просто вопрос форматирования, дата Джулиана (дни с 1 января 1901 года), связанная с этими датами, также изменяется), и даты после 12 числа каждого месяца открываются правильно, хотя в качестве текста, а не даты.

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

У кого-то была аналогичная проблема с этим в прошлом? Любые советы по этому поводу будут высоко оценены.
Cheers, Бен.

Flder = InputBox("Copy and Paste Folder path here:") 

Set FSO = CreateObject("Scripting.FileSystemObject") 
Set SourcePath = FSO.GetFolder(Flder) 

For Each File In SourcePath.Files   
    Workbooks.Open (File) 

    FlNm = File.Name 

    StrtCol = Workbooks(FlNm).Worksheets(1).Range(Cells(4, 1), Cells(4, 30)).Find ("Mean").Column 

    Workbooks(FlNm).Worksheets(1).Range(Cells(1, 1), Cells(60000, 1)).Copy (Workbooks("Find Water Years V2.xls").Worksheets(1).Range("A3")) 
    Workbooks(FlNm).Worksheets(1).Range(Cells(1, StrtCol), Cells(60000, StrtCol + 1)).Copy (Workbooks("Find Water Years V2.xls").Worksheets(1).Range("B3")) 

    Workbooks(FlNm).Close 
Next 

Проблема возникает на линии Workbooks.Open (File). Извините, что не выбрасывал это для начала.

+0

Можете ли вы определить «открыто программно»? Вы имеете в виду автоматизацию Excel? Или прямо в коде VBA? Невозможно «открыть файл», чтобы изменить любой контент; это что-то другое, но вы ничего не указали в этом вопросе. Открытие файла .csv не делает ничего, чтобы изменить содержимое сам по себе (например, в Блокноте); разместите некоторый код или другую информацию, которая показывает, как вы читаете ее и что вы делаете с текстом, который вы читаете. В противном случае, я подозреваю, что ваш вопрос будет закрыт как «не настоящий вопрос». :) –

+0

Извините за отсутствие ясности на одном Кене, код ниже. –

+0

Согласитесь с Кеном здесь. Есть основная причина. Как выглядит файл в блокноте в этот момент, как вы открываете файл? Его втягивают в шаблон. Pasted? – datatoo

ответ

0

Я мог бы попытаться импортировать весь файл .csv в качестве разделенных запятыми текста, а не на самом деле открытия файла, однако, было бы проще и быстрее, если бы я мог остановить даты от изменения, когда я открываю файл.

Это по-прежнему быстро, если вы откроете его, как CDT. Вы просто используете .OpenText вместо .Open. Остальная часть кода остается такой же :)

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

Workbooks.OpenText Filename:= File, _ 
Origin:=437, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _ 
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _ 
Comma:=True, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _ 
TrailingMinusNumbers:=True 
+0

Мой опыт OpenText не работает, если даты не отформатированы mdy – user2981639

+0

Нет. Но вы можете принудительно импортировать ** в виде текста **, манипулировать текстом, чтобы иметь правильный однозначный формат (предпочтительный ISO, который является YYYY-MM -DD) и применить CDate к такой управляемой строке. – Ister

4

Поскольку вопрос уже был дан ответ на ОП в комментариях, но не отвечал как официальный ответ, который я положу его здесь, в случае, если кто-то пропускает его, как я сделал.

workbook = workbooks.Open(filename, Local:= true) 

Устанавливая Local = верно использует локальный формат даты машины, а не предполагая, MDY так в локалей, такие как Австралия (ДМГ) он будет изменить поведение Open()

0

Я обнаружил, что user2981639 было правильная идея, но я получил синтаксическую ошибку с «Local: true», поэтому . Вместо этого я использовал «local: = True».

Эта проблема сводило меня с ума, потому что у меня также было 2 поля memo в файле csv. Если бы я попытался отформатировать даты каким-либо образом, поля memo не будут импортированы правильно, они либо будут усечены до 255 символов, либо любые внедренные символы CRLF разрежу запись на части в зависимости от того, сколько их было.

Спасибо ребята за размещение

+0

Спасибо, я исправил свой синтаксис – user2981639

0

Здесь вы видите рабочий код с примером. Эта проблема тоже разочаровала меня. Я открывал файл .txt в excel, а дата, в которую я использовал, была конвертирована из формата dd-mm-yyyy в формат mm-dd-yyyy. Ниже вы видите решение. Он лежал в последней команде (, Local: = True). Смотри ниже. Надеюсь, поможет.

Note that while trasferring .txt file to excel use File Origin as "xlWindows: 
    Workbooks.OpenText Filename:= _ 
    ThisWorkbook.Worksheets("Reporting").Cells(3, 6), Origin:=xlWindows, _ 
    StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(49 _ 
    , 1), Array(50, 1), Array(67, 1), Array(80, 1), Array(93, 1), Array(106, 1), Array(119, 1)) _ 
    , DecimalSeparator:=",", ThousandsSeparator:=".", TrailingMinusNumbers:= _ 
    True, Local:=True 

ПРИМЕЧАНИЕ: отдых над настройками для разделителя массива и десятичного разделителя - это моя конкретная работа - может не относиться к вам.

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