如何在VBA语句中使用WEEKNUM函数?

时间:2016-07-09 13:00:19

标签: excel excel-vba datetime excel-formula vba

我想写一个VBA,检查WEEKNUM或ISOWEEKNUM是否等于该值,然后运行其余的宏。我试过这样做,但因为使用TODAY作为arg而出现错误。

3 个答案:

答案 0 :(得分:7)

使用WorksheetFunction objectExcel Application object将本机功能调用到VBA。

debug.print WorksheetFunction.WeekNum(Date)
debug.print application.WeekNum(Date)
debug.print WorksheetFunction.IsoWeekNum(Date)
debug.print application.IsoWeekNum(Date)
if application.WeekNum(Date) = 28 then
     'it is currently 28
end if

在VBA中,TODAY()函数被Date替换。

答案 1 :(得分:3)

WEEKNUM函数将包含1月1日的一周视为一年中的第一周。但是,有一个欧洲标准将第一周定义为在新的一年中大部分时间(四个或更多)下降的那个星期。这意味着,在1月的第一周中有三天或更少的年份,WEEKNUM函数返回根据欧洲标准不正确的周数。

Sub test()
    Dim wn As Integer
    wn = Format(Date, "ww")
    Debug.Print wn
End Sub

ISO Weeknum UDF是。
ISO周数

一年中第一周的ISO标准: - 一周从星期一开始;所以星期一是任何一周的第一天 - 一年中的第一周必须包含该年度至少4天

  • 如果是星期一,星期二,星期三或星期四,1月1日是第1周
  • 1月4日总是在任何一年的第1周
  • 一年中的第一个星期四总是在第1周

    Public Function ISOweeknum(ByVal v_Date As Date) As Integer
        ISOweeknum = DatePart("ww", v_Date - Weekday(v_Date, 2) + 4, 2, 2)
    End Function
    

    要测试此功能,可以添加另一个小例程。

     Sub test_today_weeknum()
         Dim dt As Date
         Dim wno As Integer
        'In this example, the variable called LDate would now contain the current system date.
         dt = Date
         Debug.Print dt
         wno = ISOweeknum(dt)
         Debug.Print wno
     End Sub         
    

今天即9-7-2016,第一个给出第28周,而ISO周期函数给出27

对于9-7-2015,上述两个例程都将给出第28周

要在Excel中的单元格公式中获取当前日期(不包含时间部分),请使用:

=TODAY()

但是,在VBA编程环境中,函数将是DATE()Now包含当前日期和时间,DateTime是日期和时间的单独命令。这完全取决于您需要哪些信息。

答案 2 :(得分:0)

以下是在VBA中同时使用WEEKNUM()TODAY()的一种方法:

Sub dural()
    If Evaluate("=weeknum(today())") = 28 Then
        MsgBox 28
    Else
        MsgBox "not 28"
    End If
End Sub