如何在每个月和没有周末的情况下将日期放在星期几的正确名称上
How to put date to right name of a week days in each month and without weekends
我有这份月度工作报告sheet。而且我不知道如何为 B 列做一些自动填充,这将在 A 列中为星期几的正确名称提供一天的数字。
我只能找到给出该月第一周第一个工作日日期的公式。
This will take month and year from B2 and B3 cells and generate first
day in month:
=TEXT(DATEVALUE(CONCATENATE(1;B2;B3));"dd.mm.yyyy")
This will find from first day in mnoth the first working day.
=TEXT(WORKDAY(EOMONTH(R2;-1); 1);"dd.mm.yyyy")
但第一个问题是下个月的第一个工作日以不同的一周开始。
第二个问题是每个星期在每个星期五之后都有一个“总和:”。
拜托,有人可以通过公式或宏为我提供任何解决方案吗?
这真的写得不好,但也许你可以利用它。
基本上,只需 select 具有月份第一天的单元格并输入日期:
代码然后将使用当前日期并沿着列表向下移动,直到它在底部遇到 Sum:
或当前月份结束并使用 dd.mm
格式输入日期(请随时在代码中更改它)。
如果它在左侧找到 Sum:
,它将在当前日期基础上增加 3 天。
否则,它将在当前日期基础上增加 1 天。
值得注意的是,它会在单元格 B2
中查找当前月份的名称
如果你想在格式后添加一个句点(就像你在屏幕截图中显示的那样),只需在行 Format(aDate, "dd.mm")
中添加一个额外的 .
会变成ActiveCell.Value = Format(aDate, "dd.mm.")
Sub GenerateDates()
Dim aDate
aDate = InputBox("Enter Date of Current Cell", "Enter Date of Current Cell")
If IsDate(aDate) Then
aDate = DateValue(aDate)
Do While ActiveCell.Value = ""
ActiveCell.Value = Format(aDate, "dd.mm")
ActiveCell.Offset(1, 0).Select
If ActiveCell.Offset(0, -1).Value = "Sum:" Then
aDate = DateAdd("d", 3, aDate)
ActiveCell.Offset(1, 0).Select
Else
aDate = DateAdd("d", 1, aDate)
End If
If MonthName(Month(aDate)) <> Range("B2").Value Then Exit Sub
Loop
Else
MsgBox "Invalid Date", vbCritical, "Invalid Date!"
Exit Sub
End If
End Sub
当然,这可以修改为假定您 select 单元格上的月份的第一天 - 或者它可以尝试从顶,但这似乎很简单。
参考工作日显示日期
让我们使用一个 Excel 公式:
=LET(
WeekRange; A6:A34;
WeekInterval; 6;
ThisMonth; MATCH(B2; {"January";"February";"March";"April";"May";"June";"July";"August";"September";"October";"November";"December"};);
ThisYear; B3;
WeekNames; {"Monday";"Tuesday";"Wednesday";"Thursday";"Friday"};
FirstDay; DATE(ThisYear; ThisMonth; 1);
LastDay; EOMONTH(FirstDay; 0);
FirstWorkDay; WORKDAY(EOMONTH(FirstDay; -1); 1);
WeekShift; WEEKDAY(FirstWorkDay; 2);
WeekInMonth; QUOTIENT(ROW(WeekRange) - INDEX(ROW(WeekRange); 1); WeekInterval);
WorkDays; IFNA(FirstWorkDay - WeekShift + MATCH(WeekRange;WeekNames;0) + 7*WeekInMonth; "");
TEXT(WorkDays; "[<" & FirstDay & "] ;[>" & LastDay & "] ;dd.mm."))
详情:
WeekInterval
- 相同工作日之间的单元格数
WeekShift
- 从周一开始当月第一个工作日的工作日
WeekInMonth
- WeekRange
中的周数
IFNA(...; "")
- 在 "Sum:"
旁边放置一个空字符串
"[<FirstDay] ;[>LastDay] ;dd.mm."
- 当日期不在月份时显示 space(在关闭方括号 ]
后保留 spaces)
- 由于我的区域设置,我使用分号
;
作为分隔符。
此公式必须放在 WeekRange
的第一个星期一旁边一次(在您的例子中是在单元格 B6
中)。平日里会洒出结果
我有这份月度工作报告sheet。而且我不知道如何为 B 列做一些自动填充,这将在 A 列中为星期几的正确名称提供一天的数字。
我只能找到给出该月第一周第一个工作日日期的公式。
This will take month and year from B2 and B3 cells and generate first day in month:
=TEXT(DATEVALUE(CONCATENATE(1;B2;B3));"dd.mm.yyyy")
This will find from first day in mnoth the first working day.
=TEXT(WORKDAY(EOMONTH(R2;-1); 1);"dd.mm.yyyy")
但第一个问题是下个月的第一个工作日以不同的一周开始。 第二个问题是每个星期在每个星期五之后都有一个“总和:”。
拜托,有人可以通过公式或宏为我提供任何解决方案吗?
这真的写得不好,但也许你可以利用它。
基本上,只需 select 具有月份第一天的单元格并输入日期:
代码然后将使用当前日期并沿着列表向下移动,直到它在底部遇到 Sum:
或当前月份结束并使用 dd.mm
格式输入日期(请随时在代码中更改它)。
如果它在左侧找到 Sum:
,它将在当前日期基础上增加 3 天。
否则,它将在当前日期基础上增加 1 天。
值得注意的是,它会在单元格 B2
如果你想在格式后添加一个句点(就像你在屏幕截图中显示的那样),只需在行 Format(aDate, "dd.mm")
.
会变成ActiveCell.Value = Format(aDate, "dd.mm.")
Sub GenerateDates()
Dim aDate
aDate = InputBox("Enter Date of Current Cell", "Enter Date of Current Cell")
If IsDate(aDate) Then
aDate = DateValue(aDate)
Do While ActiveCell.Value = ""
ActiveCell.Value = Format(aDate, "dd.mm")
ActiveCell.Offset(1, 0).Select
If ActiveCell.Offset(0, -1).Value = "Sum:" Then
aDate = DateAdd("d", 3, aDate)
ActiveCell.Offset(1, 0).Select
Else
aDate = DateAdd("d", 1, aDate)
End If
If MonthName(Month(aDate)) <> Range("B2").Value Then Exit Sub
Loop
Else
MsgBox "Invalid Date", vbCritical, "Invalid Date!"
Exit Sub
End If
End Sub
当然,这可以修改为假定您 select 单元格上的月份的第一天 - 或者它可以尝试从顶,但这似乎很简单。
参考工作日显示日期
让我们使用一个 Excel 公式:
=LET(
WeekRange; A6:A34;
WeekInterval; 6;
ThisMonth; MATCH(B2; {"January";"February";"March";"April";"May";"June";"July";"August";"September";"October";"November";"December"};);
ThisYear; B3;
WeekNames; {"Monday";"Tuesday";"Wednesday";"Thursday";"Friday"};
FirstDay; DATE(ThisYear; ThisMonth; 1);
LastDay; EOMONTH(FirstDay; 0);
FirstWorkDay; WORKDAY(EOMONTH(FirstDay; -1); 1);
WeekShift; WEEKDAY(FirstWorkDay; 2);
WeekInMonth; QUOTIENT(ROW(WeekRange) - INDEX(ROW(WeekRange); 1); WeekInterval);
WorkDays; IFNA(FirstWorkDay - WeekShift + MATCH(WeekRange;WeekNames;0) + 7*WeekInMonth; "");
TEXT(WorkDays; "[<" & FirstDay & "] ;[>" & LastDay & "] ;dd.mm."))
详情:
WeekInterval
- 相同工作日之间的单元格数WeekShift
- 从周一开始当月第一个工作日的工作日WeekInMonth
-WeekRange
中的周数
IFNA(...; "")
- 在"Sum:"
旁边放置一个空字符串
"[<FirstDay] ;[>LastDay] ;dd.mm."
- 当日期不在月份时显示 space(在关闭方括号]
后保留 spaces)- 由于我的区域设置,我使用分号
;
作为分隔符。
此公式必须放在 WeekRange
的第一个星期一旁边一次(在您的例子中是在单元格 B6
中)。平日里会洒出结果