Excel生成指定月份周五周六日期的公式优化需求
通用解决方案:生成当月周五/周六序列
E11单元格(生成当月所有周五,向下拖动)
如果你的Excel支持LET函数(Office 365/2021及以上),使用简洁版公式:
= LET( first_fri, DATE(YEAR($K$6), MONTH($K$6), 1) + MOD(6 - WEEKDAY(DATE(YEAR($K$6), MONTH($K$6), 1),1),7), current_date, first_fri + 7 * INT((ROW()-11)/2), IF(MONTH(current_date)=MONTH($K$6), current_date, "") )
兼容旧版Excel的展开式:
= IF(MONTH(DATE(YEAR($K$6), MONTH($K$6), 1) + MOD(6 - WEEKDAY(DATE(YEAR($K$6), MONTH($K$6), 1),1),7) + 7 * INT((ROW()-11)/2))=MONTH($K$6), DATE(YEAR($K$6), MONTH($K$6), 1) + MOD(6 - WEEKDAY(DATE(YEAR($K$6), MONTH($K$6), 1),1),7) + 7 * INT((ROW()-11)/2), "")
E12单元格(生成当月所有周六,向下拖动)
支持LET的简洁版:
= LET( first_sat, DATE(YEAR($K$6), MONTH($K$6), 1) + MOD(7 - WEEKDAY(DATE(YEAR($K$6), MONTH($K$6), 1),1),7), current_date, first_sat + 7 * INT((ROW()-12)/2), IF(MONTH(current_date)=MONTH($K$6), current_date, "") )
兼容旧版Excel的展开式:
= IF(MONTH(DATE(YEAR($K$6), MONTH($K$6), 1) + MOD(7 - WEEKDAY(DATE(YEAR($K$6), MONTH($K$6), 1),1),7) + 7 * INT((ROW()-12)/2))=MONTH($K$6), DATE(YEAR($K$6), MONTH($K$6), 1) + MOD(7 - WEEKDAY(DATE(YEAR($K$6), MONTH($K$6), 1),1),7) + 7 * INT((ROW()-12)/2), "")
公式原理
- 计算当月第一个目标日期:
- 周五:通过
MOD(6 - WEEKDAY(月初日期,1),7)计算月初到第一个周五的天数差,确保结果始终落在当月内(比如4月1日是周六时,差值为6,得到4月7日) - 周六:同理,用
MOD(7 - WEEKDAY(月初日期,1),7)计算差值,4月1日是周六时差值为0,直接返回4月1日
- 周五:通过
- 生成后续周的日期:
- 利用
INT((ROW()-起始行号)/2)实现每两行增加7天(对应周五、周六为一组,下一组自动跳转至下一周的周五/周六)
- 利用
- 边界判断:通过
MONTH(current_date)=MONTH($K$6)确保日期不超出目标月份,超出则返回空值
原问题原因
旧公式在月初为周六(WEEKDAY($K$6,1)=7)时,计算周五的逻辑会生成上月最后一天(如4月1日会算出3月31日),因月份不匹配返回空值。新公式直接锁定当月范围计算首个目标日期,彻底避免跨月问题。
内容的提问来源于stack exchange,提问作者YasserKhalil
相关产品推荐
相关产品推荐

