[转]【VBA研究】VBA中日期和时间相关的计算

作者:iamlaosong

http://blog.csdn.net/iamlaosong/article/details/18458253

VBA中取当前日期的函数是Date,当前时间的函数是Time,当前日期和时间一起取是Now。日期转换成年月日的函数分别是:Year、Month、Day,参数可以用Date或Now取出的值。时间转换成时分秒的函数分别是:Hour、Minute、Second,参数可以用Time或Now取出的值。

例如:

  MsgBox "当前时间:" & Now & Chr(10) & _            "时:" & Hour(Now) & Chr(10) & _            "分:" & Minute(Now) & Chr(10) & _            "秒:" & Second(Now)   MsgBox "当前日期:" & Now & Chr(10) & _            "年:" & Year(Now) & Chr(10) & _            "月:" & Month(Now) & Chr(10) & _            "日:" & Day(Now)

1、日期转换

很简单,直接用转换函数就可以了,例如:CDate("2012-12-31")

2、日期之间的天数

用datediff函数,注意,工作表单元格中用的函数名称是datedif,少了一个f,而且参数顺序也不一样(=DATEDIF(A2,B2,"d"))。例如:

dt = Cells(2, 1)     ‘ 单元格内容:2013-1-1 09:35:08

dd = DateDiff("D", CDate("2012-12-31"), dt)

其中的“D”也可以换成其他字母,以便计算其它时间差(年月日时分秒等),比如“W”表示计算两个日期之间周数,“H”表示计算两个日期之间的小时数数,具体见本文最后的附录。

日期之间的天数最简单的就是直接相减,如果日期中包含时间,相减是两个日期时间值相减,结果是个浮点数(时间差),计算天数需要用datevalue转换(相当于去掉小数部分的取整)后才能计算,例如:

dt = Cells(2, 1)     ‘ 单元格内容:2013-1-1 09:35:08

dd = DateValue(dt) - CDate("2012-12-31")

实际上,DateValue函数的值就是被转换日期距1900-1-1的天数加1,也就是说日期1900-1-1的DateValue函数值就是1,在此日期之前的日期Excel是不认的。日期时间本质就是一个浮点数,整数部分是日期,小数部分是时间。

3、时间差计算

时间差计算一般用TimeValue()函数将时间转换成时间值,然后计算。例如:

dt2 = Cells(2, 1)     ‘ 单元格内容:2013-1-1 09:35:08

dt3 = Cells(3, 1)     ‘ 单元格内容:2013-1-1 11:55:18

interval=TimeValue(dt3)-TimeValue(dt2)

TimeValue的值在0-1之间,表示0-24小时,实际上就是当前时间占24小时的比例。利用这个值可以干很多事,例如,用时间值乘以24再取整就是时间从0点开始的小时值,乘以24*60再取整就是时间从0点开始的分钟值,乘以24*60*60就是时间从0点开始的秒值。再比如,以10分钟作为间隔,一天的间隔数就是144,那么任意一个时间值乘以24*6再取整就得到从0点开始这个间隔的数量。

注意:TimeValue的数据类型是Single,如果单元格中只输入时间,也是给Single类型变量赋值。例如:

tt = Cells(2, 1)     ‘ 单元格内容:12:00:00,赋值后tt的值是0.5

我们计算两个时间差,也就是计算两个浮点数之差,比如程序的运行时间,将这个差值乘以24就是时间差以小时为单位,乘以24*60就是以分为单位,乘以24*60*60就是以秒为单位。

时间之间的也可以直接相减,但数据类型必须正确,效果和使用TimeValue函数一样。

4、关于取整

INT(12.56)=12:直接取整数部分,CInt(12.56)=13:小数部分四舍五入;

Ceiling(12.56,1)=13:向上进,只要有小数,整数部分都加1,Ceiling(12.05,1)=13,当然,这个函数功能比较强大,取整只是一个应用;

round(12.56,0)=13:小数部分四舍五入,同样,该函数有两个参数,取整只是一个应用。

5、关于Round函数进行四舍五入

Round函数进行四舍五入并不是逢5就入,例如:round(0.5)=0、 round(1.5)=2 、 round(2.5)=2 、round(3.5)= 4 、round(4.5)=4 ,难到还分奇偶?答案是确实分奇偶,在VBA中Round函数是采用“银行家舍入”,建议大家在VBA中慎重使用Round函数来四舍五入。什么是“银行家舍入”呢,定义如下:

“四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一”。这个四舍五入法是一个国际标准,大部分的编程软件都使用的是这种方法,据说国际上一般都是用这种方法的。

如果在Excel VBA中进行四舍五入处理,也可以直接调用Excel工作表函数,达到直接四舍五入的目的Application.Round(A,B)

===============================

附:DateDiff 函数用法

DateDiff (interval, Date1 , Date2[,firstweekofyear[,firstweekofyear]])  返回一个Variant(long) 的值,表示两个指定日期间的时间间隔数目 interval:设定两个日期之间的期间计算之单位。譬如 >interval="m" 表示计算的单位为月。 >interval 的设定值如: yyyy > Year 年 q Quarter 季 m Month 月 d Day 日 w Weekday 星期 h Hour 时 n Minute 分      

s Second 秒 Date1 ,Date2:计算期间的两个日期表达式,若 >date1 较早,则两个日期之间的期间结果为正值;若 >date2 较早, 则结果为负值。 firstweekofyear:设定每周第一天为星期几, 若未设定表示为星期天。 >FW 的设定值如下: 0 使用 >API 的设定值。 1 星期天 2 星期一 3 星期二 4 星期三 5 星期四 6 星期五 7 星期六 firstweekofyear:设定一年的第一周, 若未设定则表示一月一日那一周为一年的第一周。 >FY 的设定值如下: 0 使用 >API 的设定值。 1 一月一日那一周为一年的第一周 2 至少包括四天的第一周为一年的第一周 3 包括七天的第一周为一年的第一周 示例如下: 计算两个日期的相隔月数.    DiffMonthL = DateDiff("M", DATE_start, DATE_end)

时间: 2025-02-01 03:52:27

[转]【VBA研究】VBA中日期和时间相关的计算的相关文章

【VBA研究】循环中用VBA在单元格中输入公式

作者:iamlaosong 先看一个简单的循环程序,VBA从数据库中读取数据后,需要在最后一个单元格输入求和公式: <span style="font-size:14px;">lineno = [A65536].End(xlUp).Row For i = 3 To lineno Cells(i, 9).FormulaR1C1 = "=RC[-3]+RC[-2]+RC[-1]" Next i </span> 公式的意思相当于Cells(i, 9

VBA在Excel中的应用(三)

目录  Chart Export Chart Format Chart Lengend  Chart Protect  Chart Title  Chart Chart Export 1. 将Excel中的图表导出成gif格式的图片保存到硬盘上 Sub ExportChart()     Dim myChart As Chart     Set myChart = ActiveChart     myChart.Export Filename:="C:\Chart.gif", Filt

【VBA研究】VBA产生不重复随机数

作者:iamlasong VBA编程实现不重复随机数输出.VBA里的随机函数是RND,在工作表中随机函数是RAND,一字之差,可要记好了.RND取值范围是[0,1),意思是0和1之间的一个随机数,包含0,但不包含1. 1.用法 语法:Rnd[(number)] 如果 number 的值是 Randomize 生成 小于 0 ,每次都使用 number 作为随机数种子得到的相同结果. 大于 0 ,以上一个随机数为种子产生下一个随机数. 等于 0 ,产生与最近生成的随机数相同的随机数. 省略, 以上

【VBA研究】VBA通过HTTP协议实现邮件轨迹跟踪查询

作者:iamlasong 1.接口说明 通过互联网訪问,运单跟踪信息查询接口基于HTTP协议开发,接口为RESTFul风格的Web Service,信息交互过程为用户按我方提供的web service地址进行调用,我方接到调用请求后,为用户返回JSON格式组织的数据信息.用户根据约定的接口规范对数据进行解析. 接口调用为HTTP请求的方式,每一次由用户发起的HTTP请求,须要设置验证信息,详细方法是,在HTTP Header部分添加version及authenticate属性,属性值在联调測试之

【VBA研究】VBA做了个简单的试题生成工具

作者:iamlasong 单位对新上岗的员工进行培训,培训结束后,需要进行考试,需要一个简单的考试系统,让新员工既可以自己练习,也可以进行测试,为此,我们做了一个题库,员工可以自己生成一套考题,测试自己的掌握程度,也可以集中起来进行考试,测试培训效果. 系统数据库很简单,主要有两个表,一个是题库,一个是成绩. create table EMSAPP_TEST_QUESTION ( type                  CHAR(1), id                    NUMBE

VBA在Excel中的应用(一):改变符合条件单元格的背景颜色

在使用excel处理数据的时候,为了能更清晰的标示出满足特定条件的单元格,对单元格添加背景色是不错的选择.手工处理的方式简单快捷,但是当遇到大批量数据,就会特别的费时费力,而且不讨好(容易出错).通过代码来处理是个不错的选择,excel可以通过VBA编程来处理内部数据,在打开excel页面后,可以通过“alt + F11”组合键来启动VBA编程界面,跟VB的编程界面和语法一样,需要注意的是如何调用excel的内容.VBA通过sheet, range和cells三个层次来调用excel中的制定区域

excel中vba将excel中数字和图表输出到word中

参考:https://wenku.baidu.com/view/6c60420ecc175527072208af.html 比如将选区变为图片保存到桌面: 1 Sub 将选区转为图片存到桌面() 2 Dim ans As Byte, Pic As String, Paths As String 3 On Error Resume Next 4 Paths = CreateObject("WScript.Shell").SpecialFolders("Desktop"

VBA从字符串中取出数据信息的函数

作者:iamlaosong 一个简单的函数,从包含有数字信息的字符串中取出这个数据,利用VAL函数将字符串转换为数值,该函数或略数字字符串后面的字母和汉字信息,所以,只要把数字前面的字母和汉字信息去掉就行了. '函数,从字符串"ABC123456.78DEF"中取出数据 Function mydata(mystring As String) As Double Dim i, k As Integer i = 1 k = Len(mystring) Do Until Val(Mid(my

Java中日期的总结

#####1.日期 日期:主要使用的是*java.util.Date* 以及*java.sql.Date* , sql中的Date是util中Date的子类,关系如下,但是如果直接转换的话会出现Cast转换错误. - java.lang.Object - java.util.Date - java.sql.Date 之间的转换可以通过如: ```javajava.util.Date utildate=new java.util.Date(System.getCurrentTime());java