我可以获得VBA等效的DateTime.Now.Ticks吗?

时间:2017-06-19 20:00:34

标签: vba excel-vba excel

在.NET中的VB中,我可以使用DateTime.Now.Ticks.ToString("x")为多部分表单边界准备字符串,例如8d4b7556f42792c

我正试图在Excel中的VBA中获得同样的东西。

在Excel VBA中,我可以使用DateTime.Now来获取格式:19/06/2017 20:54

但这并不是很有用,我需要将其转换为刻度线串然后转换为十六进制。到目前为止,我发现HEX(DateTime.Now)只给了我一个像A79A这样的四个字符串返回,这不是我需要的。

我可以从DateTime.Now得到嘀嗒声吗?!

编辑:我刚刚发现了这个技巧来获得某种Tick Count:

Private Declare Function GetTickCount Lib "kernel32" () As Long
MsgBox (GetTickCount())

这给了我一个负面的左右......这可能对我需要的东西有用,但它现在是TickCount吗?

1 个答案:

答案 0 :(得分:3)

Excel无关紧要,DateTime是来自VBA标准库的模块,无论主机是什么,它都会在任何VBA项目中被引用。

VBA中的Date基本上是Double,其中整数部分是自1899年12月30日以来的天数:

?CDate(1)
12/31/1899

小数部分表示该值的时间部分,即1小时为1/24,1分钟为1/60,1秒为1/60,1毫秒将是1/1000 ......

在使用之前,您应该在MSDN上阅读GetTickCount

  

经过的时间存储为DWORD值。因此,如果系统连续运行49.7天,时间将回绕到零。要避免此问题,请使用GetTickCount64函数。否则,在比较时间时检查溢出情况。

如果你得到一个负滴答计数,这意味着你的系统已经运行了很长一段时间并溢出了DWORD大小,32位(即2 31 - 1,或2,147,483,647)

而不是使用GetTickCount并使用或多或少无意义的" ticks" (相对于系统正常运行时间[并且仅精确到~15ms]),为什么不使用实际系统时间并获得实际的毫秒数?

定义SYSTEMTIME结构:

Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

声明GetSystemTime程序:

Private Declare Sub GetSystemTime Lib "Kernel32" (ByRef lpSystemTime As SYSTEMTIME)

通过引用传递SYSTEMTIME值来调用它:

Public Sub Test()
    Dim t As SYSTEMTIME
    GetSystemTime t
    Debug.Print t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond, t.wMilliseconds
End Sub

检索到的值将是UTC时间,因此如果您需要本地时间,请应用适当的偏移量。