处理数组中的时间戳时丢失毫秒
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
我正在使用从文本文件导入的数据在 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