创建将分钟转换为hh:mm:ss的VBA函数

时间:2013-02-20 16:54:44

标签: vba excel-vba time-format excel

我正在尝试取一分钟值(例如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

3 个答案:

答案 0 :(得分:2)

-Edit-用作加载项

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加载项”旁边的“开始...”

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

点击“确定”

答案 1 :(得分:1)

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

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

这样的事应该没问题:

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

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

答案 2 :(得分:0)

尝试以下方法。

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