Format, Date

Программирование на Visual Basic for Applications
jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Format, Date

Сообщение jetcom » 05.08.2003 (Вт) 12:05

Всем привет!

str = "24 Июля 2003 г."
str = Format(str, "dd.mm.yy")

Мне нужно получить 24.07.03
А выдает все-равно почему-то "24 Июля 2003 г."
В чем моя ошибка?
Всё сбудется!!!

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 05.08.2003 (Вт) 12:17

Почимучто на входе функции тип параметра должен быть Date или Double, или Single, или Long и т.д., но никак не String.

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 05.08.2003 (Вт) 12:24

skiperski писал(а):Почимучто на входе функции тип параметра должен быть Date или Double, или Single, или Long и т.д., но никак не String.


Тем более что дата которую ты переводишь имеет текст.
Если передавать чтото типа "10.10.1999" тогда и стринг пройдет.
Moderator VBStreets
---------------------------

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 05.08.2003 (Вт) 15:51

вот если написать так, то получится (если же конечно это устроит) :wink:
str = "24 Июля 2003"
str = Format(str, "dd.mm.yy")

или даже вот так
str = "24 Июля 2003 г."
str = Format(Left(str, Len(str) - 3), "dd.mm.yy")
-Whose the motocycle, is this? -It`s a chopper, baby! -Whose chopper is this? -Zed`s! -Who is Zed? -Zed`s dead, baby, Zed`s dead! :-D

noemotion
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 25.07.2003 (Пт) 11:00
Откуда: kiev, ukraine

Сообщение noemotion » 05.08.2003 (Вт) 19:53

...А еще есть интересная функция CDate()

jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Сообщение jetcom » 05.08.2003 (Вт) 22:56

2noemotion: Ты сам то пробовал ее в данном случае применить?
Помогло?
Так вот то-ж!...
2Calvin: Получается, не спорю,... а если иногда " г." отсутствует?...
Так вот то-ж!... :)
Но все-равно спасибо, хоть вижу к чему стремиться нужно! И какими путями! :roll:
Если не получится, буду еще беспокоить, не обессудьте! Универсального ответа пока нет:)
Всё сбудется!!!

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 06.08.2003 (Ср) 9:42

может тогда все-таки так :wink:
Код: Выделить всё
i=0
Do While IsNumeric(Mid(Str, Len(Str) - i, 1)) = False
i = i + 1
If i > Len(Str) Then End
Loop
Str = Format(Left(Str, Len(Str) - i), "dd.mm.yy")
-Whose the motocycle, is this? -It`s a chopper, baby! -Whose chopper is this? -Zed`s! -Who is Zed? -Zed`s dead, baby, Zed`s dead! :-D

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 06.08.2003 (Ср) 12:17

А зачем такие заморочки? Почему бы не использовать проверенные и заведомо рабочие варианты? Где тут сермяжная правда?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.08.2003 (Ср) 13:06

А почему бы не сделать свой парсер?
В выражении всего одно строковое значение. Разбиваешь строку по пробелам и анализируешь части. Если одна или две цифры -- это день месяца, если четыре -- это год. Самое сложное это название месяца, но тут всего 12 вариантов. Переводишь все в UCase$, делаешь Left$(,3) и дальше Select Case с двенадцатью условиями. Все остальное игнорируешь.
Я даже могу предложить тебе функцию (аналог Oracle-функции Decode):
Код: Выделить всё
Function Decode(ByVal Value As Variant, ParamArray Pairs() As Variant) As Variant
Dim N As Long, I As Long
N = UBound(Pairs) - LBound(Pairs) + 1
N = N Mod 2
If N = 1 Then OraDecode = Pairs(UBound(Pairs))
For I = LBound(Pairs) To UBound(Pairs) - N Step 2
  If Value = Pairs(I) Then
    OraDecode = Pairs(I + 1)
    Exit Function
  End If
Next I
End Function


Использование:
Decode(Значение, Значение1,Пара1[, Значение2,Пара2, ...][, ПараПоУмолчанию])
Значение будет сопоставляться с каждым из ЗначениеN и если найдено соответствие, то возвратится ПараN, если не найдено соответствие ни для одного значения, то возвратится ПараПоУмолчанию

Т.е. определение месяца будет выглядеть так
Код: Выделить всё
'MStr - строка, в которой указан месяц
MStr = Left$(UCase$(MStr),3)
M = Decode(MStr, "ЯНВ",1, "ФЕВ",2, "МАР",3, "АПР",4, "МАЙ",5, "ИЮН",6, "ИЮЛ",7, "АВГ",8, "СЕН",9, "ОКТ",10, "НОЯ",11, "ДЕК",12)
Lasciate ogni speranza, voi ch'entrate.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 06.08.2003 (Ср) 13:16

alibek писал(а):А почему бы не сделать свой парсер?

Эт, конечно, мона, но зачем?

jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Сообщение jetcom » 07.08.2003 (Чт) 10:25

2alibek: Парсер, - вещЧь, конечно, веселенькая, но решать такую простую задачу такой ценой?!?...
Дешевле уж по совету Calvin убивать " г.", если оно есть :wink:
Но если эта str получена путем Format(Date, 'LONG DATE'), неужели нельзя просто ее привести к необходимому виду при помощи "SHORT DATE"???
2skiperski: Мне кажется, что у тебя есть что сказать, но ты никак не решаешься!
Так говори-же!!! :idea: :wink: :idea:
Всё сбудется!!!

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 07.08.2003 (Чт) 10:46

jetcom писал(а):2skiperski: Мне кажется, что у тебя есть что сказать, но ты никак не решаешься!
Так говори-же!!! :idea: :wink: :idea:

Да как всегда всё о том же. Никак не пойму зачем усложнять и без того нелёгкую жизнь, а потом героически преодолевать самими же созданные проблемы. Возьми дату в формате Date и работай с ней. Или объясни зачем нужны эти извращения с текстом.

jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Сообщение jetcom » 07.08.2003 (Чт) 12:42

2skiperski:
Написал программу для печати ценников, она дату берет из накладной, в которой бывает: ".......... г.", бывает без него, или еще как-нибудь иначе, а мне нужно привести это к вышеуказанному формату. Вот откуда эта проблема...
Т. е. нет смысла анализировать кучу форматов дат в строковом виде (программе), а есть смысл распознать в строке дату и каким-то образом конвертировать в нужный формат :roll:
Всё сбудется!!!

ПЕТР
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 23.07.2003 (Ср) 6:25
Откуда: г. Братск

Сообщение ПЕТР » 08.08.2003 (Пт) 6:21

А, что трудно строку просто проанализировать, если в ней как-то не по правилам дата написана. Небольшая функция, читаещь по символу, С начала если цифра собираешь день, далее пробелы пропускаешь, если буква собираешь месяц (месяцев по моему всего 12), ну идалее собираешь год. Если что-то не подходит ну извините, никакие форматы не распознают 34 июлу 2003г.

jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Сообщение jetcom » 08.08.2003 (Пт) 10:02

Аналогичное уже было предложено выше alibek-ом.
Ну если иначе никак, тогда придется именно так!
Всё сбудется!!!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 76

    TopList