如何按时间顺序排列vba

我试图按照时间顺序对给定的范围进行sorting,而不是按A列中的值按升序sorting

下面的代码检查从B到Z的列中的任何值是否改变,并将date和时间放在列A中的相应单元格行中。

这个macros的目标是把最后编辑的行放在表格的底部。

在这里输入图像说明

Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim Cel As Range Dim m As Long Dim DataRange As Range Dim keyRange As Range Set DataRange = Range("A2:Z1048567") Set keyRange = Range("A2") Application.ScreenUpdating = False For Each Cel In Target If Not Intersect(Target, Cel) Is Nothing And Cel.Column > 1 And Cel.Column <= 26 Then m = Cel.Row With ActiveSheet.Range("A" & m) .Value = Date & " " & Time .NumberFormat = "dd/mm/yyyy hh:mm AM/PM " End With DataRange.Sort Key1:=keyRange, Order1:=xlAscending Application.ScreenUpdating = True Exit Sub End If Next Cel Application.ScreenUpdating = True End Sub 

除非你强制左边单元格alignment,否则列A中的date时间实际上是“文本 – 看起来像一个date时间”。 最重要的是,它们处于DMYconfiguration中,无论计算机的区域系统设置是为date设置的,VBA都非常以美国为中心(即MDY)。

您可以使用像CDate这样的转换程序,但结果不可靠。 在明确的date如18/01/2016 10:08:52 AM ,转换将是正确的。 然而,如果你有一个模糊的date时间像06/01/2016 10:08:52 AM CDate转换将最有可能返回01-Jun-2016 10:08:52而不是'正确01-Jun-2016 10:08:52 06-Jan-2016 10:08:52 。 时间需要拆分成一个未使用的列,然后再结合到修复的date。

使用Range.TextToColumns方法命令,并使用xlColumnDataType强制进行正确的DMYdate转换。

首先select所有date,对现有数据运行此例程。 请勿包含列标题标签,因为这比date的第一个分割点长。 首先selectA2然后点击Ctrl + Shift + 应该做的很好。

 Sub repair_Dates_by_Selection() Dim dt As Range With Intersect(Selection, Selection.Parent.UsedRange) .Columns(1).Offset(0, 1).EntireColumn.Insert .TextToColumns Destination:=.Cells(1), DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 4), Array(10, 1)) For Each dt In .Cells dt = dt.Value2 + dt.Offset(0, 1).Value2 Next dt .Columns(1).Offset(0, 1).EntireColumn.Delete .NumberFormat = "dd/mm/yyyy hh:mm AM/PM" End With End Sub 

一旦完成,列A中的date时间应该是以DMYconfiguration格式化的实时date。

Worksheet_Change

 Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Columns("B:Z")) Is Nothing Then On Error GoTo bm_Safe_Exit Application.EnableEvents = False Application.ScreenUpdating = False Dim cel As Range For Each cel In Intersect(Target, Columns("B:Z")) With cel Debug.Print "!" & cel.Address If .Row > 1 Then Intersect(Columns(1), cel.EntireRow).Value = Now .NumberFormat = "dd/mm/yyyy hh:mm AM/PM_);@" End If End With Next cel With Cells(1, 1).CurrentRegion .Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _ Orientation:=xlTopToBottom, Header:=xlYes End With End If bm_Safe_Exit: Application.EnableEvents = True Application.ScreenUpdating = True End Sub 

以上添加事件禁用/启用您的原始代码。 Intersect方法用于确定适用的单元格。 Now用于为时间戳创build真正的date时间,而不是文本 – 看起来是一个date时间。 前者可以按时间顺序sorting,后者最多是不可靠的。