2016-04-05 4 views
1

Я не могу понять, как сообщить VBA правильный формат даты, так как кажется, что он ошибается. Таким образом, CDate("24/02/2016 10:59") дает правильную дату - дд/мм/гггг. Однако, когда он выполняет итерацию через дату, например, CDate("01/03/2016 00:59"), он предполагает, что номер 03 - это не месяц, а день, поэтому VBA предполагает, что это mm/dd/yyyy, поэтому он дает мне дату 03/01/2016, что неправильно и беспорядок моих данных. Итак, как я могу сказать VBA, что это действительно формат dd/mm/yyyy. Кажется, что VBA автоматически подбирает красиво, даже если это "2016/01/14", но это не удается, когда не совсем очевидно, какая часть чисел составляет месяцы, например. оба и mm составляют менее 12.Определенный пользователем формат даты в VBA Access

Я читаю эту дату из CSV-файла, используя WS.Cells(irow, icol).Value.

Это то, что я пытался до сих пор:

datDate = CDate(Format(WS.Cells(iRow, iCell).Value, "dd-mmm-yyyy hh:mm:ss"))

+1

Я почти уверен, что это связано с ваши региональные настройки даты (я полагаю, вы находитесь за пределами США, правильно?). Стандартный формат даты в США - 'mm/dd/yyyy', а VBA ** использует этот формат **, даже если региональные настройки в приложении Excel отличаются.Скорее всего, вам нужно будет проанализировать дату, чтобы убедиться, что вы получите правильный месяц и день, как @Gustav предложил ниже. –

ответ

2

Когда функция CDate() встречает двусмысленную строку даты "aa/bb/yyyy", она будет интерпретироваться в соответствии с порядком, который месяц и день отображаются в формате коротких дат, определяемом региональными настройками в Windows.

Например:

Когда моя машина установлена ​​на «Английский (США)» с коротким формате даты M/d/yyyy затем Month(CDate("02/04/2016")) возвращается 2.

Однако после изменения моих региональных настроек на «Английский (Канада)» с коротким форматом даты dd/MM/yyyy затем Month(CDate("02/04/2016")) возвращается 4.

Обратите внимание, что это отличается от поведения двигателя базы данных Jet/ACE при интерпретации двусмысленных #aa/bb/yyyy# данных литералов в операциях SQL. В этом случае они всегда будут интерпретировать их как mm/dd/yyyy независимо от региональных настроек.

Лучшее решение, как всегда, чтобы гарантировать, что строковое представление использует однозначную формат даты, например, 2016/02/04 будет всегда быть истолковано как февраль 4.

2

Используйте мм/дд/гггг чч: пп: сс, как:

#03/01/2016 16:32:58# 

или DateSerial и TimeSerial:

DateSerial(2016, 03, 01) + TimeSerial(16, 32, 58) 

Чтобы проанализировать строку, используйте Mid:

TrueDate = Dateserial(Mid(s, 7, 4), Mid(s, 4, 2), Mid(s, 1, 2)) + TimeSerial(Mid(s, 12, 2), Mid(s, 15, 2), 0) 

s = "01/03/2016 00:59" 
' Returns: 2016-03-01 00:59:00 

s = "24/02/2016 10:59" 
' Returns: 2016-02-24 10:59:00 
+0

Я пытаюсь прочитать данные, не пытающиеся изменить существующие данные, которые появляются каждый месяц в этом формате даты. – Curtis

+0

Это было не то, что вы сказали. – Gustav

+0

У меня есть код для синтаксического анализа строк этого формата. – Gustav

-1

Измените формат даты перед конвертированием. Что-то вроде этого;

Dim strDate As String, strFormatDate As String 
Dim dte As Date 

strDate = "01/03/2016 00:59" 

strFormatDate = Format(strDate, "dd-mmm-yyyy hh:nn") 

dte = CDate(strFormatDate) 

Это изменяет строку даты на 01-Мар-2016 00:59, которая должна быть преобразована в тип данных даты без путаницы.

+0

Жаль, что это тоже не работает, оно все еще конвертируется в «03/01/2016 00:59:00». Если вы проверите свой код в отдельной подпрограмме - он отлично работает, так же как и мой предыдущий код 'CDate (« 01/03/2016 00:59 »)'. Для записи я читаю эту дату из файла CSV, используя 'WS.Cells (irow, icol) .Value'. Я очень смущен ... – Curtis

+0

@ Kudrat - попробуйте использовать '.Value2' вместо' .Value' –

+0

@Scott, извините, нет успеха – Curtis

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