【发布时间】:2016-08-25 21:38:42
【问题描述】:
如何使用 VBA 在 Excel 中四舍五入日期和时间?
例如,用户从复制到单元格 A6 中的日历中选择值 = "08/25/2016 09:02:00"
我以 15 分钟的间隔提取数据,所以我希望它是 A6 = "08/25/2016 09:00:00"
因此,如果用户选择的任何日期和时间不是 15 分钟的倍数,它应该回到之前的 15 分钟间隔值并拉取数据。
【问题讨论】:
如何使用 VBA 在 Excel 中四舍五入日期和时间?
例如,用户从复制到单元格 A6 中的日历中选择值 = "08/25/2016 09:02:00"
我以 15 分钟的间隔提取数据,所以我希望它是 A6 = "08/25/2016 09:00:00"
因此,如果用户选择的任何日期和时间不是 15 分钟的倍数,它应该回到之前的 15 分钟间隔值并拉取数据。
【问题讨论】:
取出分钟,将日期部分放在底部以消除时间,然后通过使用 TimeSerial 构建它来添加它:
Private Sub Example()
Dim foo As Date
foo = CDate("08/25/2016 09:02:00")
Dim minutes As Long
minutes = Minute(foo)
minutes = 15 * (minutes \ 15) 'Round down by 15 minute increments
foo = Int(foo) + TimeSerial(Hour(foo), minutes, 0)
Debug.Print foo
End Sub
编辑:就像@Pekka 提到的那样,这也可以通过工作表公式来完成 - 这相当于上面的代码 VBA:
=INT(A6)+TIME(HOUR(A6),INT(MINUTE(A6) / 15) * 15, 0)
【讨论】:
VBA 不是必需的。这可以直接在 Excel 中完成。 =FLOOR(A6,TIME(0,15,0)) 会将日期时间值截断为前 15 分钟的值。
Excel 将日期值表示为自初始日期(大约 1900 年,取决于版本)以来的浮点值,时间作为值的小数部分。
当然,您可以以相同的方式在 VBA 代码中使用相同的表达式。
作为Jeeped cmets,与最初建议的更直接的表达=int(A6*24*4)/4/24相比,这是一个更自文档化的替代方案。
【讨论】:
=FLOOR(A6,TIME(0,15,0))
其他答案的简短版本
=MRound(A6, 1/96)
在VBA中可以是
[a6] = [MRound(A6, 1/96)]
或向下舍入
[a6] = [Int(A6*96)/96]
【讨论】: