Vba Visual Basic-YYYYMMDD HH:MM:SS:MS到

Vba Visual Basic-YYYYMMDD HH:MM:SS:MS到,vba,excel,Vba,Excel,我有一个Visual Basic脚本可以将数据从一张表整理到另一张表,唯一的问题是B列包含日期和时间,格式为:“YYYYMMDD HH:MM:SS:?”,如20160901 09:36:18:963所示 在谷歌和stackoverflow上花了相当长的时间后,我还没有找到任何有效的解决方案。我希望A、B和C列中的所有数据都在日期之后排序,最长的日期在顶部,最新的日期在底部 然后A列和B列将被放入一个图表中,但这是为了以后 因此,总之,我需要帮助将我的YYYYMMDD HH:MM:SS:?如201

我有一个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

这是我的方法。我假设一个时间戳示例类似于
20161017 12:12:12:999

我制作了一个简单的自定义项,将字符串更改为日期。从这里,一旦你有了日期值,你就可以随心所欲地显示它

代码

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
输出


样本数据位于A1中,如:

如果VBA变量作为
日期
变暗
,则无法让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()函数的使用更加方便:


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

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

你的脚本是什么?你也可以发布一些样本数据吗?(复制/粘贴优先于屏幕截图)。是否尝试将列格式化为日期?在空列中使用此公式<代码>=--替换(替换(替换(B1,7,0,“-”,5,0,“-”,:”,“,”,3)
并向下复制。然后按照您的需要格式化这些新单元格
yyyymmdd hh:mm:ss.000
请阅读帮助页面以了解有关的信息;还有@ScottCraner谢谢!问题是我想在我的vb脚本中使用这个函数。您知道将其“翻译”为visual basic的快速解决方案吗?