Excel万年历的制作

来源:百度文库 编辑:神马文学网 时间:2024/07/08 05:18:21

概述

日历分为阴历和阳历。阳历的历年为一个回归年,现时国际通用的公历(格里高历)即为太阳历的一种,亦简称为阳历;阴历亦称月亮历,或称太阴历,其历月是一个朔望月,历年为12个朔望月,其大月30天,小月29 天;中国的农历就是阴阳历的一种。如何在Excel实现万年历是对Office能力的综合运用,又是分析问题并进行求解的一系列过程。

 

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

算法问题

确定了每个月事实上为7*6的单元格集合后,接下来要做:1、   如何定位和填充相应的每月的7*6单元格在单纯的Excel表中,我们很难采用逻辑判断和循环的方式获取在7*6单元格集合中的第一个星期一应该是哪一天;但我们知道这个7*6单元格所在月的第一天即1号却是固定的,同样当日期固定后,该日期所在的星期几也是固定的,假设2010-01-01为星期五,那星期一是几号呢?很显然,为2010年1月1号向前推4天即2009年12月28号,星期二则为1月1号向前推3天,以此类推,可以推到整个42个单元格中,只不过超过当月第一天的日期则向后推了。如果我们换个思路可能更好些,在第一个7*6单元格集合中的首个星期一为2010年1月1号向前推5天即星期五,然后加1天,这也是理所当然的求法,那么星期二则为1月1号向前推5天,然后加2天,以此类推,推倒第42个单元格中则为1月1号向前推5天,然后加42天了,从1到42则为一个整数的序列;这样就变成Excel更擅长的计算方式了。2、   如何屏蔽非当月的日期大家也许会注意到在这个7*6的单元格集合中,一定会混入不属于这个月的日期,怎么把这些不属于本月的日期去除呢?如果我们用函数来实现的话,也不是不可能,只不过过于复杂。幸好Excel提供了条件格式,条件格式的目的就是为符合或不符合相应条件的单元格提供该单元格的格式化需求,如果我们将小于当月第一天,或者大于等于下个月第一天值的单元格字符设置为白色字体,同时将这些单元格的背景色也置为白色,岂不是看不到了嘛。3、   农历问题

显示和实际数据存储的关系

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

步骤

填充7*6日期单元格

从完成第一个月开始假设当前为2010年的1月份。那么2010年1月份首日则为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得到下周一的日期;从1到42是个数字序列,为了快捷的缘由,直接构造一个从1~42的数字序列,因此把B5-J6+1替换为B5-J6+K6;然后把拷贝公式到之后的行列中,再把B5、J6改为绝对引用,即$B$5,$J$6,=$B$5-$J$6+K6当完成公式,并复制到7*6剩余的单元格后,1月份已填充完毕,再与本机的日历比较一下,发现没有问题

     条件格式隐藏不符合条件的数据

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

套用表格格式进行美化

为了让界面好看点,点击套用表格格式(选中包括标题栏的7*7单元格集合),选择自己喜欢的表格样式。接下来自动对所谓的标题栏进行筛选。然后,在这个7*7的单元格集合任意地方点击右键—>表格—>转换为区域即可。

    进一步美工

 

        添加农历

首先点击开发工具—>点击Visual Basic。然后插入模块,将GetYLDate()函数拷贝到右边的工作区域。关闭Visual Basic窗口,回到Excel界面中,在每行日期下面增加一空行。在对应的空行下输入以下公式,例如在C7下,输入=GetYLDate(C6)。选中所有新增的农历行,然后点击条件格式—>清除规则—>清除所选单元格的规则。接下来,如果其上面的公历日期在本月范围内,则输出阴历,否则则输出空格。=IF(AND(C6>=$B$5,C6<$S$5),GetYLDate(C6)," ")  最终结果如下:

     持续改进

首先需要把每个月的日历完善起来。其次需要把年份动态加入到相应的月份和日期中来。再次需要添加数值调节钮(表单控件和ActiveX控件均可)