Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Подсчет количества времени и умножение времени на число - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Подсчет количества времени и умножение времени на число
Railord Дата: Вторник, 22.07.2014, 17:49 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день форумчане!

Просьба помочь решить несколько проблем касаемых подсчета времени.
Условия: время до 21:00 имеет одну цену, после 21:00 дороже; время в ячейки В5 и С5 забивается вручную.
Проблемы:
1) Как подсчитать количество времени, между ячейками В5 и С5. Я в своем макросе пошел по пути ветвления и нахождения количества времени путем вычитания. Может быть есть что-то наподобие DateDiff, только для времени - или это в данном случае не подойдет?
2) Результат получаемый моим методом - отображается в ячейках АА5 и АА6 листа "Заказы" - но даже там видно, что подсчет времени после полуночи идет неверный.
3) При попытке помножить время на цену за него в ячейке D5 получается не то, что нужно...

[vba]
Код

Sub РассчётЗаказа()

Const VECHER As Date = #9:00:00 PM#

If Range("C5") < VECHER Then
Range("AA5") = FormatDateTime((Range("C5") - Range("B5")), vbShortTime)
    ElseIf Range("B5") > VECHER Then
    Range("AA6") = FormatDateTime((Range("C5") - Range("B5")), vbShortTime)
          ElseIf Range("B5") < VECHER And Range("C5") > VECHER Then
          Range("AA5") = FormatDateTime((VECHER - Range("B5")), vbShortTime)
          Range("AA6") = FormatDateTime((VECHER - Range("C5")), vbShortTime)
End If

If Range("A4") = "Кабина №2" Or Range("A4") = "Кабина №3" Or Range("A4") = "Кабина №4" Then
Range("D5") = (Sheets("Заказы").Range("AA5") * Sheets("ПрайсЛист").Range("B5") + Sheets("Заказы").Range("AA6") * Sheets("ПрайсЛист").Range("B6"))
     ElseIf Range("A4") = "VIP" Then
     Range("D5") = (Sheets("Заказы").Range("AA5") * Sheets("ПрайсЛист").Range("B3") + Sheets("Заказы").Range("AA6") * Sheets("ПрайсЛист").Range("B4"))
End If

End Sub
[/vba]

Буду рад, если предложите свои варианты решения данной задачи.

По поводу моего кода - подозреваю, что он чересчур громоздкий и конструктивно неправильный, надеюсь услышать замечания и советы по улучшению техники написания.
К сообщению приложен файл: C-Keeper_copy.xlsm (37.4 Kb)


Nil novi sub luna, так что - век живи, век учись!)

Сообщение отредактировал Railord - Вторник, 22.07.2014, 17:50
 
Ответить
СообщениеДобрый день форумчане!

Просьба помочь решить несколько проблем касаемых подсчета времени.
Условия: время до 21:00 имеет одну цену, после 21:00 дороже; время в ячейки В5 и С5 забивается вручную.
Проблемы:
1) Как подсчитать количество времени, между ячейками В5 и С5. Я в своем макросе пошел по пути ветвления и нахождения количества времени путем вычитания. Может быть есть что-то наподобие DateDiff, только для времени - или это в данном случае не подойдет?
2) Результат получаемый моим методом - отображается в ячейках АА5 и АА6 листа "Заказы" - но даже там видно, что подсчет времени после полуночи идет неверный.
3) При попытке помножить время на цену за него в ячейке D5 получается не то, что нужно...

[vba]
Код

Sub РассчётЗаказа()

Const VECHER As Date = #9:00:00 PM#

If Range("C5") < VECHER Then
Range("AA5") = FormatDateTime((Range("C5") - Range("B5")), vbShortTime)
    ElseIf Range("B5") > VECHER Then
    Range("AA6") = FormatDateTime((Range("C5") - Range("B5")), vbShortTime)
          ElseIf Range("B5") < VECHER And Range("C5") > VECHER Then
          Range("AA5") = FormatDateTime((VECHER - Range("B5")), vbShortTime)
          Range("AA6") = FormatDateTime((VECHER - Range("C5")), vbShortTime)
End If

If Range("A4") = "Кабина №2" Or Range("A4") = "Кабина №3" Or Range("A4") = "Кабина №4" Then
Range("D5") = (Sheets("Заказы").Range("AA5") * Sheets("ПрайсЛист").Range("B5") + Sheets("Заказы").Range("AA6") * Sheets("ПрайсЛист").Range("B6"))
     ElseIf Range("A4") = "VIP" Then
     Range("D5") = (Sheets("Заказы").Range("AA5") * Sheets("ПрайсЛист").Range("B3") + Sheets("Заказы").Range("AA6") * Sheets("ПрайсЛист").Range("B4"))
End If

End Sub
[/vba]

Буду рад, если предложите свои варианты решения данной задачи.

По поводу моего кода - подозреваю, что он чересчур громоздкий и конструктивно неправильный, надеюсь услышать замечания и советы по улучшению техники написания.

Автор - Railord
Дата добавления - 22.07.2014 в 17:49
nilem Дата: Вторник, 22.07.2014, 19:26 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
может есть смысл записывать в В5 и С2 полную дату, типа 13.07.2014 23:30 и 14.07.2014 01:20? тогда простое вычитание дает разницу 1:50


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениеможет есть смысл записывать в В5 и С2 полную дату, типа 13.07.2014 23:30 и 14.07.2014 01:20? тогда простое вычитание дает разницу 1:50

Автор - nilem
Дата добавления - 22.07.2014 в 19:26
Railord Дата: Вторник, 22.07.2014, 22:17 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Хотелось бы избежать этого - ибо так придется делать раз по 30 на дню... Хотел минимизировать количество вбиваемых данных и максимально упростить этот файл...
Просто я думаю, что я чего-то не знаю и пошел по неправильному пути. Может есть какой ни будь прием или функция о которой мне неизвестно.


Nil novi sub luna, так что - век живи, век учись!)

Сообщение отредактировал Railord - Вторник, 22.07.2014, 22:20
 
Ответить
СообщениеХотелось бы избежать этого - ибо так придется делать раз по 30 на дню... Хотел минимизировать количество вбиваемых данных и максимально упростить этот файл...
Просто я думаю, что я чего-то не знаю и пошел по неправильному пути. Может есть какой ни будь прием или функция о которой мне неизвестно.

Автор - Railord
Дата добавления - 22.07.2014 в 22:17
_Boroda_ Дата: Вторник, 22.07.2014, 22:51 | Сообщение № 4
Группа: Админы
Ранг: Местный житель
Сообщений: 16957
Репутация: 6631 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
В макросы не вникал (уж очень много там буков). Первое, что пришло в голову - перепишите 4-ю строку
[vba]
Код
Range("AA5") = FormatDateTime((Range("C5") - Range("B5") - (Range("C5") < Range("B5"))), vbShortTime)
[/vba]
тогда время не будет отрицательным


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеВ макросы не вникал (уж очень много там буков). Первое, что пришло в голову - перепишите 4-ю строку
[vba]
Код
Range("AA5") = FormatDateTime((Range("C5") - Range("B5") - (Range("C5") < Range("B5"))), vbShortTime)
[/vba]
тогда время не будет отрицательным

Автор - _Boroda_
Дата добавления - 22.07.2014 в 22:51
Railord Дата: Вторник, 22.07.2014, 23:30 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Благодарю _Boroda_, .
Сработало - только я не понял, каким образом происходит вычитание из неравенства, если не сложно поясните пожалуйста, так сказать на пальцах, словами...

Теперь осталось решить проблему 3-го пункта - чтобы при умножении, к примеру 4 часов 30 минут на 200 получалось 900, а не непонятно что...

Есть мысль переводить часы в минуты, вот только средствами чего это можно реализовать в VBA? Хотя проблемы это наверное все равно не решит, при умножении времени на число, получается какае-то ерунда...


Nil novi sub luna, так что - век живи, век учись!)
 
Ответить
СообщениеБлагодарю _Boroda_, .
Сработало - только я не понял, каким образом происходит вычитание из неравенства, если не сложно поясните пожалуйста, так сказать на пальцах, словами...

Теперь осталось решить проблему 3-го пункта - чтобы при умножении, к примеру 4 часов 30 минут на 200 получалось 900, а не непонятно что...

Есть мысль переводить часы в минуты, вот только средствами чего это можно реализовать в VBA? Хотя проблемы это наверное все равно не решит, при умножении времени на число, получается какае-то ерунда...

Автор - Railord
Дата добавления - 22.07.2014 в 23:30
_Boroda_ Дата: Вторник, 22.07.2014, 23:42 | Сообщение № 6
Группа: Админы
Ранг: Местный житель
Сообщений: 16957
Репутация: 6631 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
1. кусок (Range("C5") < Range("B5")) дает ИСТИНА или ЛОЖЬ. В VBA ИСТИНА - это минус 1, ЛОЖЬ - 0. Единица в формате Excel и VBA - это одни сутки. поэтому формулу можно интерпретировать так: А-Б плюс одни сутки, если А меньше Б (то есть, А и Б находятся в разных днях)
3. 4ч 30мин - это вовсе не 4,5 (см. п.1 - "Единица в формате Excel и VBA - это одни сутки"). Следовательно, нужно делать так: 4:30*24*200, где 24 - это кол-во часов в сутках.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение1. кусок (Range("C5") < Range("B5")) дает ИСТИНА или ЛОЖЬ. В VBA ИСТИНА - это минус 1, ЛОЖЬ - 0. Единица в формате Excel и VBA - это одни сутки. поэтому формулу можно интерпретировать так: А-Б плюс одни сутки, если А меньше Б (то есть, А и Б находятся в разных днях)
3. 4ч 30мин - это вовсе не 4,5 (см. п.1 - "Единица в формате Excel и VBA - это одни сутки"). Следовательно, нужно делать так: 4:30*24*200, где 24 - это кол-во часов в сутках.

Автор - _Boroda_
Дата добавления - 22.07.2014 в 23:42
Railord Дата: Среда, 23.07.2014, 00:02 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Понятно - благодарю за разъяснения. Сам ни за чтобы не догнал... Вроде бы и книгу прочел(Стивен Роман "Использование макросов в ексель"), но такого там не видел...

4:30*24*200, где 24 - это кол-во часов в сутках.

Если перемножить 4,3*24*200 получается огромное число...
Не понял, исходя из пункта 1 получается, что 4:30 - эксель видит как четверо суток с лишним?


Nil novi sub luna, так что - век живи, век учись!)
 
Ответить
СообщениеПонятно - благодарю за разъяснения. Сам ни за чтобы не догнал... Вроде бы и книгу прочел(Стивен Роман "Использование макросов в ексель"), но такого там не видел...

4:30*24*200, где 24 - это кол-во часов в сутках.

Если перемножить 4,3*24*200 получается огромное число...
Не понял, исходя из пункта 1 получается, что 4:30 - эксель видит как четверо суток с лишним?

Автор - Railord
Дата добавления - 23.07.2014 в 00:02
Railord Дата: Среда, 23.07.2014, 00:26 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Всё работает, все понятно - благодарю!


Nil novi sub luna, так что - век живи, век учись!)
 
Ответить
СообщениеВсё работает, все понятно - благодарю!

Автор - Railord
Дата добавления - 23.07.2014 в 00:26
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!