【问题标题】:Creating VBA function that converts minutes to hh:mm:ss创建将分钟转换为 hh:mm:ss 的 VBA 函数
【发布时间】:2013-02-05 18:52:41
【问题描述】:

我正在尝试取一个分钟值(例如 3.83 分钟)并将其转换为 hh:mm:ss 时间格式(我知道是 0:03:50)

由于某种原因,从宏记录的 .NumberFormat 无法正常工作并给我一个#VALUE!错误。

    Function MINtoHMS(MIN)
    MIN = MIN / (24 * 60)
    MINtoHMS = MIN
    MINtoHMS.NumberFormat = "[h]:mm:ss;@"
    End Function

【问题讨论】:

    标签: vba excel time-format


    【解决方案1】:

    -编辑-用作插件

    Excel 插件:http://www.filedropper.com/mintohms

    使用以下代码创建一个名为 SheetChangeHandler 的类模块:

    Option Explicit
    
    Private WithEvents App As Application
    
    Private Sub Class_Initialize()
        Set App = Application
    End Sub
    
    Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        On Error GoTo Err
        If InStr(Target.Formula, "=MINtoHMS") Then
            Target.NumberFormat = "hh:mm:ss"
        End If
        On Error GoTo 0
        Exit Sub
    Err:
    End Sub
    

    使用以下代码添加一个模块:

    Option Explicit
    
    Public MySheetHandler As SheetChangeHandler
    
    Sub Auto_Open()
       Set MySheetHandler = New SheetChangeHandler
    End Sub
    
    Function MINtoHMS(MIN)
        MIN = MIN / (24 * 60)
        MINtoHMS = MIN
    End Function
    

    单击文件 > 另存为 > Excel 97-2003 加载项 (*.xla) > 保存

    单击文件 > 选项 > 加载项

    单击管理旁边的“开始...”:Excel 加载项

    选中您刚刚创建的加载项旁边的框

    点击“确定”

    【讨论】:

    • 由于某种原因,函数运行后,单元格中的值被锁定。这意味着当我尝试将值更改为另一种格式时,什么也没有发生。几乎就像输出是文本格式一样。另一个表明它现在是文本格式的迹象是该值在单元格中自动朝向左侧。
    • 这不会改变单元格格式。它所做的只是将数字转换为所需的格式并输出结果。我不明白您为什么在将格式转换为 h:mm:ss 后尝试将其更改为不同的格式。如果这不是我们想要的格式,那为什么还要改成那个格式呢?
    • 由于它没有更改为 hh:mm:ss 格式,而是以具有该语法的文本格式输出,因此我无法让其他单元格与之交互(我在hh:mm:ss 格式)。
    • 将上面的代码添加到您正在使用该函数的工作表中,并更改该函数以输出一个数字,这应该会给您想要的结果。如果您在多个工作表上使用该功能,则可以将其更改为在工作簿中的每个工作表上工作。
    • 是否有在加载项中包含私有子例程,所以它适用于所有工作表?此外,将它放在 ThisWorkbook 对象中时,我无法让它发挥作用。
    【解决方案2】:

    首先,您不能通过公式更改 Excel 单元格的格式。单元格的公式只能分配给单元格(或范围)的值。

    其次,你真的应该在你的函数中声明一些数据类型,这将防止许多神秘的错误和其他奇怪的结果。

    这样的应该没问题:

    Function MINtoHMS(MIN As Double) As Date
        MIN = MIN / (24 * 60)
        MINtoHMS = MIN
    End Function
    

    绝对控制通过函数看到的内容的唯一方法是返回格式化的字符串,正如 Ripster 在他/她的回答中显示的那样。

    【讨论】:

      【解决方案3】:

      试试下面这些方法。

      DAYS = Format(Int([Expr3]/86400), "00") - will correctly display days
      HOURS = Format(Int(([Expr3])/3600) - ((Int([Expr3]*86400)/3600), "00") - DOES NOT CORRECTLY display correct hours
      HOURS = Format(Int([Expr3]/3600),"00") - What will display hours
      MINUTES = Int(([Expr3]-(Int([Expr3]/3600)*3600))/60)
      SECONDS = Format((([Expr3] Mod 60)),"00")
      
      dTotalSeconds = DateDiff("S", Now(), dChristmasDate)
          iDays = Int(dTotalSeconds / 86400)
          iHours = Int((dTotalSeconds Mod 86400) / 3600)
          iMinutes = Int(((dTotalSeconds Mod 86400) Mod 3600) / 60)
          iSeconds = ((dTotalSeconds Mod 86400) Mod 3600) Mod 60
      

      ' 通过使用此功能,您可以将分钟转换为 hh:mm:ss

          Public Function HMStoSec(strHMS As String) As Long
              HMStoSec = Split(strHMS, ":")(0) * 3600 + _
                         Split(strHMS, ":")(1) * 60 + _
                         Split(strHMS, ":")(2)
          End Function
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-18
        • 2015-12-29
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        相关资源
        最近更新 更多