EXCEL VBA CSV Проблема с форматированием даты - PullRequest
1 голос
/ 05 февраля 2009

Я новичок в Excel VBA. Мои извинения, если я спрашиваю, что кажется очевидным вопросом. У меня есть текстовый файл CSV, который я открываю на листе Excel. Одна строка файла содержит информацию о дате, отформатированную как «ГГ-МММ» (то есть: 9-ФЕВ или 10-МАЯ). Когда таблица Excel открывает файл, информация о дате изменяется на формат «мм / дд / гггг» и читается как 02/09/2009 или 05/10/2009, где YY-MMM теперь MM / YY / 2009 (то есть: 9-FEB становится 02/09/2009, а 10-MAY становится 05/10 / 2009).

Я хотел бы знать, можно ли переформатировать поле с YY-MMM в мм / 01 / гггг.

Я попытался разобрать поле даты после преобразования его в текст с помощью

Range("B11", "IV11").NumberFormat = "text"

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

Я безуспешно искал список параметров NumberFormat.

Если вы можете указать мне направление, это будет очень цениться.

Ответы [ 4 ]

3 голосов
/ 05 февраля 2009

Просто чтобы ответить на часть вашего вопроса, вот список вариантов форматирования даты (исключая время):

d = day of month, e.g. 7
dd = zero-padded day of month, e.g. 07
ddd = abbreviated day name, e.g. Thu
dddd = full day name, e.g. Thursday

почти то же самое за месяц ...

m = month number, e.g. 7
mm = zero padded month number, e.g. 07
mmm = abbreviated month name, e.g. Jul
mmmm = full month name, e.g. July

лет проще ...

yy = 2 digit year number, e.g. 09
yyyy = 4 digit year number, e.g. 2009

Вы можете объединить их и поместить в них любые разделители, которые вам нравятся

например.

YY-MMM, 09-FEB
DDDD-DD-MMM-YY, Wednesday-04-Feb-09
dd/mm/yyyy, 04/02/2009
mm/dd/yyyy, 02/04/2009

Я только что попробовал несколько вещей, и я думаю, что вам лучше всего изменить формат текстового файла, чтобы он соответствовал более стандартной схеме дат. Если вы можете повернуть их вспять (например, MMM-YY), все будет в порядке, или разделите их на отдельные столбцы (что, если при импорте вы определяете как разделитель, так и запятую?) Это тот случай, когда Excel пытается быть умным, это боль.

НТН

1 голос
/ 05 февраля 2009

Если вы в настоящее время используете File > Open, чтобы открыть файл CSV, вместо этого попробуйте Data > Import External Data > Import Data. Это вызывает мастера импорта текста, который может дать вам больше гибкости в том, как импортировать файл. В частности, он позволяет вам объявить столбец в файле как текстовый, чтобы Excel не пытался проанализировать значение

Как объяснил Саймон, ваша терминология для текущего формата даты неверна. 9-FEB соответствует формату d-mmm и 02-19-2009 (для данного примера намеренно изменено на однозначную дату; 02-09-2009 - 9 февраля в США, но 2 сентября в Великобритании) соответствует mm-dd-yyyy

Если вы хотите изменить NumberFormat на текст для диапазона, начинающегося в ячейке B11 и заканчивающегося в ячейке IV11, то вы должны использовать:

Range("B11:IV11").NumberFormat = "@"

@ обозначает текстовый формат, и вам нужен оператор: для указания непрерывного диапазона ячеек. Ваш оригинальный пример Range("B11","IV11") фактически указывает на объединение ячеек B11 и IV11 и, следовательно, затронул бы только две ячейки

Необычно структурировать ваши данные по строкам, а не по столбцам Вместо того чтобы указывать даты в строке 11, было бы более распространенным использовать их в столбце K, чтобы использовать Range("K2:K65535") или просто Rows("K"). Большинство встроенных в Excel материалов, таких как Sort и AutoFilter, предполагают, что ваши данные в любом случае выложен в столбцах. Строка 1 традиционно содержит имена столбцов, а затем каждая последующая строка содержит отдельную запись. Возможно, вы захотите посмотреть, как генерируется ваш CSV-файл, чтобы увидеть, можете ли вы переключить его на более удобную структуру на основе столбцов

Если в ячейке есть текст, например 19-FEB, то, если вы всегда хотите, чтобы часть года была текущим, вы можете изменить ее на первый день месяца в формате mm/dd/yyyy в VBA. В этом примере изменяется только одна ячейка, но вы можете использовать ее в качестве основы для более широкого решения:

Option Explicit

Sub main()

Dim strOrigValue As String

With ThisWorkbook.Worksheets("Sheet1").Range("B11")
    strOrigValue = .Value

    .NumberFormat = "mm/dd/yyyy"
    .Value = DateSerial(Year(Date), Month(strOrigValue), 1)
End With

End Sub

DateSerial создает серийный номер даты из заданного года, месяца и дня. Year(Date) извлекает часть года из текущей системной даты, Month(strOrigValue) берет часть месяца из данных, которые уже находятся в ячейке, и мы хотим, чтобы первый день месяца

0 голосов
/ 02 декабря 2010

Чтобы прочитать дату, вы можете сделать что-то вроде этого:

myDate = DateValue(dateText)

хотя есть предостережения относительно того, как Excel может интерпретировать даты и какие технические ограничения он имеет в какие даты он может хранить. (вам может понадобиться прочитать о максимальных и минимальных датах, и как Excel интерпретирует двузначные годы> 30 против <30, между прочим) </p>

Для форматирования даты вы можете использовать одну из трех функций:

myDateText = DatePart("yyyy", myDate) & "/" & DatePart("mm", myDate) & "/" & DatePart("dd", myDate)

или это

Format (myDate, "yyyy/mm/dd")

или это

FormatDateTime(#1/1/2020#, vbShortDate)

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

0 голосов
/ 05 февраля 2009

Предполагается, что ваш двухзначный год равен 2000. После того, как вы указали неправильную дату 9 февраля = 02/02/2009, вы можете преобразовать ее в желаемую дату по формуле: = DATE (день (B11) + 2000, месяц (В11), 1)

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