Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA用于与桌面日历类似的月份的周数_Excel_Week Number_Vba - Fatal编程技术网

Excel VBA用于与桌面日历类似的月份的周数

Excel VBA用于与桌面日历类似的月份的周数,excel,week-number,vba,Excel,Week Number,Vba,请您帮我添加特定月份的周数好吗 这是vba: With Target If .Column <> 10 Or .Row < 1 Then Exit Sub If .Value = "Select" Then If .Offset(0, 1).Value = "" Then .Offset(0, 1).NumberFormat = "mm/dd/yy" .Offset(0, 1).Value = Now - 1 End

请您帮我添加特定月份的周数好吗

这是vba:

With Target
If .Column <> 10 Or .Row < 1 Then Exit Sub
If .Value = "Select" Then
    If .Offset(0, 1).Value = "" Then
        .Offset(0, 1).NumberFormat = "mm/dd/yy"
        .Offset(0, 1).Value = Now - 1      
    End If
带目标的

如果.Column 10或.Row<1,则退出Sub
如果.Value=“选择”,则
如果.Offset(0,1).Value=”“,则
.Offset(0,1).NumberFormat=“mm/dd/yy”
.Offset(0,1).Value=Now-1
如果结束
我对周数的定义基于从周日到周六的整周:

  • 如果本月的第一天不是从星期天开始,那么截至本月第一个星期六的任何一天都将是第1周

  • 周日至周六的下一组将是第2周、第3周、第4周等,除非该月开始于周日,否则第1周、第2周、第3周等

  • 如果月未在周六结束,则周日至月底将为周N+1,其中N是步骤2给出的最后一整周


  • 例如:这个月,三月一日是星期三。所以3月1日至4日(Wed-Sat)将是一周,以此类推。

    您可以试试看该功能是否适合您的目的

    您可以在代码中使用它,如下所示:

    .Offset(0,2).Value=WorksheetFunction.WeekNum(现在为-1)

    文件说:

    返回特定日期的周数。例如,包含1月1日的一周是一年中的第一周,编号为第1周

    此功能有两个系统:

    系统1包含1月1日的一周是一年中的第一周,编号为第1周

    系统2包含一年中第一个星期四的一周是一年中的第一周,编号为第1周。该系统是ISO 8601中规定的方法,通常称为欧洲周编号系统

    编辑 OP对周的定义是基于桌面日历,其中每个绿色块都是一周,因此2017年3月有5周。注:2016年1月在此系统下有六周

    因此,该公式不会给出预期结果。相反,可以使用以下功能:

    Function GetCalendarTypeMonthWeek(dt As Date) As String
    
        Dim lngDayOfMonth As Long
        Dim lngWeekDay As Long
        Dim dtFirstDayOfMonth As Date
        Dim lngFactor As Long
    
        lngDayOfMonth = Day(dt)
        lngWeekDay = Weekday(dt, vbSunday) '<~~ Sunday=1, Monday=2, etc
        
        'does month start on Sunday?
        dtFirstDayOfMonth = DateValue("01-" & Month(dt) & "-" & Year(dt))
        If Weekday(dtFirstDayOfMonth, vbSunday) = 1 Then
            lngFactor = 1
        Else
            lngFactor = 2
        End If
        
        'get calendar week number for date
        GetCalendarTypeMonthWeek = "Week " & CStr(Int((lngDayOfMonth - lngWeekDay) / 7) + lngFactor)
    
    End Function
    
    函数GetCalendarTypeMonthWeek(dt作为日期)作为字符串
    一个月的长度
    阴暗的工作日和平时一样长
    Dim dtFirstDayOfMonth作为日期
    暗lngFactor尽可能长
    lngDayOfMonth=天(dt)
    
    lngWeekDay=Weekday(dt,vbSunday)“我认为下一个函数将返回您想要的值:

    Function WeekOfTheMonth(DateRef As Date) As Integer
        Dim WeekFirstDayRefMonth As Integer
        WeekFirstDayRefMonth = Application.WeekNum(DateSerial(Year(DateRef), Month(DateRef), 1), 2)
        Dim WeekLastDayRefMonthB As Integer        
        WeekLastDayRefMonthB = Application.WeekNum(DateSerial(Year(DateRef), Month(DateRef), 1) - 1, 2)
        Select Case WeekFirstDayRefMonth - WeekLastDayRefMonthB
            Case 0: WeekOfTheMonth = Application.WeekNum(DateRef, 2) - WeekLastDayRefMonthB + 1
            Case 1: WeekOfTheMonth = Application.WeekNum(DateRef, 2) - WeekLastDayRefMonthB
            Case Else: WeekOfTheMonth = Application.WeekNum(DateRef, 2)
        End Select
    End Function
    
    只要在你的密码上写上
    WeekOfTheMonth(“把你的日期放在这里”)
    ,你就可以开始了。
    请注意:我没有检查此代码的所有场景,因此如果您得到意外结果,请告诉我。

    好的,但我需要每个月从Wk1到Wk4的周数。除了非闰年中的2月,每个月有4周和额外的几天。例如,你会如何处理1月29日至31日?也许你可以用你对周数的定义来更新你的问题。没错,但正如你所说的,即使是一周中的第二天,它也会被视为第四周或第五周,具体取决于一个月中的周数。因此,你的定义是前7天=第一周,第二个7天=第二周,第三个7天=第三周,第四个7天=第四周;还有剩余的天数=第5周?如果3月1日是星期二,那么第1周是3月1日至3月5日(星期六),那么第1周包括5天?