Visual Basic - YYYYMMDD HH:MM:SS:MS to

时间:2016-10-17 17:12:10

标签: excel vba excel-vba

我有一个Visual Basic脚本来将数据从一个工作表分拣到另一个工作表,唯一的问题是B列包含以下格式的日期和时间:" YYYYMMDD HH:MM:SS:? ?? "如20160901 09:36:18:963

在谷歌和stackoverflow上度过了相当长的一段时间之后,我还没有找到任何可行的解决方案。我希望A,B和C列中的所有数据都在日期之后排序,最长之前在顶部排序,最近一次在底部排序。

然后将A和B列放入图表中,但以后会用到。

总而言之,我需要帮助将我的 YYYYMMDD HH:MM:SS:??? 更改为20160901 09:36:18:963到日期格式(excel似乎没有将其识别为日期)并在日期之后对数据进行排序。

提前感谢!

这是截至目前的脚本:

 Sub tjabo_script()
Dim ArtikelNummer As Variant
Dim NewSheet As Worksheet
Dim RowCount As Long
Dim i As Long, x As Long
Dim check_value As Range
ArtikelNummer = InputBox("Skriv in artikelnummer", "Artikelsortering")
Set NewSheet = Sheets.Add(After:=Sheets(Worksheets.Count), Count:=1, Type:=xlWorksheet)
NewSheet.Name = ArtikelNummer

x = 2 'This is the next empty row on NewSheet.
With Worksheets("Data")
    RowCount = .Cells(.Cells.Rows.Count, "B").End(xlUp).Row
    For i = 1 To RowCount
        If .Cells(i, 2) = Val(ArtikelNummer) Then
            .Cells(i, 2).Columns("D:D").Copy Destination:= _
                NewSheet.Cells(x, 1)
            .Cells(i, 2).Columns("N:N").Copy Destination:= _
                NewSheet.Cells(x, 2)
            .Cells(i, 2).Columns("C:C").Copy Destination:= _
                NewSheet.Cells(x, 3)
            x = x + 1
        End If
    Next i
End With
    Application.Worksheets(ArtikelNummer).Range("A1") = "LagerSaldo"
    Application.Worksheets(ArtikelNummer).Range("B1") = "Datum/Tid"
    Application.Worksheets(ArtikelNummer).Range("C1") = "Antal (+/-)"
End Sub

2 个答案:

答案 0 :(得分:0)

这是我的方法。我假设一个示例时间戳类似于20161017 12:12:12:999您尝试使用日期。

我制作了一个简单的UDF来将字符串更改为Date。从这里获得日期值后,无论如何都可以显示它。

<强>代码

Public Sub Example()
    ActiveSheet.Range("A1").Value = FormatAsDate("20161001 12:12:12:999")
End Sub

Function FormatAsDate(ByVal StrIn As String) As Date
    StrIn = Trim(StrIn)

    FormatAsDate = CDate(Left(StrIn, 4) & "/" & _
                   Mid(StrIn, 5, 2) & "/" & _
                   Mid(StrIn, 7, 2) & _
                   Mid(StrIn, 9, 9))
End Function

<强>输出

enter image description here

答案 1 :(得分:0)

样本数据在 A1 中,如:

enter image description here

如果VBA变量为Dim'edDate,则无法让VBA处理毫秒部分。最好使用Double变量。这是示例代码的片段:

Sub DateEquivalent()
    Dim dD As Double, s As String
    Dim d1 As Double, d2 As Double

    s1 = Range("A1").Text
    Mid(s1, 18, 1) = "."
    ary = Split(s1, " ")

    d1 = CDbl(DateSerial(Left(ary(0), 4), Mid(ary(0), 5, 2), Right(ary(0), 2)))
    s1 = "Timevalue(""" & ary(1) & """)"
    dD = d1 + Evaluate(s1)

    MsgBox d1 & vbCrLf & dD
End Sub

注意我们使用 Mid()将最后一个冒号转换为句点。这是为了使工作表 TIMEVALUE()功能更容易:

enter image description here

下一步是修改此短宏,将每个“伪日期”替换为等效的Double变量。

一旦有Double个变量,排序很简单。