Страницы: 1
RSS
Посчитать разницу в часах между начальной и конечной датой. Как?
 
Всем планетянам добрый день!  
Пример -    
<дата>_<время> в разных столбцах (начало),  
<дата>_<время> в разных столбцах (окончание).  
Что необходимо:  
В идеале: вычислить разницу во времени между этими интервалами,  
с учетом времени рабочего дня (с 9:00 до 18:00, перерыв 1 час в интервале с 12:00 до 14:00)  
Желательно, конечно с учетом выходных дней, но можно и без них.  
На форумах смотрел - приблизительные аналоги расчетов есть, но подстроить не смог. ((  
 
Файл прикладываю.  
Заранее всем спасибо за помошь!  
 
P.S. Формулы для рачета дней вроде нормально работают, но с расчетом разницы часов ничего придумать не могу....
Современные языки программирования обязаны иметь встроенный метод ChuckNorris(),
который возвращает нужные тебе данные из любого объекта, даже если их там нет...
 
Помог бы, но...  
к сожалению у меня Офис-2003  
 
может эту зацепку использете?
 
Посмотри   
http://www.planetaexcel.ru/forum.php/?thread_id=32158
 
Спасибо :)  
Я эти оба варианта пробовал, но первый не подходит по причине того, что придется всю таблицу переделывать, а во втором примере мозга не хватает, чтобы дополнить формулу учетом только рабочих дней и интервалом только с 9:00 до 18:00 (((
Современные языки программирования обязаны иметь встроенный метод ChuckNorris(),
который возвращает нужные тебе данные из любого объекта, даже если их там нет...
 
Учитывает выходные, праздники, переносы выходных  
Писал на основании найденного в интернете. часы и переносы выходных приспособил для своих целей. Списки праздников и проч. можно передать через параметры, но мне для SQL надо именно так.  
Посмотрите-может подойдет, а вот насчет обеденных перерывов не хочется заморачиваться.  
 
' SDate,EDate - начачо и конец работы в формате дата-время  
' D_H -   =0 - вычисление читых раб. дней с учетом праздников  
'         и переносов выходных;  
'         =1 - вычисление читых раб. часов при рабочем дней с 9-00 до 18-00  
 
Function NetWorkDayHours(SDate As Date, EDate As Date, D_H As Integer) As Double  
Dim HolidaysList()  
Dim RList()  
Dim ArrMember  
Dim RMember  
Dim PRAZDNIK, Sperenos, Sprazdnik, Svyhodnoy, Sbudni As Boolean  
Dim Eperenos, Eprazdnik, Evyhodnoy, Ebudni As Boolean  
Dim SDLT, EDLT, DaysCount As Integer  
Dim Stime, Etime, STimeDLT, ETimeDLT As Single  
 
Stime = SDate - Int(SDate)  
SDate = DateValue(SDate)  
Etime = EDate - Int(EDate)  
EDate = DateValue(EDate)  
' праздники (Можно как параметр типа RANGE)  
HolidaysList = Array( _  
"03.01.2012", "04.01.2012", "05.01.2012", "06.01.2012", "07.01.2012", "08.01.2012", "09.01.2012", _  
"23.02.2012", "08.03.2012", "09.03.2012", "10.03.2012", "30.04.2012", "01.05.2012", "07.05.2012", _  
"08.05.2012", "09.05.2012", "11.06.2012", "12.06.2012", "05.11.2012", "31.12.2012")  
' перенос выходных (Можно как параметр типа RANGE)  
RList = Array("11.03.2012", "28.04.2012", "05.05.2012", "12.05.2012", "09.06.2012", "29.12.2012")  
   
PRAZDNIK = False  
Sperenos = False: Eperenos = False  
Sprazdnik = False: Eprazdnik = False  
Svyhodnoy = False: Evyhodnoy = False  
Sbudni = False: Ebudni = False  
   
For i = SDate To EDate  
  If Weekday(i, vbMonday) < 6 Then  
       ' исключение праздников  
       For Each ArrMember In HolidaysList  
           Z = Format(ArrMember, "dd.mm.yyyy"): x = Format(i, "dd.mm.yyyy")  
           If Format(ArrMember, "dd.mm.yyyy") = Format(i, "dd.mm.yyyy") Then  
               PRAZDNIK = True  
               'Анализ праздников SDate и EDate ----  
               If i = SDate Then Sprazdnik = True  
               If i = EDate Then Eprazdnik = True  
               '----------------------------------  
               Exit For  
           Else  
               PRAZDNIK = False  
           End If  
       Next ArrMember  
       'счетчик рабочих дней -------  
       If PRAZDNIK = False Then  
          'Анализ праздников SDate и EDate ----  
           If i = SDate Then Sbudni = True  
           If i = EDate Then Ebudni = True  
           '----------------------------------  
           DaysCount = DaysCount + 1 'СЧИТАЕМ ДНИ +++++++++++++++++++++++++++++++++++  
       End If  
  Else  
      'Анализ выходных SDate и EDate ----  
      If i = SDate Then Svyhodnoy = True  
      If i = EDate Then Evyhodnoy = True  
      '----------------------------------  
      'Перенос выходных =  
      If Weekday(i, vbMonday) = 6 Or Weekday(i, vbMonday) = 7 Then  
       For Each RMember In RList  
           If Format(RMember, "dd.mm.yyyy") = Format(i, "dd.mm.yyyy") Then  
               DaysCount = DaysCount + 1  
               'Анализ переноса SDate и EDate ----  
               If i = SDate Then Sperenos = True  
               If i = EDate Then Eperenos = True  
               '----------------------------------  
               Exit For  
           End If  
       Next RMember  
      End If  
  End If  
Next i  
If D_H = 0 Then ' ВЫВОД ТОЛЬКО  ЧИСТЫХ РАБ.ДНЕЙ  
  NetWorkDayHours = DaysCount  
  Exit Function  
End If  
   
'РАСЧЕТ РАБОЧИХ ЧАСОВ при рабочем дне с 9-00 до 18-00======================================  
'СДВИГ НАЧАЛА РАБОТЫ---------------------------------  
If Sprazdnik Or Svyhodnoy Then  
   STimeDLT = 0: SDLT = 0  
ElseIf (Svyhodnoy And Sperenos) Or Sbudni Then  
   If Stime > 0.75 Then  ' 18-00  
      STimeDLT = 0: SDLT = -1  
   ElseIf Stime < 0.375 Then ' 9-00  
      STimeDLT = 0: SDLT = 0  
   Else  
      STimeDLT = (0.75 - Stime) * 24: SDLT = -1  
   End If  
End If  
'СДВИГ КОНЦА РАБОТЫ---------------------------------  
If Eprazdnik Or Evyhodnoy Then  
   ETimeDLT = 0: EDLT = 0  
ElseIf (Evyhodnoy And Eperenos) Or Ebudni Then  
   If Etime > 0.75 Then  
      ETimeDLT = 0: EDLT = 0  
   ElseIf Etime < 0.375 Then  
      ETimeDLT = 0: EDLT = -1  
   Else  
      ETimeDLT = (Etime - 0.375) * 24: EDLT = -1  
   End If  
End If  
' ВЫВОД ЧИСТЫХ РАБ. ЧАСОВ  
NetWorkDayHours = (DaysCount + SDLT + EDLT) * 9 + STimeDLT + ETimeDLT  
End Function
 
2 SVM:  
Спасибо, попробовал, но тут опять придеться всю таблицу переделывать, т.к. дата и время в разных столбцах находятся....  
 
В этом примере:  
Геннадий  
16.05.2012, 12:51  
Посмотри    
http://www.planetaexcel.ru/forum.php/?thread_id=32158  
 
все отлично работает, НО!!! результирующее значение - текст....  
А мне по результатам еще надо среднее значение считать ((  
 
Сделал вот такую формулу:  
=ЕСЛИ(ИЛИ(время_начала_работ="";время_выполнения="");"время не указано";ЕСЛИ(дата_выполнения<>дата_поступления;("18:00"-время_поступления)+(время_выполнения-"09:00");ЕСЛИ((время_выполнения-время_поступления)<0;"ошибка расчёта";время_выполнения-время_поступления)))  
Вроде все работает...  
 
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>  
 
<EM>http://www.planetaexcel.ru/forum.php?thread_id=8735</EM>
Современные языки программирования обязаны иметь встроенный метод ChuckNorris(),
который возвращает нужные тебе данные из любого объекта, даже если их там нет...
 
Может так нужно?
 
Зайдите в тему   
http://www.planetaexcel.ru/forum.php?thread_id=10488  
там выкладывали решения и, кажется, с учетом обеда.
 
MCH:  
Огромное спасибо!  
Именно то что нужно! )  
 
Igor67:  
Тоже огромное спасибо!  
Этот вариант я видел, но он слишком тяжел в реализации, и при передаче полномочий работы над таблицей, придется неделю объяснять девочке-оператору что и как там делается :))))
Современные языки программирования обязаны иметь встроенный метод ChuckNorris(),
который возвращает нужные тебе данные из любого объекта, даже если их там нет...
Страницы: 1
Читают тему
Наверх