评论

收藏

[办公软件] Excel万年历的制作

电脑办公 电脑办公 发布于:2021-06-24 13:42 | 阅读数:468 | 评论:0

1.  概述Office 2007是微软Office产品史上最具创新与革命性的一个版本。全新设计的用户界面、稳定安全的文件格式、无缝高效的沟通协作。ExcelOffice套件中的一个重要组件之一。直观的界面、出色的计算功能和图表工具,再加上成功的市场营销,使Excel成为最流行的微机数据处理软件。日历分为阴历和阳历。阳历的历年为一个回归年,现时国际通用的公历(格里高历)即为太阳历的一种,亦简称为阳历;阴历亦称月亮历,或称太阴历,其历月是一个朔望月,历年为12个朔望月,其大月30天,小月29 天;中国的农历就是阴阳历的一种。如何在Excel实现万年历是对Office能力的综合运用,又是分析问题并进行求解的一系列过程。2.  分析2.1         整体构思

在进行整体构思之前,不妨我们先看看多数日历是怎样的情形,其中:1、  上面居中为当前年份。2、  然后为当年的12个月份,至于每行为3个月还是4个月取决于可见界面的大小和美观。3、  总所周知,一  周则为7天,每个
  月最大
31天,最
  小
28天;如果1号为周六或周日的话,则该月可能要跨越6周;因此每个月最大的跨越为六周,事实上
我们找一下其它日历的模板,就会发现一般都是六周。所以我们可以把每个月视为一个
76的单元格集合。2.2  
算法问题


当我们确定了每个月事实上为7
6的单元格集合后,我们接下来要做以下几件事情:1、  如何定位和填充相应的每月的7*6单元格在单纯的Excel表中,我们很难采用逻辑判断和循环  的方式获取在76
元格集合中的第一个星期一应该是哪一天;但我们知道这个
7
6单元格所在月的第一天即1号却是固定的,同样当日期固定后,该日期所在的星期几也是固定的,假设2010-01-01为星期五,那星期一是几号呢?很显然,为201011号向前推4天即20091228号,星期二则为11号向前推3天,以此类推,可以推到整个42个单元格中,只不过超过当月第一天的日期则向后推了。如果我们换个思路可能更好些,在第一个7*6单元格集合中的首个星期一为201011号向前推5天即星期五,然后加1天,这也是理所当然的求法,那么星期二则为11号向前推5天,然后加2天,以此类推,推倒第42个单元格中则为11号向前推5天,然后加42天了,从142则为一个整数的序列;这样就变成Excel更擅长的计算方式了。2、  如何屏蔽非当月的日期大家也许会注意到在这个76的单元格集合中,一定会混入不属于这个月的日期,怎么把这些不属于本月的日期去除呢?如果我们用函数来实现的话,也不是不可能,只不过过于复杂。幸好Excel提供了条件格式,条件格式的目的就  是为符合或不符合相应条件的单元格提供该单元格的格式化需求,如果我们将小于当月第一天,或者大于等于下个月第一天值的单元格字符设置为白色字体,同时将
这些单元格的背景色也置为白色,岂不是看不到了嘛。
3、  农历问题农历问题是属于典型的算法问题,我还从未见到  在单纯的Excel
格中使用函数和表达式就能实现农历算法的。很幸运的是,
Office提供了强大的编程语言VBA,再加上强大的互联网搜索引擎,我们很容易就能找到并实现农历的功能。关于如何对不在当月的农历日期进行屏蔽,详情见步骤。2.3   
显示和实际数据存储的关系


如果仅看以上最终版本,我们很可能认为“2010年日历”为字符串,“1月份”也为字符串,而月份中的日期为数字,实际上除了“一、二、三、四、五、六、日”为字符串外,年份、月份均为数字类型,而日期则为日期类型;在Excel表中数据的展现方式与存储可以表现迥异,当然展现方式也不能完全孤立于其存储数据的类型和内容。只有理解了以上困惑和难点,我们才知道如何下手开始工作。3.  步骤3.1   
填充7
6日期单元格

为了简化问题,便于说明问题,让我们首先从完成第一个月开始假设当前为2010年的1月份。那么20101月份首日则为2010-01-01。我们把B5设置为2010-01-01,同时将其设置单元格格式为m""""同时2010-01-01所在的星期=weekday(B5,2),则为5即星期五既然2010-01-01是星期五,那本7*6单元格集合的第一个星期一应该是几号呢?显然为=B5-4,也即=B5-WEEKDAY(B5,2)+1,然  后依次加2得到周
  二的日期,加
3
  到周三的日期,加
8
  到下周一的日期;既然从
142
个数字序列,为了快捷的缘由,我们直接构造了一个从
1~42的数字序列,因此用我们把B5-J6+1替换为B5-J6+K6;然后把拷贝公式到之后的行列中,但这样问题又来了,拷贝公式是相对引用的,我们想变的是K6即数字序列而不是B5J6,因此我们要把B5J6改为绝对引用,即$B$5,$J$6=$B$5-$J$6+K6当我们完成公式,并复制到76剩余的单元格后,就会发现1月份已填充完毕了,再与本机的日历比较一下,发现是没问题的3.2      条件格式隐藏不符合条件的数据

接下来我们来考虑如何隐藏非本月的日期,实际上算法很简单:20101月份的日历中,将日期<2010-01-01或者 日期>=2010-02-01的单元格的字体颜色和背景色设置为白色即可。在这里我们首先选中1月份的42个单元格,然后找到条件格式,点击管理规则。     在条件格式规则管理器中,点击新建规则。 在新建格式规则中,选择规则类型为,选择规则类型为“只为包含以下内容的单元格设置格式”。设置单元格值 小于 $B$5,即201011日所在的单元格,然后点击格式按钮在设置单元格格式窗口中,将字体颜色设置为白色,将填充背景色设置为白色。确定后回到条件格式规则管理器,再次新建规则  —>只为包
含以下内容的单元格设置格式。
设置单元格值 大于或等于 $S$5,即201021日所在的单元格,然后点击格式按钮。在设置单元格格式窗口中,将字体颜色设置为白色,将填充背景色设置为白色。最终,条件格式规则管理器结果如下              然后返  回Excel表,
发现
20101月份的日期已经正常显示。3.3  
套用表格格式进行美化


为了让界面好看点,我们在点击套用表格格式(选中包括标题栏的7
7单元格集合),选择自己所喜欢的表格样式。但是,套用表格格式会导致另外一个不想要的结果,即自动对所谓的标题栏进行了筛选。接下来,我们在这个7*7的单元格集合任意地方点击右键—>表格—>转换为区域即可。3.4      进一步美工

我们还可以进一步进行美化处理,这个取决于你自己的想象力了,而非技术。3.5        添加农历

首先点击开发工具—>点击Visual Basic然后插入模块,将GetYLDate()函数拷贝到右边的工作区域。关闭Visual Basic窗口,回到Excel界面中,在每行日期下面增加一空行。在对应的空行下输入以下公式,例如在C7下,输入=GetYLDate(C6)很不幸,我们并没有看到如期的效果,这个时侯,需要选中所有新增的农历行,然后点击条件格式—>清除规则—>清除所选单元格的规则。很明显,这个也并非我们想要的,因为所有非本  月的农历日期也全部显示出来了,再应用条件格式的话,恐怕技术上会有问题,我们不妨换一种思路,如果其上面的公历日期在本月范围内,则输出阴历,否则则输
出空格。
=IF(AND(C6>=$B$5,C6<$S$5),GetYLDate(C6),"")  最终结果如下:3.6         持续改进

首先需要把每个月的日历完善起来。其次需要把年份动态加入到相应的月份和日期中来。再次需要添加数值调节钮(表单控件和ActiveX控件均可)4.  总结Excel的万年历制作涉及到Excel的函数、相对引用、绝对引用、数据的物理存储和展现、条件格式、套用表格格式、控件、VBA如果把万年历看做是一个小型项目的话,从需求分析、系统设计、实现、测试,直至不断优化是个反复迭代的过程。总之通过Excel万年历的制作收益匪浅。
关注下面的标签,发现更多相似文章