Мне нужно идентифицировать и конвертировать даты в формате VBA в формате Excel в стандартный формат вывода - PullRequest
0 голосов
/ 22 января 2019

Я часто получаю наборы данных от клиентов в формате CSV.Я пытаюсь создать набор макросов Excel VBA для предварительной очистки данных.В частности, у меня есть проблема с датами.

В наборе, который я сейчас смотрю, некоторые поля дат содержат даты, отформатированные таким образом:

2016-03-25 14:18:03

В то время как другие отформатированынапример:

2016-03-25 14:18:02.566000

Когда Excel открывает CSV, первый формат, без долей секунды, отображается как 25.03.2016 14:18, а когда выбрана эта ячейка, формулабар содержит 25.03.2016 14:18:03.Для второго формата он отображается в формате mm: ss.0 (18: 02.6), и если я выбираю поле в excel, он отображается так же, как первый в строке формул.

I 'Я пытаюсь написать свой макрос, чтобы определить, является ли поле датой.Функция IsDate идентифицирует только первый формат как дату.Когда я смотрю, какое значение передается для второго значения, оно, очевидно, преобразовало дату в десятичное значение (в данном случае 42454.59586080556).Когда я пытаюсь отформатировать это как дату, выдается ошибка.

В настоящее время в Excel VBA я перебираю все используемые ячейки в активном листе (ActiveSheet.UsedRange.Cells).Затем для каждой ячейки я использую: If IsDate(Cell.Value) Then и, если она определена как дата, она форматируется в указанном мной формате вывода.Однако, когда он передается в десятичном виде, это не дата, поэтому он пропускает форматирование.

У меня есть другие поля, которые являются целыми и десятичными в данных, поэтому я не могу просто добавить еще одно выражение if вобрабатывать значение, если оно получено таким образом.

Единственное, о чем я могу думать сейчас, - это попытаться преобразовать десятичное число в дату (я видел способ для этого, но, похоже, не могу найтив данный момент), ТО проверяет, находится ли он в ожидаемом диапазоне, а если нет, то сохраните десятичную дробь и, если это так, сохраните дату.Но это не представляется жизнеспособным.

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

Основная проблема заключается в том, что Excel пытается перевести данные в поле при открытии файла.Кажется, я не могу найти способ помешать Excel сделать это.

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

1 Ответ

0 голосов
/ 22 января 2019

Исходя из ваших комментариев, вам, скорее всего, придется воспользоваться хакерским подходом - сравнивать преобразованные значения ваших целых / десятичных чисел и определять, попадают ли они в диапазон дат, например:

If IsDate(Cell.Value) Then
    'Do Stuff
ElseIf IsNumeric(Cell.Value) And InStr(1, Cell.Value, ".") > 0 Then
    If CDate(Left(Cell.Value, InStr(1, Cell.Value, ".") - 1)) > lowDate And CDate(Left(Cell.Value, InStr(1, Cell.Value, ".") - 1)) < highDate Then
        'Do Stuff
    End If
End If

Где lowDate и highDate - переменные, которые вы инициализируете и используете в качестве границ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...