расчет отработанного времени

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: расчет отработанного времени

Как через Java Swing прописать на кнопку открывание папки

unjusia » 18 апр 2017, 06:46

все ок!всем нравится,и мне!

http://3-an.ru - кондиционеры и вентиляция

Re: расчет отработанного времени

legioneer777 » 14 фев 2017, 21:39

Avsha писал(а):Вот такой вариант подготовил,
тщательно не тестировал, но вроде работает...

в виде пользовательской функции, судя по алгоритму
на формулах будет сложновато реализовать ;)

Код: Выделить всё

Public Function Len_DateTime(dt1 As Date, dt2 As Date, Min0_Hour1_Day2 As Integer)
Application.Volatile True

Dim i As Long
Dim S As Double
Dim Report_Str As String
Dim StartWorkDay As Date, EndWorkDay As Date
    StartWorkDay = "09:00:00"
    EndWorkDay = "18:00:00"

'Проверка на достоверность исходных данных
'-------------------------------------------------------------
If dt1 > dt2 Then Len_DateTime = 0: Exit Function


'Приведение начала и конца диапазона к границам рабочего дня
'-------------------------------------------------------------
If TimeValue(dt1) < StartWorkDay Then
                                    dt1 = DateValue(dt1) + TimeValue(StartWorkDay)
                                 Else
If TimeValue(dt1) > EndWorkDay Then dt1 = DateValue(dt1) + TimeValue(EndWorkDay)
End If


If TimeValue(dt2) < StartWorkDay Then
                                    dt2 = DateValue(dt2) + TimeValue(StartWorkDay)
                                 Else
If TimeValue(dt2) > EndWorkDay Then dt2 = DateValue(dt2) + TimeValue(EndWorkDay)
End If


'Начало и конец временного диапазона относятся к одному дню
'-------------------------------------------------------------
If Int(dt1) = Int(dt2) Then

If Weekday(dt1, vbMonday) <> 6 And Weekday(dt1, vbMonday) <> 7 Then
    S = S + (TimeValue(dt2) - TimeValue(dt1))
    'в отчет
    Report_Str = Report_Str & DateValue(dt1) & " / " _
                    & Weekday(dt1, vbMonday) & " / " _
                    & Format(TimeValue(dt2) - TimeValue(dt1), "hh:mm:ss") _
                    & " " & Chr(13)
End If
        GoTo End_work
End If


'Начало и конец временного диапазона относятся к разным дням
'-------------------------------------------------------------
' Обработка дня - начала временного диапазона
If Weekday(dt1, vbMonday) <> 6 And Weekday(dt1, vbMonday) <> 7 Then
    S = S + (EndWorkDay - TimeValue(dt1))
    'в отчет
    Report_Str = Report_Str & DateValue(dt1) & " / " _
                    & Weekday(dt1, vbMonday) & " / " _
                    & Format(EndWorkDay - TimeValue(dt1), "hh:mm:ss") _
                    & " " & Chr(13)
End If

' Обработка дней - между началом и концом временного диапазона
For i = Int(CDbl(dt1)) + 1 To Int(CDbl(dt2)) - 1

If Weekday(CDate(i), vbMonday) <> 6 And _
   Weekday(CDate(i), vbMonday) <> 7 Then
      S = S + (EndWorkDay - StartWorkDay)
      'в отчет
      Report_Str = Report_Str & CDate(i) & " / " _
                    & Weekday(CDate(i), vbMonday) & " / " _
                    & Format(EndWorkDay - StartWorkDay, "hh:mm:ss") _
                    & " " & Chr(13)
End If
Next i

' Обработка дня - конца временного диапазона
If Weekday(dt2, vbMonday) <> 6 And Weekday(dt2, vbMonday) <> 7 Then
    S = S + (TimeValue(dt2) - StartWorkDay)
    'в отчет
    Report_Str = Report_Str & DateValue(dt2) & " / " _
                    & Weekday(dt2, vbMonday) & " / " _
                    & Format(TimeValue(dt2) - StartWorkDay, "hh:mm:ss") _
                    & " " & Chr(13)
End If



End_work:
    
    Select Case Min0_Hour1_Day2
    Case 0
        Len_DateTime = S * 24 * 60
    Case 1
        Len_DateTime = S * 24
    Case 2
        Len_DateTime = S
    Case Else
        Len_DateTime = Report_Str
    End Select
    
    'вывод отчета
    'MsgBox Report_Str
    
End Function
Спасибо помог с функцией!

Может кому понадобится)
Немного допилил функцию добавив возможность указания для пятницы отдельного графика работы, указания обеденного времени, и списка праздничных дней.

С vba работаю недавно, поэтому может не очень и производительно получилось,но считает верно.

Re: расчет отработанного времени

pashulka » 07 апр 2011, 14:40

Часы (без учёта минут и секунд) * 7,46 можно, например, так :

=ЦЕЛОЕ(A1-A2)*7,46
=ОТБР(A1-A2)*7,46

Re: расчет отработанного времени

pashulka » 07 апр 2011, 14:34

Чисто телепатически, а также основываясь на посте#11, предположу, что в исходных ячейках у Вас не дата, а текст - 01.04.2011. 11:30 (ибо третьей точки там быть не должно), а в этом случае, можно либо преобразовать текст именно в дату, либо вместо C2, D2 использовать одну из нижеопубликованных формул :

=ПОДСТАВИТЬ(C2;".";;3)
=ЗАМЕНИТЬ(C2;11;1 ;)

P.S. Любая из вышеприведённых формул, возвращает текст, однако, это не помешает вычитанию, впрочем, если Вы принципиальный противник подобных действий, то :

=ЗНАЧЕН(ПОДСТАВИТЬ(C2;".";;3))
=ПОДСТАВИТЬ(C2;".";;3)*1
=ПОДСТАВИТЬ(C2;".";;3)+0
=--ПОДСТАВИТЬ(C2;".";;3)

Re: расчет отработанного времени

lis836 » 07 апр 2011, 14:30

Спасибо,разобрался!! а как теперь часы умножить на 7,46??

Re: расчет отработанного времени

lis836 » 07 апр 2011, 14:05

Добрый день! Почему у меня в ячейках там где должно быть 100:00 пишет #ЗНАЧ!

Re: расчет отработанного времени

lis836 » 06 апр 2011, 21:06

Спасибо!!!

Re: расчет отработанного времени

pashulka » 06 апр 2011, 20:41

Смотрите пример, созданный специально для Вас

[ATTACH]1467[/ATTACH]

Re: расчет отработанного времени

lis836 » 06 апр 2011, 20:26

Можно описать мои действия... у меня ничего не получается, мне нужно вписать формулу в ячейку или как? У меня в ячейке С первая дата и время, в ячейке D вторая дата и время. а в E часы.

Re: расчет отработанного времени

pashulka » 06 апр 2011, 20:12

A1=05.04.2011 15:40:00
A2=01.04.2011 11:30:00

1) Только визуальный эффект (так что, не забудьте установить формат ячейки A3, например, как [ч]:мм:сс или [ч]:мм)
A3=A1-A2

2) Формула, возвращающая текст
A4=ТЕКСТ(A1-A2;"[ч]:мм:сс")
A4=ТЕКСТ(A1-A2;"[ч]:мм")

Вернуться к началу