excel 万年历_Excel制作简易“万年历”

今天小编给大家展示的是利用excel函数给大家展示讲解一下几个常用的时间函数的使用方法。

如下图所示,就是一个电子版的日历。

25e9cab0fc5bd7b0a27261e9ba4ecbad.gif

以下给大家讲解一下制作的方法:

第一步:设置表控件

先添加两个表控件,以控制年份与月份的变化。如下图所示:

64a130feb4ebceca42dd0c5e261e968e.gif

第二步:设置公式

步骤1:先对第一个当前的第一个星期天进行星期的判断,在 E5单元格输入以下公式,并向右向下填充:=WEEKDAY($C$1&"-"&$E$1&"-"&1,2),此处利用汉前控件中的年份与月份与第一天组成的日期,判断2017-3-1为星期3。如下图:

e6fbbe6b5dd72352c7453d33af44ead9.gif

(注:weekday这返回日期的星期数,参数2为周一为每周的第一天的开始)。

步骤2:当前的日期2017-3-1为星期三,那么,再向前推3天就是实际上的星期天,正好与E4单元格的星期是一样,即2017-3-1向前推三天,就是2017-2-26,正好是星期天,那么在 以上一个公式上设置如下的公式即可,在 E5单元格输入以下公式,并向右向下填充:

=($C$1&"-"&$E$1&"-"&1)-WEEKDAY($C$1&"-"&$E$1&"-"&1,2)

838e79941f4a657aae7358162b6e1b0e.gif

步骤3:设置左右天数的递增与上下行的周数的递增。

每周从周天到周六的天数的递增,可以给已经写好的公式再加上:column(A:A)-1,即向右填充的时候,天数会随着列的变化而增加。如下图所示:

7d0ffb68db6be39d012eed45cc4704d2.gif

(注:column(A;A)是指A列为1,向右填充以1的差值递增)

从上图可以看出,每一周的天数在增加,但是周周相同,并没有变化。所以根据每一周的周一与下一周的周一的相差的天数是7,来构造每周之间的天数的递增,可惊人使用类似于以上column的方式来构造,给上一步的公式再加上:row(1:1)*7-7,这样就使整个天数合乎规范。如下图:

d7c58293c832ac931073be329cd9952f.gif

(注:ROW(1:1)是返回第一行的行号,*7是每行增加7)

步骤4:利用if函数是只显示当月的数据,其他的月份的日期不再显示。即用if的函数的方法判断,如果当前的单元格是上面的表控件里的月份,那么显示 ,如果不是,则显示空白。公式如下:

=IF(MONTH(($C$1&"-"&$E$1&"-"&1)-WEEKDAY($C$1&"-"&$E$1&"-"&1,2)+COLUMN(A:A)-1+ROW(1:1)*7-7)=$E$1,($C$1&"-"&$E$1&"-"&1)-WEEKDAY($C$1&"-"&$E$1&"-"&1,2)+COLUMN(A:A)-1+ROW(1:1)*7-7,"")

7f402a09d3336b266cd8579583c5bcb4.gif

步骤5:设置显示格式为天。如下:

a5c2015c284c70e37c09e3954d44cbf0.gif

第三步:当天的日期突出显示。

如果今天是2017-3-11,那么就让3-11这一个日期突出显示为其他的颜色,以起到醒目和提示的作用。如下设置条件格式:

ddbeb3975a903ef74992886cdae52e77.gif

最后做相关的美化和调整,即做成一一个简易的万年历。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于单片机、LED1602和DS1302的万年历代码,你可以参考一下: ```c #include <reg52.h> //头文件,引用51单片机的寄存器定义 sbit SCL=P3^6; //定义DS1302通信引脚 sbit SDA=P3^4; sbit RST=P3^5; void delay_us(unsigned char i) //延时函数,i为延时时间 { while(i--); } void delay_ms(unsigned int i) { unsigned char j,k; for(k=0;k<i;k++) for(j=0;j<120;j++); } void ds1302_writebyte(unsigned char dat) //向DS1302写入一个字节 { unsigned char i; for(i=0;i<8;i++) { SDA=dat&0x01; //先送最低位 dat>>=1; //右移一位,将次低位变为最低位 SCL=0; //拉低时钟线 delay_us(1); //延时1us SCL=1; //拉高时钟线 delay_us(1); } } unsigned char ds1302_readbyte() //从DS1302读取一个字节 { unsigned char i,dat=0; for(i=0;i<8;i++) { dat>>=1; SCL=0; delay_us(1); if(SDA) //如果数据线为高电平,dat的最高位为1 dat|=0x80; SCL=1; delay_us(1); } return dat; } void ds1302_write(unsigned char addr,unsigned char dat) //向DS1302写入一个字节 { RST=0; delay_us(2); RST=1; ds1302_writebyte(addr); ds1302_writebyte(dat); RST=0; } unsigned char ds1302_read(unsigned char addr) //从DS1302读取一个字节 { unsigned char dat; RST=0; delay_us(2); RST=1; ds1302_writebyte(addr); dat=ds1302_readbyte(); RST=0; return dat; } void init_ds1302() //初始化DS1302 { ds1302_write(0x8e,0x00); //关闭写保护 ds1302_write(0x80,0x01); //控制寄存器,禁止写保护 ds1302_write(0x81,0x00); //秒归零 ds1302_write(0x84,0x00); //日归零 ds1302_write(0x8e,0x80); //打开写保护 } void lcd_write_cmd(unsigned char cmd) //向LCD发送指令 { P2=cmd; P1&=0xf8; P1|=0x04; delay_ms(1); P1&=0xfb; delay_ms(1); } void lcd_write_data(unsigned char dat) //向LCD发送数据 { P2=dat; P1&=0xf8; P1|=0x05; delay_ms(1); P1&=0xfb; delay_ms(1); } void lcd_init() //LCD初始化 { lcd_write_cmd(0x38); //设置8位数据总线,2行显示,5x7点阵字符 lcd_write_cmd(0x0c); //显示器开,光标关,光标移动关 lcd_write_cmd(0x06); //字符输入时,光标右移,整屏不移 lcd_write_cmd(0x01); //清屏 } void lcd_display(unsigned char *p) //显示字符函数 { unsigned char i; lcd_write_cmd(0x80); for(i=0;i<16;i++) { if(*p=='\0') break; lcd_write_data(*p++); } lcd_write_cmd(0x80+0x40); for(i=0;i<16;i++) { if(*p=='\0') break; lcd_write_data(*p++); } } void main() { unsigned char date[17]; unsigned char year,month,day,week,hour,minute,second; lcd_init(); init_ds1302(); while(1) { second=ds1302_read(0x81); //读取秒 minute=ds1302_read(0x83); //读取分 hour=ds1302_read(0x85); //读取时 week=ds1302_read(0x86); //读取星期 day=ds1302_read(0x87); //读取日 month=ds1302_read(0x88); //读取月 year=ds1302_read(0x89); //读取年 date[0]=(year/10)+'0'; //转换为字符 date[1]=(year%10)+'0'; date[2]='-'; date[3]=(month/10)+'0'; date[4]=(month%10)+'0'; date[5]='-'; date[6]=(day/10)+'0'; date[7]=(day%10)+'0'; date[8]=' '; date[9]=(week%10)+'0'; date[10]=' '; date[11]=(hour/10)+'0'; date[12]=(hour%10)+'0'; date[13]=':'; date[14]=(minute/10)+'0'; date[15]=(minute%10)+'0'; date[16]='\0'; lcd_display(date); //显示日期时间 } } ``` 注意:以上代码只是一个简单的示例,真实的万年历代码要根据需要进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值