Функция, которая возвращает следующую пятницу с даты - PullRequest
0 голосов
/ 06 июля 2018

При планировании проектов мы даем примерную продолжительность в неделях. Проект начинается в следующий понедельник с сегодняшнего дня.

Public Function NextMonday() As Date

Dim D As Integer
Dim N As Date

D = Weekday(Now)
N = Now() + (9 - D)

NextMonday = N

End Function

С помощью этого кода я могу назначить правильную дату ячейке (следующий понедельник). Теперь мне нужно получить в следующую пятницу 12 недель с этой даты. (84 дня)

Для этого я использовал предыдущий код и немного его скорректировал.

Public Function NextFriday(AproxDate As Date) As Date

Dim E As Integer
Dim M As Date

E = Weekday(Now)
M = AproxDate + (14 - E)

NextFriday = M

End Function

Теперь для основного модуля код выглядит так:

Private Sub Worksheet_Activate()

Dim wbCurrent As Workbook
Dim wsCurrent As Worksheet
Dim StartDate As Range
Dim AproxDate As Date
Dim EndDate As Range

Set wbCurrent = ThisWorkbook
Set wsCurrent = wbCurrent.Sheets("Sheet1")
Set StartDate = wsCurrent.Range("C15")
Set EndDate = wsCurrent.Range("C16")

Call NextMonday
StartDate.Value = NextMonday
'Setting Monday 12 weeks from StartDate
AproxDate = NextMonday + 84

Call NextFriday(AproxDate)
EndDate.Value = NextFriday

End Sub

Часть NextMonday работает нормально, но при запуске NextFriday я получаю «Не обязательный аргумент» при попытке установить EndDate.Value = NextFriday.

Не могу найти проблему с этим кодом. Есть мысли?

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Это не то, как вы получаете значение из функции:

Call NextFriday(AproxDate)
EndDate.Value = NextFriday

Если вы хотите, чтобы значение, которое возвращает функция NextFriday, основывалось на (AproxDate), и вы хотите, чтобы это значение в ячейке EndDate, тогда (вместо обеих строк выше) вы должны использовать:

EndDate.Value = NextFriday(AproxDate)

Вы используете Call только с функцией, если вы не хотите, чтобы значение было возвращено из нее.


Упрощенные процедуры:

Ваша процедура излишне усложнена.

Верьте или нет, это точно так же, как ваши процедуры :

Public Function NextMonday() As Date
    NextMonday = Now() + (9 - Weekday(Now))
End Function

Public Function NextFriday(AproxDate As Date) As Date
    NextFriday = AproxDate + (14 - Weekday(Now))
End Function

Private Sub Worksheet_Activate()

    .Range("C15")= NextMonday
    ThisWorkbook.Sheets("Sheet1").Range("C16")= NextFriday(NextMonday + 84)
End Sub

Упрощенно еще дальше :

Если пойти еще дальше, это 1 саб, точно , как и 3 вышеописанные процедуры :

Private Sub Worksheet_Activate()
    With Sheets("Sheet1")
        .Range("C15") = Now() + (9 - Weekday(Now))
        .Range("C16") = (.Range("C15") + 84) + (14 - Weekday(Now))
    End With
End Sub

Еще одна вещь, которую нужно отметить, функция Now возвращает текущую дату + время. Если вам интересна только дата, используйте функцию Date.

0 голосов
/ 06 июля 2018

var d = new Date();
d.setDate(d.getDate() + (5+7 - d.getDay()) % 7);
document.write(d);

Это код Javascript, который приведет вас к следующей пятнице, единственное условие, когда он не выполняется, если это пятница.

0 голосов
/ 06 июля 2018

У вас есть 2 ошибки в вашей функции Следующая пятница.

1) с понедельника по пятницу в будние дни +4, а не +5 (поэтому вы получите следующий понедельник = +9 и следующую пятницу = + (9 + 4))

2) Вы взяли теперь () вместо aproxdate в коде следующей пятницы

Ваш код на следующую пятницу должен быть:

Public Function NextFriday(AproxDate As Date) As Date

Dim E As Integer
Dim M As Date

E = Weekday(AproxDate)
M = AproxDate + (13 - E)

NextFriday = M

End Function

Тогда вы можете вызвать функцию, как в другом ответе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...