Текст в столбец (дата) с использованием текущего года вместо отметки времени - PullRequest
0 голосов
/ 15 января 2020

Я использую текст в столбцы как часть макроса VBA для разделения временных меток на 2 других столбца. Когда я форматирую столбец B в дд / мм / гггг, он использует текущий 2020 год вместо 2019. Есть ли способ настроить мой макрос так, чтобы он вытягивал год из исходной отметки времени или, альтернативно, вытащил год из столбца C один раз? Текст в столбцы завершено?

Reference1

Reference2

Range("A5").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.TextToColumns Destination:=Range("A5"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 3), Array(2, 3), Array(3, 3)), TrailingMinusNumbers:=True
    Range("B5").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.NumberFormat = "dd/mm/yyyy;@"
    Selection.TextToColumns Destination:=Range("B5"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 8), TrailingMinusNumbers:=True

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Используются массивы:

Sub mydatesplit()
    With ActiveSheet
        Dim arr As Variant
        arr = .Range("A5", .Cells(.Rows.Count, 1).End(xlUp)).Value

        Dim outArr() As Variant
        ReDim outArr(1 To UBound(arr, 1), 1 To 3)

        Dim i As Long
        For i = 1 To UBound(arr, 1)
            Dim spltStr() As String
            spltStr = Split(Replace(arr(i, 1), ",", ""), " ")
            If UBound(spltStr) >= 5 Then
                outArr(i, 1) = spltStr(0)
                outArr(i, 2) = DateValue(spltStr(2) & " " & spltStr(1) & " " & spltStr(3))
                outArr(i, 3) = TimeValue(spltStr(4) & " " & spltStr(5))
            End If
        Next i

        .Range("B5").Resize(UBound(outArr, 1), UBound(outArr, 2)).Value = outArr
    End With
End Sub

После запуска:

enter image description here


BTW с Dynami c Array Формулы, недавно введенные в Excel с последней подпиской, можно использовать довольно простую формулу:

Дата:

=--TEXTJOIN(" ",TRUE,INDEX(TRIM(MID(SUBSTITUTE(SUBSTITUTE(A5,",","")," ",REPT(" ",999)),(ROW($1:$7)-1)*999+1,999)),{3,2,4}))

Время

=--TEXTJOIN(" ",TRUE,INDEX(TRIM(MID(SUBSTITUTE(SUBSTITUTE(A5,",","")," ",REPT(" ",999)),(ROW($1:$7)-1)*999+1,999)),{5,6}))
0 голосов
/ 15 января 2020

Основываясь на данных на скриншоте, вы можете использовать следующую функцию для разделения метки времени.

 Function convertTimestamp(ByVal inp As String) As Variant

    Dim sDate As String, sTime As String, sTimezone As String, sDay As String
    Dim v As Variant

    v = Split(Replace(inp, ",", ""), " ")
    sDate = DateValue(v(2) & " " & v(1) & " " & v(3))

    sTime = TimeValue(v(4) & " " & v(5))
    sTimezone = v(6)
    sDay = v(0)

    ReDim v(1 To 4)
    v(1) = sDay
    v(2) = CDate(sDate)
    v(3) = sTime
    v(4) = sTimezone

    convertTimestamp = v

End Function

PS. Настроил функцию на основе превосходного подхода Скотта для разделения строки.

Либо вы используйте эту функцию в самом рабочем листе (как функцию массива!) или используйте следующий код, чтобы разделить строки с 5 по 8, как на скриншоте

Sub TimeStampToCol()

    Dim rg As Range
    Set rg = Range("A5:A8")

    Dim vDat As Variant
    vDat = WorksheetFunction.Transpose(rg)

    Dim rDat As Variant
    ReDim rDat(1 To 4, 1 To 4)

    Dim i As Long, v As Variant, j As Long
    For i = LBound(vDat) To UBound(vDat)
        v = convertTimestamp(vDat(i))
        For j = 1 To 4
            rDat(i, j) = v(j)
        Next j
    Next i

    Set rg = Range("B5:E8")
    rg.Value = rDat

End Sub

Использование в качестве формулы массива enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...