参照John Walkenbach书中的方法,制作了一个日历,效果如下:

这个日历可以实现从1900年开始至9999年的日期的显示,实现方法主要是基于时间日期函数和数组公式的应用。

D2单元格用于选择月份,在数据有效性中选择序列,输入January,Febury,March,April,May,June,July,August,September,October,November,December:

F2用于调整年份,插入“数值调整钮”控件

设置控件格式如下:

现对实现过程解释如下:

第一步、首先定义如下几个名称

1.MonthNames:

={"January","Febury","March","April","May","June","July","August","September","October","November","December"}

用于月份下拉列表中的序列。

2.TheMonth:记录所选择的月份。

=MATCH(日历!$D$2,MonthNames,0)

3.TheYear:记录所选择的年份。指向了G2

4.week ={0;1;2;3;4;5}注意这里的数组常量中由分号分隔,这是一个六维的数组,之所以是六个,是因为一个月中最多横跨六个周。

5.weekday ={0,1,2,3,4,5,6}注意此处的数组常量由逗号分隔,这是一个一维的七元数组,表示一周的七天(更确切的讲是七天的位置)。

6.StartDate =DATE(TheYear,TheMonth,1)表示在选定的年份、选定的月份条件下,该月第一天。使用这个值是为了之后区分是否是本月的数据方便。

7.StartDow =WEEKDAY(StartDate,3)表示StartDate在一个星期中的位置,即在weekday中的某一个数组。。此处WEEKDAY是EXCEL中的一个时间日期函数,需关注输入参数3,按照星期一—星期日的顺序依次显示0-6,返回参数代表日期的星期数。StartDow的取值为0-6,刚好与weekday(数组常量)中的数值相一致。

第二步、分析

可以确定,一个月中最大是星期跨度为6,因此每月的日期必然能够放在一个6*7的区域内,在本文中即为"C6:I11"。下面我们要解决的是如下两个问题:
问题1:如何得到该6*7区域中每一天的日期。

问题2:如何区分出该区域中哪些是在本月的,哪些不是在本月的,不在本月份的应不予显示。

第三步、实现:

1.问题1的解决:

我们可以利用两个数组常量week={0;1;2;3;4;5}和weekday={0,1,2,3,4,5,6}进行数组公式运算、借助StartDate,StartDow、使用其他时间日期函数来实现,具体方法为

选定单元格区域"C6:I11",输入公式“=StartDate-StartDow+week*7+Weekday ”,并按下“Ctrl+Shift+Enter”组合键,输入此数组公式。结果如下:(以2011/03月为例)

40601

40602

40603

40604

40605

40606

40607

40608

40609

40610

40611

40612

40613

40614

40615

40616

40617

40618

40619

40620

40621

40622

40623

40624

40625

40626

40627

40628

40629

40630

40631

40632

40633

40634

40635

40636

40637

40638

40639

40640

40641

40642

其中week*7+weekday会得到如下二位数组:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

而-StartDow+week*7+weekday则表示每一天相对于本月第一天(用StartDate表示)的相对距离,结果如下

-2

-1

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

所以StartDate-StartDow+week*7+Weekday就可以得到这个表格中的每一个单元格中代表的日期的真实日期值。如果我们把这个单元格的格式调成日期时间格式,结果如下:

2011-2-27

2011-2-28

2011-3-1

2011-3-2

2011-3-3

2011-3-4

2011-3-5

2011-3-6

2011-3-7

2011-3-8

2011-3-9

2011-3-10

2011-3-11

2011-3-12

2011-3-13

2011-3-14

2011-3-15

2011-3-16

2011-3-17

2011-3-18

2011-3-19

2011-3-20

2011-3-21

2011-3-22

2011-3-23

2011-3-24

2011-3-25

2011-3-26

2011-3-27

2011-3-28

2011-3-29

2011-3-30

2011-3-31

2011-4-1

2011-4-2

2011-4-3

2011-4-4

2011-4-5

2011-4-6

2011-4-7

2011-4-8

2011-4-9

至此,问题1已经得到了解决,我们得到了这个6*7的单元格

2.问题2的解决。

我们使用If函数和Month函数的混合搭配即可过滤掉非当前月份的数据,具体如下:

选定该单元格区域,输入如下公式

“=IF(MONTH(StartDate-StartDow+week*7+Weekday)<>TheMonth,"",DAY(StartDate-StartDow+week*7+Weekday))”,按下“Ctrl+Shift+Enter”组合键。

该公式通过判断每一个单元格区域代表日期所在的月份值与所选定的月份值是否相等,如不相等,则不显示任何数据,如相等,也就是确实是选定月份的日期数据,则显示出该日期的日数(有DAY函数给出)。注意,这样需将该区域的单元格格式调为“数值”或“常规”,而不能是“时间日期”。

使用Excel数组函数制作日历相关推荐

  1. xcode新版本single view_动态数组函数系列1|概况-跟以往Excel版本完全不一样玩法的函数...

    早就听说在Office2019和Office365版本中增加了动态数组函数(Dynamic arrays),早前一直处于内测阶段,只对部分预览用户开放.昨天试了一下,我用的版本已经更新可用了.当前我使 ...

  2. javascript二维数组转置_精通Excel数组公式010:认识数组函数:TRANSPOSE、MODE.MULT和TREND...

    学习Excel技术,关注微信公众号: excelperfect 数组函数是可以提供多个值的Excel内置函数.下面列出了8个Excel内置的数组函数: TRANSPOSE函数 MODE.MULT函数( ...

  3. Excel中的数组函数

    快捷键 ・光标进入当前单元格, Ctrl + Shift + Enter,可以给数组函数加上花括号 } (选中当前单元格, 光标进入Excel上面的[公式栏], Ctrl + Shift + Ente ...

  4. 小福利,采用excel函数制作大屏可视化,用sumifs函数快速统计汇总数据,锁行锁列以及锁列不锁行

    小福利,采用excel函数制作大屏可视化,用sumifs函数快速统计汇总数据,锁行锁列以及锁列不锁行 源数据如下图所示 第一步处理源数据的效果是下图 其中根据年份变化,求总订单量.总销量.总销售额,只 ...

  5. 小福利,巧用excel的if函数制作乘法口诀表以及if函数嵌套使用

    小福利,巧用excel一个公式制作乘法口诀表 如题,我们可以利用excel的if条件判断函数,来制作简单的乘法口诀表 在B2输入公式=IF($A2>=B$1,$A2*B$1,"&quo ...

  6. 用Excel函数制作迷你图?这技能简直不要太酷炫!| 薪技巧

    EXCEL图表系列: Excel数据分析常用函数①--查询函数 Excel高级图表制作①--电池图/KPI完成情况对比图 Excel高级图表制作②--帕累托图 Excel高级图表制作③--漏斗图/转化 ...

  7. c语言choose函数怎么用,Excel Choose函数的使用方法,包含把数组和定义名称为作参数及与Match组合实现绩效或成绩评定实例...

    在 Excel 中,Choose函数用于从值列表中选择索引号指定的值:它的索引号取值范围为 1 到 254.至少有一个最多只能有 254 个.Choose函数的索引号除用数字外,还可用数组.函数和公式 ...

  8. html自动生成价格,Excel技巧:用VLOOKUP函数制作产品报价单,自动生成价格!

    今天,教大家给大家分享一个用VLOOKUP函数制作产品报价单,自动生成价格的小技巧,输入对应的产品编号,就能够自动生成价格和日期,录入数量后能生成金额. 1.准备工作 Sheet1中是报价单表格,大家 ...

  9. Excel万年历的制作

    1.   概述 Office 2007是微软Office产品史上最具创新与革命性的一 个版本.全新设计的用户界面.稳定安全的文件格式.无缝高效的沟通协作. Excel是Office套件中的一个重要组件 ...

  10. 动态列排序_Excel表格利用函数制作排序器(可依据不同字段、升降序排序)

    Excel表格中的排序功能是我们经常使用的一个功能,排序的方式主要有升序排序.降序排序和自定义排序.前两种排序方式默认的排序依据都是所选排序区域的第一列数据,自定义排序用户可以自定排序的主要依据和次要 ...

最新文章

  1. (十三)事件分发器——event()函数,事件过滤
  2. 【讨论贴】关于父实子虚的疑问???
  3. eclipse是否免费
  4. 【转】DICOM:DICOM三大开源库对比分析之“数据加载”
  5. .netcore 如何获取系统中所有session_ASP.NET Core微服务实战 一、二
  6. 2010年3月份第二周51aspx发布源码
  7. libsvm——数据格式的转换及使用
  8. (转)SegWit 与 Lightning Network
  9. 软考—软件设计师(中级)第5版
  10. 1.2软件测试的定义和分类
  11. 如何使用一个手机号注册两个微信号!
  12. 主要计算机网络设备及其主要用途
  13. 统计学假设检验中 p 值的含义具体是什么?
  14. MCNP运算及代码基础结构和可视化软件VISED的使用
  15. 在群晖NAS上搭建 Git Server
  16. [CF796E Round#408 Div.2]Exam Cheating——[计数DP]
  17. Outlook中将发送邮件自动CC给自己
  18. 那些“不务正业”的软件.......
  19. 阿里云镜像网站 快速下载Centos各个版本 全流程
  20. Hadoop常用端口web界面

热门文章

  1. 学校计算机考试系统故障,解决在线考试系统设计的常见问题
  2. 【移动安全基础篇】——26、两个简单app破解
  3. input输入框自动去除空格
  4. ureport2项目使用
  5. 一起学ORBSLAM2(6)ORBSLAM中的特征匹配
  6. 模拟win10系统开机加载的动画
  7. Ubuntu 16.04 安装无线网卡 Tenda U12
  8. 工信部《物联网的十三五规划(2016-2020年)》
  9. 超图(idesktop iserver10) 处理osgb倾斜摄影和tif并 发布 加载 ---1---连续更新
  10. docx4j书签的妙用