我有一个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
答案 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
<强>输出强>
答案 1 :(得分:0)
样本数据在 A1 中,如:
如果VBA变量为Dim'ed
为Date
,则无法让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
个变量,排序很简单。