我有一个Excel宏,它计算不。一个月内每天花在任务上的时间。
第一行包含1到31之间的日期数字,并且相应地为一个月的每个日期数字填充数据。工作表名称包含月份名称。
现在,问题是宏在数据不可用的日子留空。那天可以是星期六,星期日,或那天那个人不在。
我希望宏识别周末并突出显示灰色的那些,以便只有缺席天数显示为空白。
答案 0 :(得分:2)
使用单元格公式和条件格式(下面的VBA)
您可以使用内置的WEEKDAY
单元格公式以及DATE
公式轻松完成此操作。
通过在工作表中设置年份和月份值,您可以创建一个额外的列,该列将星期几作为1到7之间的数字:
=WEEKDAY(DATE($A$2, $B$2,C2))
然后您可以设置条件格式设置以将第7天和第1天(分别为周六和周日)灰色
使用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()函数来确定它是否是周末。如果列标题是真实日期(可能格式化为仅显示日期)会更容易。