Потеря миллисекунд при обработке меток времени в массиве - PullRequest
0 голосов
/ 31 марта 2020

Я хрущу числа с VBA в Excel, используя данные, импортированные из текстового файла. Данные временной метки представлены в форме «дд-ммм-гггг чч: мм: сс.000», а формат чисел установлен на «дд-ммм-гггг чч: мм: сс.000» для всего столбца. После импорта импортированный столбец точно соответствует текстовому файлу (например, 16-Mar-2020 16: 10: 15.175).

В рамках обработки чисел я импортировал столбец в массив вариантов с именем отметка времени:

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

Когда я проверяю данные с точкой останова, они форматируются как дата, но отметка времени не отображается. Он отформатирован как: # 16-Mar-20 16:10:15 # # 1006 *

Затем я вставляю его в лист назначения, который имеет тот же формат номера, что и исходные данные:

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 = "16-Mar-2020 16: 10: 15.000".

Есть ли что-то, что я мог бы заставить при вставке массива обратно на лист назначения?

Заранее спасибо за любую помощь!

1 Ответ

0 голосов
/ 31 марта 2020

Передача дат в / из VBA / рабочего листа иногда бывает непростой задачей. Excel сохраняет даты в виде серийных номеров с 1 = 1-Jan-1900. VBA как явный тип данных Date.

Проще всего было бы заменить оператор присваивания на:

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

Таким образом, вы передаете тип данных типа Double, а не Date.

В качестве альтернативы можно использовать l oop в массиве временных меток, заменяя каждый элемент на 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

enter image description here

...