Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 07.11.2008, 16:20   #1
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
Подмигивание Преобразование формата дата время в VBA

Уважаемые господа!

Получая данные с внешнего источника VBA имею дату в стандартном формате времени - "dd.mm.yy hh:mm:ss". Для проведения вычислений необходимо преобразовывать ее в формат число представляющий время в экселе (0 ... 0,999988426), а затем преобазовывать в формат времени.

Вопрос какой функцией в макросе производить такие преобразования?
Юнлинг вне форума
Старый 09.11.2008, 14:24   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

допустим dt - это то, что получено с внешнего источника, тогда
d = Int(dt) - это дата
t = dt - d - это время
MsgBox "dt = " & dt & " t = " & Format(t, "hh:mm:ss") - это можно посмотреть результаты присваивания
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 10.11.2008, 05:15   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

В VBA для решения данной задачи есть специальная функция.
Допустим, dt - это то, что получено с внешнего источника, тогда:
Код:
MsgBox TimeValue(dt)
вернет время из комбинации даты-времени переменной dt.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 10.11.2008, 09:33   #4
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

[QUOTE=IgorGO;155323]допустим dt - это то, что получено с внешнего источника, тогда
d = Int(dt) - это дата
t = dt - d - это время
MsgBox "dt = " & dt & " t = " & Format(t, "hh:mm:ss") - это можно посмотреть результаты присваивания[/QUOTE

Уважаемый IgorGO
Я понял это так
dt представленно в формате "dd.mm.yy hh:mm:ss" и я автоматически получаю t в нужном формате, т.е. t - будет находиться в промежутке от 0 до 0,99...
Или это не совсем так?
Вся гадость заключается в необходимости проведения расчетов скорость измениения процесса, т.е. деление на дельту времени. В лыюое время даже при переходе чеез сутки. а полученную дельту переводить обратно в параметр время.
Кстати ответ обратного преобразования я от Вас получил - огромное спасибо.
Юнлинг вне форума
Старый 10.11.2008, 09:39   #5
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
В VBA для решения данной задачи есть специальная функция.
Допустим, dt - это то, что получено с внешнего источника, тогда:
Код:
MsgBox TimeValue(dt)
вернет время из комбинации даты-времени переменной dt.
А это фунция точно преобразует формат времени Или придеться писать свою функцию для преобразования форматов?
Юнлинг вне форума
Старый 10.11.2008, 10:07   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если переменная dt представлена в формате дата/время (как Вы и оговаривали), то функция вернет значение в формате время (без даты).
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 10.11.2008, 10:12   #7
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Для облегчения посылаю часть кода как я делаю сейчас

Dim tp1,tp2,td1,td2, result, th,tm,ts as long
...
dim oRes as ADoDB.recordset
...
oRes.Open Conn
...
do while NOT eos.oRes
th= HOUR(oRes.filed(0)).value
tm =MINUTE(oRes.Field(0)).value
ts = second(oRes.Field(0)).value
tp1=1/(th*3600+tm*60+ts)
td1 = oRes.field(1).value
oRes.Movenext
th= HOUR(oRes.filed(0)).value
tm =MINUTE(oRes.Field(0)).value
ts = second(oRes.Field(0)).value
tp2=1/(th*3600+tm*60+ts)
td2 = oRes.field(1).value
result=(td2-td1)/(tp2-tp1)
oRes.Movenext
.... далее обработка результата
loop
вопрос.
можно существует ли функция преобразования даты - времени вместо той которую я написал:
th= HOUR(oRes.filed(0)).value
tm =MINUTE(oRes.Field(0)).value
ts = second(oRes.Field(0)).value
tp1=1/(th*3600+tm*60+ts)
она у меня не работает при переходе дня естесстно
Юнлинг вне форума
Старый 10.11.2008, 11:06   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1. Если Вам нужно получить абсолютное значение времени в секундах, то лучше воспользоваться другой функцией. Например, пусть oRes.Field(0) = 10.03.08 2:30:15. Тогда выделить время и получить его значение в секундах можно так:
Код:
MsgBox DateDiff("s", 0, TimeValue(oRes.Field(0)))
Где "s" - единица измерения (секунды), 0 - первая дата, oRes.Field(0) - наша переменная в формате дата/время. Функция TimeValue выделит время, а функция DateDiff - разность между этим временем и 0, т.е. абсолютное значение.
2. Если нужно получить разность между двумя переменными, представленными в формате дата/время, то, соответственно:
Код:
MsgBox DateDiff("s", dt1, dt2)
Где dt1 - первая дата, dt2 - вторая (dt1 и dt2 в формате дата/время). В этом случае будет учитываться и день, и месяц, и год. Т.е. при переходе через 0 часов изменится дата и функция это учтет.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 10.11.2008, 11:25   #9
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

SAS888 Огромное спосибо. А то я всю голову сломал как мне получать разницу. Ваше предложение просто замечательное. Обязательно воспользуюсь поlсказкой. Только остаестя вопрос как мне инициализировать переменную dt1 и dt2. Если я правильно понял то
dim dt1, dt2 as date
будет представляться в формате дата+время?
Юнлинг вне форума
Старый 10.11.2008, 11:36   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Если я правильно понял то
dim dt1, dt2 as date
будет представляться в формате дата+время?
Безусловно. Только правильно так:
Код:
Dim dt1 As Date, dt2 As Date
А иначе, значение dt1 будет иметь тип Variant.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 10.11.2008 в 11:42.
SAS888 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дата и время v-anatolik-s Microsoft Office Excel 3 14.10.2008 07:45
Дата и время + секунда serjo Помощь студентам 5 24.01.2008 00:21
время и дата на winapi deadh5n1 Помощь студентам 3 14.12.2007 15:35
Преобразование строки во время kayman Общие вопросы Delphi 7 02.10.2007 15:41