ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4049|回复: 7

[Word 应用与开发] [第7期] 计算任意两个日期差[已完成]

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-1-9 06:52 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

要求:

WORD中任意输入两个合法日期,2005-1-10,2006-2-1,要求WORD域计算结果为11-9;2004-10-5,2008-2-25,域计算结果为4-820.

说明:仅用WORD.

[这次的WORD题,由于个人因素误点,请大家原谅!]

[em04][em04]

域代码为: { ASK DATE1 "请输入第一个日期yyyy-M-D" }

{ SET Y1 { DATE1 \@"YYYY" } }

{ SET M1 { DATE1 \@"M" } }

{ SET D1 { DATE1 \@"D" } }

{ ASK DATE2 "请输入第一个日期yyyy-M-D" }

{ SET Y2 { DATE2 \@"YYYY" } }

{ SET M2 { DATE2 \@"M" } }

{ SET D2 { DATE2 \@"D" } }

{ SET YNUM { ={ Y2 }-{ Y1 } } }

{ SET MNUM { ={ M2 }-{ M1 } } }

{ SET DNUM { ={ D2 }-{ D1 } } }

{ QUOTE "两日期相差为:"{ YNUM}""{ MNUM }""{ DNUM }""}

这是一个简单的WORD域计算,在EXCEL中,是再简单不过的了,但在WORD中,具体的天数计算还是无法象EXCEL那样直接相减得到。

这个题目的本意,是希望大家熟悉WORD中ASK域、REF域、FORMULA域、DATE域的应用。

WORD中,用于人机交互的域(类似于VBA中的对话框)有两个,一个是ASK域,一个是FILLIN域,两者既有共同点,又有不同。ASK域以书签域的形式取得用户输入信息,相当于VBA中的变量赋值,以后可以多次调用该变量(书签);而FILLIN域可以用于一次性的人机对话数据交换,相当于把结果打印在该域中,也可以直接参与计算,并在模板新建文件时自动更新,但不能多次引用,如果需要多次调用时,需使用SET域,将其设置为书签域。

ASK域与FILLIN域多用于邮件合并中取得用户输入信息。

DATE域的年月日中的@图片开关,此处不多作解释,与EXCEL中相似。

关于REF域和FORMULA域,对于数字,可以通用,注意,当书签名与所有WORD域名重合时,REF可以省略,反之,应该加上REF以通知WORD,这是对指定书签域的引用而非WORD中的域。

域代码为: { SET TEST 2006 }

{ =TEST } 结果为2006

{ TEST } 结果为2006

{ SET X "2003Word" }

{ X } 结果为2003Word

{ =x } 结果为2003(此相当于vba.val函数)

QUOTE域用于插入文本,当以数字形式并以空格分隔时,可以插入数字对应的ASCII码后可得对应ACSII字符,见http://club.excelhome.net/viewthread.php?tid=142693&replyID=&skin=1;当文本使用引号括号时,域结果返回文本字符。

[此贴子已经被作者于2006-1-30 10:44:27编辑过]
单选投票, 共有 8 人参与投票

距结束还有: 3344 天18 小时6 分钟

您所在的用户组没有投票权限

TA的精华主题

TA的得分主题

发表于 2006-1-11 13:47 | 显示全部楼层

呵呵,边学边用:

1、插入2个ASK域,用于输入2个日期

2、插入2个REF域,用于显示2个输入的日期

3、通过DATE或TIME的格式开关提取年、月、日数据并计算任意两个日期差

共使用了5个域,域代码如下:

{ ASK D1 请输入日期之一 \d 2005-1-10 }{ REF D1 }

{ ASK D1 请输入日期之一 \d 2005-2-1 }{ REF D2 }'此处应该是D2而非D1,笔误了.
{ quote { ={ D2 \@ "yyyy" } - { D1 \@ "yyyy" } }"年"{ ={ D2 \@ "MM" } - { D1 \@ "MM" } }"月"{ ={ D2 \@ "dd" } - { D1 \@ "dd" } }"天" }

[此贴子已经被守柔于2006-1-28 16:51:23编辑过]

TA的精华主题

TA的得分主题

发表于 2006-1-11 15:36 | 显示全部楼层


您的

域代码为: { SET YEAR1 { rq1 \@ "YYYY" } } { SET YEAR2 { rq2 \@ "YYYY" } }{ SET month1 { rq1 \@ "MM" } } { SET month2 { rq2 \@ "MM" } }{ SET day1 { rq1 \@ "DD" } }{ SET day2 { rq2 \@ "DD" } }

差额:{ = year2-year1 } { = month2-month1 } { = day2-day1 }

如果使用ASK域更直观一些,另外日期图片开关中的“MM”,“DD”使用“M”、“D”更适宜一些。

[此贴子已经被守柔于2006-1-30 10:42:41编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2006-1-12 09:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

摸索着做了一个,版主看看是否符合要求


您的

域代码为: 你输入的第一个日期是: { ASK date1 请输入第一个日期(较前的日期) \* MERGEFORMAT }{ date1 }

你输入的第二个日期是: { ASK date2 请输入第二个日期(较后的日期) \* MERGEFORMAT }{ date2 }

{ SET YEAR1 { date1 \@"YYYY" } }

{ SET YEAR2 { date2 \@"YYYY" } }

{ SET MONTH1 { date1 \@"M" } }

{ SET MONTH2 { date2 \@"M" } }

{ SET DAY1 { date1 \@"D" } }

{ SET DAY2 { date2 \@"D" } }

{ SET YEARS { = YEAR2 - YEAR1 } }

{ SET MONTHS { = MONTH2 - MONTH1 } }

{ SET DAYS { = DAY2 - DAY1 } }

WORD域计算结果:{ YEARS }{ MONTHS }{ DAYS }

[此贴子已经被守柔于2006-1-30 10:34:40编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2006-1-15 19:56 | 显示全部楼层

在版主题目的基础上增加了一些要求,两个日期的输入可以不分先后的随便输入,使计算结果不会出现负数,参考版主以前的帖子,增加了2月份的日期判断

结果如下:

你输入的第一个日期是: 2004-10-5

你输入的第二个日期是: 2008-2-25

WORD域计算两日期间隔的结果:4420

域代码如下:


您的

域代码为: WORD中任意输入两个合法日期,2005-1-10, 2006-2-1,要求WORD域计算结果为1122;2004-10-5,2008-2-25,域计算结果为4420.

你输入的第一个日期是: { ASK date1 请输入第一个日期(较前的日期) \* MERGEFORMAT }{ date1 }

你输入的第二个日期是: { ASK date2 请输入第二个日期(较后的日期) \* MERGEFORMAT }{ date2 }


{ SET YEAR1 { date1 \@"YYYY" } }

{ SET YEAR2 { date2 \@"YYYY" } }

{ SET MONTH1 { date1 \@"M" } }

{ SET MONTH2 { date2 \@"M" } }

{ SET DAY1 { date1 \@"D" } }

{ SET DAY2 { date2 \@"D" } }

{ IF { =MOD({ YEAR1 },4) } = 0 { SET TEMP 29 } { SET TEMP 28 }}'取得闰年2月份的最后一天

判断并设置每月的天数

{ IF MONTH1 = 2 { SET X { TEMP } } { IF MONTH1 = 4 { SET X 30 } { IF MONTH1 = 6 { SET X 30 } { IF MONTH1 = 9 { SET X 30 } { IF MONTH1 = 11 { SET X 30 } { SET X 31 } } } } } }

年的判断

{ IF { = YEAR1 } <= { = YEAR2 } { SET YEARS { =YEAR2-YEAR1 } } { SET YEARS { =YEAR1-YEAR2 } } }

月的判断

{ IF { = YEAR1 } <= { = YEAR2 } { IF { = MONTH1 } <= { = MONTH2 } { SET MONTHS { =MONTH2-MONTH1 } } { SET MONTHS { =12-MONTH1+MONTH2 } } }

{ IF { = MONTH2 } <= { = MONTH1 } { SET MONTHS { =MONTH1-MONTH2 } } { SET MONTHS { =12-MONTH2+MONTH1 } } } }

天的判断

{ IF { = YEAR1 } <= { = YEAR2 } { IF { = DAY1 } <= { = DAY2 } { SET DAYS { =DAY2-DAY1 } } { SET DAYS { =X-DAY1+DAY2 } } } { IF { = DAY2 } <= { = DAY1 } { SET DAYS { =DAY1-DAY2 } } { SET DAYS { =X-DAY2+DAY1 } } } }


WORD域计算两日期间隔的结果:{ YEARS }{ MONTHS }{ DAYS }

运行结果:

你输入的第一个日期是: 2004-10-5

你输入的第二个日期是: 2004-2-5

WORD域计算两日期间隔的结果:040

你输入的第一个日期是: 2004-10-5

你输入的第二个日期是: 2004-2-4

WORD域计算两日期间隔的结果:0430

所以,尽管sailorgg兄设计思路很好,但还是有些问题,实际上WORD处理日期运算具体到实际天数是,几乎是做不到的。

[此贴子已经被守柔于2006-1-30 10:32:55编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2006-1-16 11:44 | 显示全部楼层

好难啊

还是学习了你以前的帖子才完成的.惭愧.建议不评分.


您的域代码为: { quote {quote { quote { ={quote { enddate } \@ "y" }-{quote { begindate } \@ "y" } } “年”}}{quote { quote { ={quote { enddate } \@ "M" }-{quote { begindate } \@ "M" } } “月”}}{quote { quote { ={quote { enddate } \@ "d" }-{quote { begindate } \@ "d" } } “ 天”}}}

设置了两个书签,建议使用ASK域更好,增强人机互动。

QUOTE域的反复使用,没有必要,结果正确。

[此贴子已经被守柔于2006-1-30 10:20:31编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2006-1-16 12:59 | 显示全部楼层

小弟做完,老大指点一下。


KONGGS兄的域代码:

域代码为:

{ set 开始日期 { fillin "请输入开始日期" } }{ set 截止日期 { fillin "请输入截止日期" } }

{ TIME \@ "yyyy''M''d''" }

{ set 日 { ={ 截止日期 \@ d } - { 开始日期 \@ d }  }}

{ set 月 { if >0 { ={ 截止日期 \@ M } - { 开始日期 \@ M }  }} { ={ 截止日期 \@ M } - { 开始日期 \@ M }-1  }}

{ set { if >0 ={ 截止日期 \@ yyyy } - { 开始日期 \@ yyyy } } { ={ 截止日期 \@ yyyy } - { 开始日期 \@ yyyy }-1  }}

{ }{ }{ }

分析:

此题不宜使用FILLIN域,使用ASK域更好,省却两个个SET域。

域代码中全角空格,可能是输入法切换过程中造成的,请注意尽量规避。

TIME域此处没有意义。

日书签是正确的。

月书签则根据日书签,假如截止日期数大于起始日期数,则正常相减,反之,则月份数减1。思路是正确的,但如果截止日期为1月10日,起始日期是2月20日,两者结果应是?同理,年亦是如果,所以,KONGGS兄考虑过于复杂了,并且,此题若真是如此计算,在WORD中,不一定能得到正解,原因在于在域中得不到类似于EXCEL中的日期序列值。

[此贴子已经被守柔于2006-1-30 10:14:25编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2006-1-19 16:17 | 显示全部楼层

不知道方法对不对?

先输入两个时间2005-1-10和2006-2-1,然后分别将这6个数字分别定义标签,如分别定义为y1、y2、m1、m2、d1和d2,然后输入{{=y1-y2 \# "#年"} {=m1-m2 \# "#月"} {=d1-d2 \# "#日"}},然后点击更新域,即可得到-1年-1月9日的结果!

如果您能将附件上传更好一些。

[此贴子已经被守柔于2006-1-30 10:37:04编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-29 12:46 , Processed in 0.066590 second(s), 16 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表