【问题标题】:Losing milliseconds when processing timestamps in array处理数组中的时间戳时丢失毫秒
【发布时间】:2020-03-31 00:28:32
【问题描述】:

我正在使用从文本文件导入的数据在 Excel 中使用 VBA 处理数字。时间戳数据的格式为“dd-mmm-yyyy hh:mm:ss.000”,整列的数字格式设置为“dd-mmm-yyyy hh:mm:ss.000”。导入后,导入的列与文本文件完全匹配(例如,16-Mar-2020 16:10:15.175)。

作为数字运算的一部分,我将导入的列读入一个名为 timestamp 的变体数组:

Dim timestamp As Variant
timestamp = Range(.Cells(1, Timestamp_Column), .Cells(NumRows, Timestamp_Column))

当我使用断点检查数据时,它被格式化为日期,但没有可见的时间戳。格式为:#16-Mar-20 4:10:15 PM#

然后我将其粘贴到与原始数据具有相同数字格式的目标工作表中:

Private Function FillColumnData(theArray As Variant, transpose As Boolean, _
  sheetname As String, destCol As Integer) As Variant

Dim destColRange As Range
Dim tempArray as Variant
Dim maxrow As Long

maxrow = NumRows()

' Transpose the array?
If (transpose) Then
    tempArray = TransposeArray(theArray) ' Transpose the array
Else
    tempArray = theArray ' The timestamp array is not transposed
End If

With Sheets(sheetname)
    Set destColRange = .Columns(destCol)
    Set destColRange = destColRange.resize(maxrow, 1)
    destColRange.value = tempArray
End With

生成的列是完整的并且与原始列数据匹配,除了所有毫秒值都是 0:例如 original = "16-Mar-2020 16:10:15.175";复制 =“2020 年 3 月 16 日 16:10:15.000”。

将数组粘贴回目标工作表时我可以强制执行什么操作吗?

提前感谢您的帮助!

【问题讨论】:

    标签: arrays excel vba datetime milliseconds


    【解决方案1】:

    向/从 VBA/工作表传递日期有时很棘手。 Excel 将日期存储为序列号,1 = 1-Jan-1900。 VBA 作为显式日期数据类型。

    最简单的方法是将您的赋值语句替换为:

    timestamp = Range(.Cells(1, Timestamp_Column), .Cells(NumRows, Timestamp_Column)).Value2
    

    这样您传递的是 Double 而不是 Date 数据类型。

    另一种方法是遍历您的时间戳数组,将每个元素替换为 CDbl(timestamp(x,y)),但直接使用 Value2 属性访问该值似乎更有效。

    这将提供未格式化的值并包括毫秒

    概念验证代码

    Option Explicit
    
    Sub dtStuff()
        Dim R As Range: Set R = Range("A1:a2")
        Dim v, w
        v = R
        w = R.Value2
    
        With R.Offset(0, 1)
            .NumberFormat = R.NumberFormat
            .Value = v
        End With
    
        With R.Offset(0, 2)
            .NumberFormat = R.NumberFormat
            .Value = w
        End With
    
    End Sub
    

    【讨论】:

    • 好极了,这和宣传的一样。我现在有一个后续问题,因为这仅解决了我的一半问题(存储数据)。我想在用户表单中显示时间戳。具体来说,我想在标签控件中显示开始时间和停止时间:
    • ``` .lStartTime.Caption = Format([ChartsStartTime], "dd-mmm-yyyy hh:mm:ss.000")。 ``` ChartsStartTime 是一个命名范围,结果是毫秒始终显示“.000”。这与用于存储时间戳数据的列的格式相同。对于表单是否有不同的方法?
    • 我在另一篇文章中找到了答案,它解释了 Format() 不处理毫秒:Dim dateDbl as Double, dateStr as String dateDbl = CDbl([ChartsStartTime]) dateStr = Application.Text( dateDbl, "dd-mmm-yyyy hh:mm:ss.000")
    • @AlG 在我的脑海中,我不确定作为 VBA 格式函数的参数的格式是否能满足您的要求。请改用WorksheetFunction.Text([ChartsStartTime], "dd-mmm-yyyy hh:mm:ss.000")。如果这不起作用,建议您提出一个新问题。
    • @AlG 看起来我们的帖子交叉了。但是,如果您使用的是工作表功能,则不需要进行所有这些日期-双字符串转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多