Можно ли сгруппировать элементы массива без цикла?
VBA. Можно ли сгруппировать элементы массива?
VBA. Прошу пояснить по методу GetOpenFilename
Функция-аналог "РАБДЕНЬ" (Office 2007) доработанная
18.02.2010 18:21:27
Выкладываю на ваш строгий суд функцию, представляющую собой аналог встроенной в Office 2007 функции "РАБДЕНЬ".
Возможно это уже было, но я не нашел, потому пришлось наваять. Преимущества: 1. Учитывает рабочие субботы и воскресения 2. Работает под 2003 Сам код: Option Base 1 Public Function РАБДНИ(ByVal ДатаНачальная As Date, КоличДней As Integer, _ Optional ДиапазонПраздников As Variant, Optional ДиапазонИсключений As Variant) As Date ' функция разработана на базе ' Возвращает число, которое представляет дату, отстоящую на заданное количество рабочих дней вперед ' или назад от начальной даты. Отличием от функции MS Office 2007 "РАБДЕНЬ" является учитывание суббот и _ ' воскресений, являющихся рабочими (например - 27.02.2010 г.). ' ДатаНачальная - начальная дата. ' КоличДней - количество дней до или после начальной даты, не являющихся выходными или праздниками. ' Положительное значение аргумента «КоличДней» обозначает будущую дату; отрицательное — прошедшую дату. ' ДиапазонПраздников - необязательный список из одной или нескольких дат, например государственных праздников, ' которые требуется исключить из рабочего календаря (диапазон ячеек, именованный диапазон и т.п. ' перечисление дат не прокатит). ' ДиапазонИсключений - необязательный список из одной или нескольких дат, rоторые требуется исключить из выходных дней. ' Требования - как у "ДиапазонПраздников" Dim Selebrate, Iskluchenia As Variant Dim Weekend, Holiday As Boolean Dim x, i As Integer If IsMissing(ДиапазонИсключений) = False Then If ДиапазонИсключений.Count = 1 Then ReDim Iskluchenia(1) Iskluchenia(1) = ДиапазонИсключений.Value Else Iskluchenia = WorksheetFunction.Transpose(ДиапазонИсключений) End If End If If IsMissing(ДиапазонПраздников) = False Then If ДиапазонПраздников.Count = 1 Then ReDim Selebrate(1) Selebrate(1) = ДиапазонПраздников Else Selebrate = WorksheetFunction.Transpose(ДиапазонПраздников) End If End If Do Until КоличДней = 0 x = x + IIf(КоличДней > 0, 1, -1) Weekend = False Holiday = False 'определяем субботу и воскресение If Weekday(ДатаНачальная + x, vbMonday) = 6 _ Or Weekday(ДатаНачальная + x, vbMonday) = 7 Then Weekend = True End If 'определяем, не является ли уикенд рабочим If IsEmpty(Iskluchenia) = False Then For i = LBound(Iskluchenia) To UBound(Iskluchenia) If ДатаНачальная + x = Iskluchenia(i) Then Weekend = False Exit For End If Next i End If 'определяем праздники If IsEmpty(Selebrate) = False Then For i = LBound(Selebrate) To UBound(Selebrate) If ДатаНачальная + x = Selebrate(i) Then Holiday = True Exit For End If Next i End If If Weekend = False And Holiday = False Then КоличДней = КоличДней - IIf(КоличДней > 0, 1, -1) End If Loop РАБДНИ = ДатаНачальная + x End Function Может, кому-нибудь пригодится. |
|
|
VBA. Можно ли не открывая книгу перебрать в цикле названия листов?
Как правильно применить формулу массива СУММ() в VBA
VBA обращение к листу
Подсчет количества уникальных записей
Условие, на вхождение строки
Ошибка Excel?
Представление даты
Ссылка на массив
Модуль, выполняемый при открытии файла