Excel宏从天数查找周末

时间:2017-05-09 10:03:00

标签: excel excel-vba vba

我有一个Excel宏,它计算不。一个月内每天花在任务上的时间。

第一行包含1到31之间的日期数字,并且相应地为一个月的每个日期数字填充数据。工作表名称包含月份名称。

现在,问题是宏在数据不可用的日子留空。那天可以是星期六,星期日,或那天那个人不在。

我希望宏识别周末并突出显示灰色的那些,以便只有缺席天数显示为空白。

2 个答案:

答案 0 :(得分:2)

使用单元格公式和条件格式(下面的VBA)

您可以使用内置的WEEKDAY单元格公式以及DATE公式轻松完成此操作。

通过在工作表中设置年份和月份值,您可以创建一个额外的列,该列将星期几作为1到7之间的数字:

=WEEKDAY(DATE($A$2, $B$2,C2))

weekday formula

然后您可以设置条件格式设置以将第7天和第1天(分别为周六和周日)灰色

conditional formatting

使用VBA

您可以应用与上面相同的逻辑,但是可以应用子命令。这并不要求将月份和年份值存储在工作表中,并从工作表名称中获取月份。然后,如果在周末,它会直接将日期数字变为灰色。

Sub weekdayhighlight()
    Dim days As Range
    Set days = ActiveSheet.Range("C2:C8") ' Range where date numbers are stored, 1,2,...,31
    Dim month As String
    month = ActiveSheet.Name ' Active sheet name is "May"
    Dim day As Range
    Dim daynum As Long
    ' Loop over days to test for weekday
    For Each day In days
        ' Get day number, from date in format "1 May, 2017"
        daynum = Weekday(DateValue(day.Value & " " & month & ", 2017"), firstdayofweek:=vbSunday)
        If daynum = 7 Or daynum = 1 Then
            day.Interior.Color = RGB(200, 200, 200)  ' Grey for saturdays or sundays
        End If
    Next day
End Sub

注意:如果您尝试计算不存在日期的工作日(例如2月31日),则此宏将引发错误。您说每张工作表的日期编号为1到31 ,您应该将其限制为实际现有日期或向代码添加错误处理。

答案 1 :(得分:-1)

尝试将工作表名称和列标题合并到一个循环中的日期(大约一年?),然后使用DatePart()函数来确定它是否是周末。如果列标题是真实日期(可能格式化为仅显示日期)会更容易。