如何在每个月和没有周末的情况下将日期放在星期几的正确名称上

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 中)。平日里会洒出结果