Не распознаются даты
Начинаю бороться. Заменяю "/" и "-" на ".", получаю 30.11.05 - строку.
Если к этой строке специальной вставкой прибавить 0 или умножить ее на 1, то получится дата, но если это делать макросом, то строка останется строкой.
Как мне макросом сделать из строки дату???
Открываю Excel-eм текстовый файл, в котором даты записаны как 30/11-05. Если делаю это руками, даты распознаются отлично. Если запускаю макрос (записанный в момент, когда делал это руками), строка воспринимается как текст.
Начинаю бороться. Заменяю "/" и "-" на ".", получаю 30.11.05 - строку.
Если к этой строке специальной вставкой прибавить 0 или умножить ее на 1, то получится дата, но если это делать макросом, то строка останется строкой.
Как мне макросом сделать из строки дату???
А функцией [COLOR=blue]CDate()[/COLOR] пользоваться не пробовали?
А функцией [COLOR=blue]CDate()[/COLOR] пользоваться не пробовали?
Спасибо! Это полезная функция и я про нее не знал, но...
Пишу код
Range(Cells(WorksheetFunction.CountA(Columns("B")), 2), Cells(2, 2)).Select
For Each Cell In Selection
Cell = CDate(Cell)
Next Cell
он работает, в макросе вижу что Cell из 30/11-05 превратилась в 30.11.2005, но на листе изменений нет.
На самом деле Excel сразу понимает, что это дата и с ней можно работать. Но загвоздка в том, что я не могу получить какой диапазон дат у меня закачен, с такими датами почему-то не работают функции "макс" и "мин".
Оба предложенных варианта позволяют получить корректный результат, на всякий случай проверено ещё раз, вручную и программно (MS Excel 97/2000)
или
Cell.Value = DateValue(Cell.Value)
P.S. В представленном файле все "даты" представляют собой именно текст.
{=МИН(ДАТАЗНАЧ(C2:C5))}
{=МАКС(ДАТАЗНАЧ(C2:C5))}
Однако, эти формулы не будут возвращать корректный результат, если в указанном диапазоне также будут находиться даты, представленные именно в числовом формате, поэтому в Вашем конкретном случае можно использовать более универсальные формулы, например :
{=МИН((C2:C5)*1)}
{=МАКС((C2:C5)*1)}
Все представленные формулы являются формулами массива, а значит после их ввода необходимо обязательно нажать CTRL + SHIFT + ENTER
P.S. Если и этот вариант Вам не поможет, то есть один радикальный способ борьбы с числовыми значениями, которые MS Excel интепритирует как текст.
Если ничего из вышепредложенного не помогает, то можно использовать стандартную функцию рабочего листа =ДАТАЗНАЧ(), которая и предназначена для работы с "датами", которые MS Excel воспринимает как текст. Для опредения макс/мин, можно использовать следующие формулы :
{=МИН(ДАТАЗНАЧ(C2:C5))}
{=МАКС(ДАТАЗНАЧ(C2:C5))}
Однако, эти формулы не будут возвращать корректный результат, если в указанном диапазоне также будут находиться даты, представленные именно в числовом формате, поэтому в Вашем конкретном случае можно использовать более универсальные формулы, например :
{=МИН((C2:C5)*1)}
{=МАКС((C2:C5)*1)}
Все представленные формулы являются формулами массива, а значит после их ввода необходимо обязательно нажать CTRL + SHIFT + ENTER
P.S. Если и этот вариант Вам не поможет, то есть один радикальный способ борьбы с числовыми значениями, которые MS Excel интепритирует как текст.
Уважаемый pashulka! Спасибо Вам огромное!
Я как обычно не догадался пользоваться массивами, а они в данной ситуации очень помогают.
В связи с этим остаются 2 вопроса:
1. Можно ли присвоить переменной значение любой из этих формул, не пользуясь ячейкой Excel?
2. Пока я пытался сделать строку датой, обнаружил еще одну проблемму. При импорте макросом дат, число которых меньше 12, дата переворачивается (01/12-05 превращается в 12.01.05), и переделать ее уже не представляется возможным (мне по-крайней мере).
При импорте вручную этой проблеммы нет.
Так же данной проблеммы не существует на более ранних версиях Excel (у меня стоит Excel 2002).
Можно ли бороться с этим и если можно, то как? (может поможет тот самый радикальный способ? :) )
Примеры для импорта прилагаю.
"\конкорд.txt", Origin:=xlMSDOS, _
StartRow:=1, DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), _
Array(6, 4), Array(15, 1), _
Array(19, 1)), TrailingMinusNumbers:=True
При импорте макросом дат, число которых меньше 12, дата переворачивается (01/12-05 превращается в 12.01.05) ...
Можно ли бороться с этим и если можно, то как?
Хотя вопрос был адресован и не мне, но рискну предложить свой совет.
Попробуйте воспользоваться возможностями функции [COLOR=blue]Format()[/COLOR]. Вот пример:
Range("a1").Value = Format(CDate(xDate), "dd.mm.yyyy")'Здесь 1 января.
Range("a2").Value = Format(CDate(xDate), "mm.dd.yyyy")'Здесь 12 января.
Илья, У меня нет MS Excel XP с которым у Вас возникают проблемы, однако я специально направил свои стопы к тем у кого он наличествует. И пришёл к выводу, что Вы не обратили внимание на мой совет явно указать формат данных нужных столбцов в мастере импорта [Шаг 3]
"\конкорд.txt", Origin:=xlMSDOS, _
StartRow:=1, DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), _
Array(6, 4), Array(15, 1), _
Array(19, 1)), TrailingMinusNumbers:=True
Стыд мне и позор!
Почему-то у меня в голове отложилось, что я пробовал указывать формат данных на Шаге 3 и это не помогло :(. И не знал, что вторая цифра Array отвечает за формат данных.
Dmitrii!
Спасибо за желание помочь, но проблема состояла в том, что дата после импорта уже превратилась из 01/12-05 в 12.01.05. Нужно было ее вернуть обратно в 01.12.05. Теперь, пользуясь указанием формата даты при импорте, проблема решена.
Еще раз всем спасибо за помощь!
... она возвращает строку...
Разумеется, следовало написать:
Range("a2").Value = CDate(Format(xdate, "mm.dd.yyyy"))
Виноват.