【问题标题】:Rounding Date and Time in VBAVBA 中的舍入日期和时间
【发布时间】: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


    【解决方案1】:

    取出分钟,将日期部分放在底部以消除时间,然后通过使用 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)
    

    【讨论】:

      【解决方案2】:

      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))
      • 如果你想编写一个真正的程序而不是使用宏的单页界面,VBA 是必需的。您可以移植 vba,但不能移植工作表公式。您可以跟踪和调试 vba。不幸的是,Excel 处理日期/时间的方式很糟糕。我还没有开发出一种简单的方法来进行 one-kine 转换 aa 和舍入。
      【解决方案3】:

      其他答案的简短版本

      =MRound(A6, 1/96)
      

      在VBA中可以是

      [a6] = [MRound(A6, 1/96)]
      

      或向下舍入

      [a6] = [Int(A6*96)/96]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 2023-04-04
        • 2013-04-09
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        相关资源
        最近更新 更多