首页 > 解决方案 > 从日期下周五返回的函数

问题描述

在规划项目时,我们会给出一个以周为单位的大致持续时间。从今天开始,下周一开始一个项目。

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 时,我得到一个“Argument Not Optional”。

我似乎无法找到这段代码的问题。有什么想法吗?

标签: excelvba

解决方案


这不是从函数中获取值的方式:

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返回当前日期+时间。如果只是您感兴趣的日期,请使用 function Date


推荐阅读