Excel制作万年历方法(一看就会)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按CTRL,点击我
我们将一步一步教您怎么制作EXCEL万年历!
Office 2007是微软Office产品史上最具创新与革命性的一个版本。全新设计的用户界面、稳定安全的文件格式、无缝高效的沟通协作。
Excel是Office套件中的一个重要组件之一。直观的界面、出色的计算功能和图表工具,再加上成功的市场营销,使Excel成为最流行的微机数据处理软件。
日历分为阴历和阳历。阳历的历年为一个回归年,现时国际通用的公历(格里高历)即为太阳历的一种,亦简称为阳历;阴历亦称月亮历,或称太阴历,其历月是一个朔望月,历年为1 2个朔望月,其大月30天,小月29 天;中国的农历就是阴阳历的一种。
如何在Excel实现万年历是对Office能力的综合运用,又是分析问题并进行求解的一系列过程。
2. 分析
2.1 整体构思
在进行整体构思之前,不妨我们先看看多数日历是怎样的情形,其中:
1、上面居中为当前年份。
2、然后为当年的12个月份,至于每行为3个月还是4个月取决于可见界面的大小和美观。
3、总所周知,一周则为7天,每个月最大31天,最小28天;如果1号为周六或周日的话,则该月可能要跨越6周;因此每个月最大的跨越为六周,事实上我们找一下其它日历的模板,就会发现一般都是六周。所以我们可以把每个月视为一个7 *6的单元格集合。
我们将一步一步教您怎么制作EXCEL万年历!
2.2 算法问题
当我们确定了每个月事实上为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、农历问题
农历问题是属于典型的算法问题,我还从未见到在单纯的Excel表格中使用函数和表达式就能实现农历算法的。很幸运的是,Office提供了强大的编程语言VBA,再加上强大的互联网搜索引擎,我们很容易就能找到并实现农历的功能。
关于如何对不在当月的农历日期进行屏蔽,详情见步骤。
2.3 显示和实际数据存储的关系
如果仅看以上最终版本,我们很可能认为“2010年日历”为字符串,“1月份”也为字符串,而月份中的日期为数字,实际上除了“一、二、三、四、五、六、日”为字符串外,年份、
月份均为数字类型,而日期则为日期类型;在Excel表中数据的展现方式与存储可以表现迥异,当然展现方式也不能完全孤立于其存储数据的类型和内容。
只有理解了以上困惑和难点,我们才知道如何下手开始工作。
3. 步骤
3.1 填充7*6日期单元格
为了简化问题,便于说明问题,让我们首先从完成第一个月开始
我们将一步一步教您怎么制作EXCEL万年历!
假设当前为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;然后把拷贝