Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2010, 11:14   #11
Mint86
Пользователь
 
Аватар для Mint86
 
Регистрация: 17.07.2008
Сообщений: 81
По умолчанию

IgorGO, может я что-то делаю не так, но с теми же условиями от 01.05.2010 по 31.05.2010 с праздниками 01.05.2010, 02.05.2010 и 09.05.2010 нерабочих дней выходит 12 хотя на самом деле в 2010 году все вышеперечисленные праздничные дни уже выпадают на выходной, и соответственно их не надо считать, или я ошибаюсь? Соответственно рабочих дней 21, нерабочих 10 (даже с учетом праздников).

Последний раз редактировалось Mint86; 13.05.2010 в 11:18.
Mint86 вне форума Ответить с цитированием
Старый 13.05.2010, 11:48   #12
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

О, это принципиальная позиция.
Согласно постановления Кабинета министров, если праздник попадает на выходной день, следующий рабочий день считается выходным.
Вот этим я и руководствуюсь.
Кстати, ввел это Ельцин, в РФ, а наши подхватили.
Мы в мае отдыхали 1,2,3,4,8,9,10.
Потомучто 1,2,9 - госпраздники, 1,2,8,9 - субботы, воскресенья. праздники попали на субботы-воскресенья, ближайшие рабочие дни - стали выходными.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 13.05.2010, 12:00   #13
Mint86
Пользователь
 
Аватар для Mint86
 
Регистрация: 17.07.2008
Сообщений: 81
По умолчанию

Да, но ведь "мы" здесь пытаемся сделать именно аналог функции чистрабдни, а данной функции безразницы законодательство стран. В других странах может быть таких законов и нет... Было бы хорошо иметь именно аналог.
Mint86 вне форума Ответить с цитированием
Старый 13.05.2010, 23:14   #14
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Позиция принципиальная, а задача-то другая.
Увлекся.
Вложения
Тип файла: rar Книга328.rar (18.8 Кб, 20 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 14.05.2010, 07:06   #15
Mint86
Пользователь
 
Аватар для Mint86
 
Регистрация: 17.07.2008
Сообщений: 81
По умолчанию

IgorGO, спасибо.

Вот, чуток переделал код doober
Теперь вроде считает правильно. Учитывает день недели праздника и берет данные о праздничных днях с диапазона.

Код:
Public Function Holiday(date_st As Date, date_en As Date) As Integer
 
  Holiday = 0
  Dim n As Integer, Period As Double
    
Period = (Format(date_en - date_st, "#"))
 
 For n = 0 To Period
    
    For Each cell In Sheets.Item(1).Range("A1:A3") 'диапазон ячеек с праздниками
    
        If CDate(cell.Value) = date_st + n And Weekday(CDate(cell.Value), vbMonday) <> _
            6 And Weekday(CDate(cell.Value), vbMonday) <> 7 Then
            Holiday = Holiday + 1
        End If
    Next cell

  Next
End Function

Public Function What_Rab(date_st As Date, date_en As Date) As Integer

  Dim rez, rezult As String
  Dim dd As Integer, poz As Integer, MyWeekDay As Integer, Period As Double
  Dim d As Double
  Dim Md As Long: Dim mm As Long: Dim n As Long
   
  Period = (Format(date_en - date_st, "#")) + 1
  
  MyWeekDay = Weekday(DateSerial(Year(date_st), Month(date_st), Day(date_st)), vbMonday)
 
 For n = MyWeekDay To Period + MyWeekDay - 1
   mm = n: rez = ""
     Do While mm >= 7
      Md = mm Mod 7
      mm = Int(mm / 7)
      rez = Md & rez
     Loop
       rezu = mm & rez
       poz = (Mid(rezu, Len(rezu), 1))
     Select Case poz
       Case 0, 6
       dd = dd + 1
     End Select
Next
What_Rab = Period - dd - Holiday(date_st, date_en)
End Function



Public Function What_Wyh(date_st As Date, date_en As Date) As Integer
  Dim rez, rezult As String
  Dim dd As Integer, poz As Integer, MyWeekDay As Integer, Period As Double
  Dim d As Double
  Dim Md As Long: Dim mm As Long: Dim n As Long
  
  Period = (Format(date_en - date_st, "#")) + 1
   
  MyWeekDay = Weekday(DateSerial(Year(date_st), Month(date_st), Day(date_st)), vbMonday)
 
 For n = MyWeekDay To Period + MyWeekDay - 1
   mm = n: rez = ""
     Do While mm >= 7
        Md = mm Mod 7
        mm = Int(mm / 7)
        rez = Md & rez
     Loop
        rezu = mm & rez
        poz = (Mid(rezu, Len(rezu), 1))
    Select Case poz
      Case 0, 6
      dd = dd + 1
    End Select
Next
What_Wyh = dd + Holiday(date_st, date_en)
End Function

Последний раз редактировалось Mint86; 14.05.2010 в 08:26.
Mint86 вне форума Ответить с цитированием
Старый 14.05.2010, 08:28   #16
Mint86
Пользователь
 
Аватар для Mint86
 
Регистрация: 17.07.2008
Сообщений: 81
По умолчанию

Почему-то автоматом не пересчитывается данная функция...
В чем может быть дело? Галочка автовычисления в настройках стоит. Другие пользовательские функции автоматом вычисляются при изменении данных на листе, а этот нет...
Может все дело в диапазоне?

Последний раз редактировалось Mint86; 14.05.2010 в 08:33.
Mint86 вне форума Ответить с цитированием
Старый 14.05.2010, 09:55   #17
Mint86
Пользователь
 
Аватар для Mint86
 
Регистрация: 17.07.2008
Сообщений: 81
По умолчанию

Сделал выборочный диапазон, вроде работает автовычисление.

Код:
Public Function Holiday(ByRef ra As Range, date_st As Date, date_en As Date) As Integer
 
   Dim n As Integer, Period As Double, Cell As Range
   
   Holiday = 0
   
Period = (Format(date_en - date_st, "#"))
 
 For n = 0 To Period
    
    For Each Cell In ra.Cells
    
        If CDate(Cell.Value) = date_st + n And Weekday(CDate(Cell.Value), vbMonday) <> _
            6 And Weekday(CDate(Cell.Value), vbMonday) <> 7 Then
            Holiday = Holiday + 1
        End If
    Next Cell

  Next
End Function


Public Function What_Rab(ByRef ra1 As Range, date_st1 As Date, date_en1 As Date) As Integer

  Dim rez, rezult As String
  Dim dd As Integer, poz As Integer, MyWeekDay As Integer, Period1 As Double, Period11 As Double
  Dim d As Double
  Dim Md As Long: Dim mm As Long: Dim n As Long
  Dim Holiday1 As Integer
  Dim n1 As Integer
  Dim Cell As Range
  
  Period1 = (Format(date_en1 - date_st1, "#")) + 1

  MyWeekDay = Weekday(DateSerial(Year(date_st1), Month(date_st1), Day(date_st1)), vbMonday)

 For n = MyWeekDay To Period1 + MyWeekDay - 1
   mm = n: rez = ""
     Do While mm >= 7
      Md = mm Mod 7
      mm = Int(mm / 7)
      rez = Md & rez
     Loop
       rezu = mm & rez
       poz = (Mid(rezu, Len(rezu), 1))
     Select Case poz
       Case 0, 6
       dd = dd + 1
     End Select
Next

Holiday1 = 0
   
Period11 = (Format(date_en1 - date_st1, "#"))
 
 For n1 = 0 To Period11
    
    For Each Cell In ra1.Cells
    
        If CDate(Cell.Value) = date_st1 + n1 And Weekday(CDate(Cell.Value), vbMonday) <> _
            6 And Weekday(CDate(Cell.Value), vbMonday) <> 7 Then
            Holiday1 = Holiday1 + 1
        End If
    Next Cell

  Next n1

What_Rab = Period1 - dd - Holiday1
End Function


Public Function What_Wyh(ByRef ra2 As Range, date_st2 As Date, date_en2 As Date) As Integer
  Dim rez, rezult As String
  Dim dd As Integer, poz As Integer, MyWeekDay2 As Integer, Period2 As Double, Period22 As Double
  Dim d As Double
  Dim Md As Long: Dim mm As Long: Dim n As Long
  Dim Holiday2 As Integer
  Dim n2 As Integer
  Dim Cell As Range


  Period2 = (Format(date_en2 - date_st2, "#")) + 1

  MyWeekDay2 = Weekday(DateSerial(Year(date_st2), Month(date_st2), Day(date_st2)), vbMonday)

 For n = MyWeekDay2 To Period2 + MyWeekDay2 - 1
   mm = n: rez = ""
     Do While mm >= 7
        Md = mm Mod 7
        mm = Int(mm / 7)
        rez = Md & rez
     Loop
        rezu = mm & rez
        poz = (Mid(rezu, Len(rezu), 1))
    Select Case poz
      Case 0, 6
      dd = dd + 1
    End Select
Next

Holiday2 = 0
   
Period22 = (Format(date_en2 - date_st2, "#"))
 
 For n2 = 0 To Period22
    
    For Each Cell In ra2.Cells
    
        If CDate(Cell.Value) = date_st2 + n2 And Weekday(CDate(Cell.Value), vbMonday) <> _
            6 And Weekday(CDate(Cell.Value), vbMonday) <> 7 Then
            Holiday2 = Holiday2 + 1
        End If
    Next Cell

  Next n2

What_Wyh = dd + Holiday2

End Function

Последний раз редактировалось Mint86; 14.05.2010 в 10:04.
Mint86 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аналог функции ЧИСТВНДОХ Mint86 Microsoft Office Excel 7 13.05.2010 08:41
аналог функции case redfield Microsoft Office Excel 3 05.05.2010 12:25
Аналог этой функции на C killer12rus Помощь студентам 1 20.03.2010 15:23
Аналог функции ИЛИ (OR) на VBA Andrey3055 Microsoft Office Excel 4 03.11.2009 13:47
Аналог функции WriteProcessMemory KleoY Win Api 10 31.03.2009 01:17