Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не распознаются даты

9.8K
29 ноября 2005 года
Ilya_26
19 / / 29.09.2005
Открываю Excel-eм текстовый файл, в котором даты записаны как 30/11-05. Если делаю это руками, даты распознаются отлично. Если запускаю макрос (записанный в момент, когда делал это руками), строка воспринимается как текст.
Начинаю бороться. Заменяю "/" и "-" на ".", получаю 30.11.05 - строку.
Если к этой строке специальной вставкой прибавить 0 или умножить ее на 1, то получится дата, но если это делать макросом, то строка останется строкой.
Как мне макросом сделать из строки дату???
405
29 ноября 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by Ilya_26
Открываю Excel-eм текстовый файл, в котором даты записаны как 30/11-05. Если делаю это руками, даты распознаются отлично. Если запускаю макрос (записанный в момент, когда делал это руками), строка воспринимается как текст.
Начинаю бороться. Заменяю "/" и "-" на ".", получаю 30.11.05 - строку.
Если к этой строке специальной вставкой прибавить 0 или умножить ее на 1, то получится дата, но если это делать макросом, то строка останется строкой.
Как мне макросом сделать из строки дату???


А функцией [COLOR=blue]CDate()[/COLOR] пользоваться не пробовали?

 
Код:
myDate = CDate("30/11-05")
9.8K
29 ноября 2005 года
Ilya_26
19 / / 29.09.2005
Цитата:
Originally posted by Dmitrii
А функцией [COLOR=blue]CDate()[/COLOR] пользоваться не пробовали?
 
Код:
myDate = CDate("30/11-05")



Спасибо! Это полезная функция и я про нее не знал, но...
Пишу код
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 сразу понимает, что это дата и с ней можно работать. Но загвоздка в том, что я не могу получить какой диапазон дат у меня закачен, с такими датами почему-то не работают функции "макс" и "мин".

9.8K
29 ноября 2005 года
Ilya_26
19 / / 29.09.2005
Вот еще кусочек файла с моими несчастными датами...
275
29 ноября 2005 года
pashulka
985 / / 19.09.2004
Илья, Можно при импорте текстового файла явно указать формат данных нужных столбцов, причём непосредственно в Мастере Импорта [Шаг 3], либо после импорта заменить - на /
Оба предложенных варианта позволяют получить корректный результат, на всякий случай проверено ещё раз, вручную и программно (MS Excel 97/2000)

или

 
Код:
Cell.Value = CDate(Cell.Value)
Cell.Value = DateValue(Cell.Value)


P.S. В представленном файле все "даты" представляют собой именно текст.
275
30 ноября 2005 года
pashulka
985 / / 19.09.2004
Если ничего из вышепредложенного не помогает, то можно использовать стандартную функцию рабочего листа =ДАТАЗНАЧ(), которая и предназначена для работы с "датами", которые MS Excel воспринимает как текст. Для опредения макс/мин, можно использовать следующие формулы :

{=МИН(ДАТАЗНАЧ(C2:C5))}
{=МАКС(ДАТАЗНАЧ(C2:C5))}

Однако, эти формулы не будут возвращать корректный результат, если в указанном диапазоне также будут находиться даты, представленные именно в числовом формате, поэтому в Вашем конкретном случае можно использовать более универсальные формулы, например :

{=МИН((C2:C5)*1)}
{=МАКС((C2:C5)*1)}

Все представленные формулы являются формулами массива, а значит после их ввода необходимо обязательно нажать CTRL + SHIFT + ENTER

P.S. Если и этот вариант Вам не поможет, то есть один радикальный способ борьбы с числовыми значениями, которые MS Excel интепритирует как текст.
9.8K
01 декабря 2005 года
Ilya_26
19 / / 29.09.2005
Цитата:
Originally posted by pashulka
Если ничего из вышепредложенного не помогает, то можно использовать стандартную функцию рабочего листа =ДАТАЗНАЧ(), которая и предназначена для работы с "датами", которые 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).
Можно ли бороться с этим и если можно, то как? (может поможет тот самый радикальный способ? :) )
Примеры для импорта прилагаю.

275
01 декабря 2005 года
pashulka
985 / / 19.09.2004
Илья, У меня нет MS Excel XP с которым у Вас возникают проблемы, однако я специально направил свои стопы к тем у кого он наличествует. И пришёл к выводу, что Вы не обратили внимание на мой совет явно указать формат данных нужных столбцов в мастере импорта [Шаг 3]

 
Код:
Workbooks.OpenText Filename:=ThisWorkbook.Path & _
          "\конкорд.txt", Origin:=xlMSDOS, _
          StartRow:=1, DataType:=xlFixedWidth, _
          FieldInfo:=Array(Array(0, 1), _
          Array(6, 4), Array(15, 1), _
          Array(19, 1)), TrailingMinusNumbers:=True
405
02 декабря 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by Ilya_26
При импорте макросом дат, число которых меньше 12, дата переворачивается (01/12-05 превращается в 12.01.05) ...
Можно ли бороться с этим и если можно, то как?


Хотя вопрос был адресован и не мне, но рискну предложить свой совет.
Попробуйте воспользоваться возможностями функции [COLOR=blue]Format()[/COLOR]. Вот пример:

 
Код:
xDate = "01/12-05"
Range("a1").Value = Format(CDate(xDate), "dd.mm.yyyy")'Здесь 1 января.
Range("a2").Value = Format(CDate(xDate), "mm.dd.yyyy")'Здесь 12 января.
9.8K
02 декабря 2005 года
Ilya_26
19 / / 29.09.2005
Цитата:
Originally posted by pashulka
Илья, У меня нет MS Excel XP с которым у Вас возникают проблемы, однако я специально направил свои стопы к тем у кого он наличествует. И пришёл к выводу, что Вы не обратили внимание на мой совет явно указать формат данных нужных столбцов в мастере импорта [Шаг 3]

 
Код:
Workbooks.OpenText Filename:=ThisWorkbook.Path & _
          "\конкорд.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. Теперь, пользуясь указанием формата даты при импорте, проблема решена.

Еще раз всем спасибо за помощь!

275
02 декабря 2005 года
pashulka
985 / / 19.09.2004
Dmitrii, Сам люблю функцию Format, даже несмотря на то, что она возвращает строку, но IMHO мне видится, что болезнь легче предотвратить, чем бороться с её последствиями.
405
02 декабря 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by pashulka
... она возвращает строку...


Разумеется, следовало написать:

 
Код:
Range("a1").Value = CDate(Format(xdate, "dd.mm.yyyy"))
Range("a2").Value = CDate(Format(xdate, "mm.dd.yyyy"))

Виноват.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог