处理数组中的时间戳时丢失毫秒

Losing milliseconds when processing timestamps in array

我正在使用从文本文件导入的数据在 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#

然后我将其粘贴到目的地 sheet,该目的地具有与原始数据指定的相同数字格式:

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"; copy = "2020 年 3 月 16 日 16:10:15.000".

将数组粘贴回目标位置时我可以强制执行某些操作吗sheet?

在此先感谢您的帮助!

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

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

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

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

另一种方法是遍历时间戳数组,用 CDbl(timestamp(x,y)) 替换每个元素,但使用 Value2 [= 直接访问该值似乎更有效39=].

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

概念验证代码

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