Доброго времени суток всем! Столкнулся с такой проблемой. Есть файл эксель с различными таблицами, построенными на основе одного листа с исходными данными. Есть лист с формулами, которые подтягивают данные с разных листов этой же книги. Есть несколько графиков на основе этих данных. Потребовалось сделать ещё несколько аналогичных листов с точно такими же графиками на основе аналогичных данных (для каждого региона - отдельный лист со своим набором данных, но по формату и структуре данные и графики идентичны). План был такой - "отполировать" один лист для одного региона, со всеми графиками, а затем просто сделать нужное кол-во копий листов. Однако при создании копии листа некоторые графики начинают произвольно менять диапазоны исходных данных, например, то, что было в данных, вдруг попадает в подписи, а диапазоны самих данных урезаются. Причём на разных графиках - по-разному. Кто-нибудь сталкивался с такой проблемой? в чём может быть причина и как с этим бороться? Данные для каждого графика берутся из нескольких столбцов, подписи в основном двухуровневые (иногда первый столбец с данными произвольно уходит в подписи). Пробовал на разных компьютерах, та же беда. офис 2007. Менять вручную или делать графики с нуля для каждого из регионов слишком трудоемко, да и хотелось бы понять, в чём косяк.
Всем доброго времени суток. Столкнулись с такой задачей (думаю, не только мы :) ). Нужно посчитать кол-во рабочих часов между двумя датами. На просторах Инета нашёлся такой вот код пользовательской функции:
Скрытый текст
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
Эта функция в качестве аргументов берёт начальную и конечную дату, а также что именно нужно вернуть - часы, минуты или секунды. Начало и конец рабочего дня прописываются в коде. Выходные дни вычитаются. Вопрос в следующем. Как допилить эту функцию, чтобы она по аналогии с ЧИСТРАБДНИ ещё и принимала в качестве аргумента ссылку на праздники, чтобы их тоже вычитать? А в идеале, для полной универсальности, и график работы тоже вынести в аргументы, чтобы каждый раз в коде не менять?